/** * @license * Copyright 2010-2021 Three.js Authors * SPDX-License-Identifier: MIT */ !(function (t, e) { 'object' == typeof exports && 'undefined' != typeof module ? e(exports) : 'function' == typeof define && define.amd ? define(['exports'], e) : e( ((t = 'undefined' != typeof globalThis ? globalThis : t || self).THREE = {}) ); })(this, function (t) { 'use strict'; const e = '128', n = 100, i = 300, r = 301, s = 302, a = 303, o = 304, l = 306, c = 307, h = 1e3, u = 1001, d = 1002, p = 1003, m = 1004, f = 1005, g = 1006, v = 1007, y = 1008, x = 1009, _ = 1012, w = 1014, b = 1015, M = 1016, S = 1020, T = 1022, E = 1023, A = 1026, L = 1027, R = 33776, C = 33777, P = 33778, D = 33779, I = 35840, N = 35841, B = 35842, z = 35843, F = 37492, O = 37496, H = 2300, G = 2301, U = 2302, k = 2400, V = 2401, W = 2402, j = 2500, q = 2501, X = 3e3, Y = 3001, Z = 3007, J = 3002, Q = 3004, K = 3005, $ = 3006, tt = 7680, et = 35044, nt = 35048, it = '300 es'; class rt { addEventListener(t, e) { void 0 === this._listeners && (this._listeners = {}); const n = this._listeners; void 0 === n[t] && (n[t] = []), -1 === n[t].indexOf(e) && n[t].push(e); } hasEventListener(t, e) { if (void 0 === this._listeners) return !1; const n = this._listeners; return void 0 !== n[t] && -1 !== n[t].indexOf(e); } removeEventListener(t, e) { if (void 0 === this._listeners) return; const n = this._listeners[t]; if (void 0 !== n) { const t = n.indexOf(e); -1 !== t && n.splice(t, 1); } } dispatchEvent(t) { if (void 0 === this._listeners) return; const e = this._listeners[t.type]; if (void 0 !== e) { t.target = this; const n = e.slice(0); for (let e = 0, i = n.length; e < i; e++) n[e].call(this, t); t.target = null; } } } const st = []; for (let t = 0; t < 256; t++) st[t] = (t < 16 ? '0' : '') + t.toString(16); let at = 1234567; const ot = Math.PI / 180, lt = 180 / Math.PI; function ct() { const t = (4294967295 * Math.random()) | 0, e = (4294967295 * Math.random()) | 0, n = (4294967295 * Math.random()) | 0, i = (4294967295 * Math.random()) | 0; return ( st[255 & t] + st[(t >> 8) & 255] + st[(t >> 16) & 255] + st[(t >> 24) & 255] + '-' + st[255 & e] + st[(e >> 8) & 255] + '-' + st[((e >> 16) & 15) | 64] + st[(e >> 24) & 255] + '-' + st[(63 & n) | 128] + st[(n >> 8) & 255] + '-' + st[(n >> 16) & 255] + st[(n >> 24) & 255] + st[255 & i] + st[(i >> 8) & 255] + st[(i >> 16) & 255] + st[(i >> 24) & 255] ).toUpperCase(); } function ht(t, e, n) { return Math.max(e, Math.min(n, t)); } function ut(t, e) { return ((t % e) + e) % e; } function dt(t, e, n) { return (1 - n) * t + n * e; } function pt(t) { return 0 == (t & (t - 1)) && 0 !== t; } function mt(t) { return Math.pow(2, Math.ceil(Math.log(t) / Math.LN2)); } function ft(t) { return Math.pow(2, Math.floor(Math.log(t) / Math.LN2)); } var gt = Object.freeze({ __proto__: null, DEG2RAD: ot, RAD2DEG: lt, generateUUID: ct, clamp: ht, euclideanModulo: ut, mapLinear: function (t, e, n, i, r) { return i + ((t - e) * (r - i)) / (n - e); }, inverseLerp: function (t, e, n) { return t !== e ? (n - t) / (e - t) : 0; }, lerp: dt, damp: function (t, e, n, i) { return dt(t, e, 1 - Math.exp(-n * i)); }, pingpong: function (t, e = 1) { return e - Math.abs(ut(t, 2 * e) - e); }, smoothstep: function (t, e, n) { return t <= e ? 0 : t >= n ? 1 : (t = (t - e) / (n - e)) * t * (3 - 2 * t); }, smootherstep: function (t, e, n) { return t <= e ? 0 : t >= n ? 1 : (t = (t - e) / (n - e)) * t * t * (t * (6 * t - 15) + 10); }, randInt: function (t, e) { return t + Math.floor(Math.random() * (e - t + 1)); }, randFloat: function (t, e) { return t + Math.random() * (e - t); }, randFloatSpread: function (t) { return t * (0.5 - Math.random()); }, seededRandom: function (t) { return ( void 0 !== t && (at = t % 2147483647), (at = (16807 * at) % 2147483647), (at - 1) / 2147483646 ); }, degToRad: function (t) { return t * ot; }, radToDeg: function (t) { return t * lt; }, isPowerOfTwo: pt, ceilPowerOfTwo: mt, floorPowerOfTwo: ft, setQuaternionFromProperEuler: function (t, e, n, i, r) { const s = Math.cos, a = Math.sin, o = s(n / 2), l = a(n / 2), c = s((e + i) / 2), h = a((e + i) / 2), u = s((e - i) / 2), d = a((e - i) / 2), p = s((i - e) / 2), m = a((i - e) / 2); switch (r) { case 'XYX': t.set(o * h, l * u, l * d, o * c); break; case 'YZY': t.set(l * d, o * h, l * u, o * c); break; case 'ZXZ': t.set(l * u, l * d, o * h, o * c); break; case 'XZX': t.set(o * h, l * m, l * p, o * c); break; case 'YXY': t.set(l * p, o * h, l * m, o * c); break; case 'ZYZ': t.set(l * m, l * p, o * h, o * c); break; default: console.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + r ); } }, }); class vt { constructor(t = 0, e = 0) { (this.x = t), (this.y = e); } get width() { return this.x; } set width(t) { this.x = t; } get height() { return this.y; } set height(t) { this.y = t; } set(t, e) { return (this.x = t), (this.y = e), this; } setScalar(t) { return (this.x = t), (this.y = t), this; } setX(t) { return (this.x = t), this; } setY(t) { return (this.y = t), this; } setComponent(t, e) { switch (t) { case 0: this.x = e; break; case 1: this.y = e; break; default: throw new Error('index is out of range: ' + t); } return this; } getComponent(t) { switch (t) { case 0: return this.x; case 1: return this.y; default: throw new Error('index is out of range: ' + t); } } clone() { return new this.constructor(this.x, this.y); } copy(t) { return (this.x = t.x), (this.y = t.y), this; } add(t, e) { return void 0 !== e ? (console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ), this.addVectors(t, e)) : ((this.x += t.x), (this.y += t.y), this); } addScalar(t) { return (this.x += t), (this.y += t), this; } addVectors(t, e) { return (this.x = t.x + e.x), (this.y = t.y + e.y), this; } addScaledVector(t, e) { return (this.x += t.x * e), (this.y += t.y * e), this; } sub(t, e) { return void 0 !== e ? (console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ), this.subVectors(t, e)) : ((this.x -= t.x), (this.y -= t.y), this); } subScalar(t) { return (this.x -= t), (this.y -= t), this; } subVectors(t, e) { return (this.x = t.x - e.x), (this.y = t.y - e.y), this; } multiply(t) { return (this.x *= t.x), (this.y *= t.y), this; } multiplyScalar(t) { return (this.x *= t), (this.y *= t), this; } divide(t) { return (this.x /= t.x), (this.y /= t.y), this; } divideScalar(t) { return this.multiplyScalar(1 / t); } applyMatrix3(t) { const e = this.x, n = this.y, i = t.elements; return ( (this.x = i[0] * e + i[3] * n + i[6]), (this.y = i[1] * e + i[4] * n + i[7]), this ); } min(t) { return ( (this.x = Math.min(this.x, t.x)), (this.y = Math.min(this.y, t.y)), this ); } max(t) { return ( (this.x = Math.max(this.x, t.x)), (this.y = Math.max(this.y, t.y)), this ); } clamp(t, e) { return ( (this.x = Math.max(t.x, Math.min(e.x, this.x))), (this.y = Math.max(t.y, Math.min(e.y, this.y))), this ); } clampScalar(t, e) { return ( (this.x = Math.max(t, Math.min(e, this.x))), (this.y = Math.max(t, Math.min(e, this.y))), this ); } clampLength(t, e) { const n = this.length(); return this.divideScalar(n || 1).multiplyScalar( Math.max(t, Math.min(e, n)) ); } floor() { return (this.x = Math.floor(this.x)), (this.y = Math.floor(this.y)), this; } ceil() { return (this.x = Math.ceil(this.x)), (this.y = Math.ceil(this.y)), this; } round() { return (this.x = Math.round(this.x)), (this.y = Math.round(this.y)), this; } roundToZero() { return ( (this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x)), (this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y)), this ); } negate() { return (this.x = -this.x), (this.y = -this.y), this; } dot(t) { return this.x * t.x + this.y * t.y; } cross(t) { return this.x * t.y - this.y * t.x; } lengthSq() { return this.x * this.x + this.y * this.y; } length() { return Math.sqrt(this.x * this.x + this.y * this.y); } manhattanLength() { return Math.abs(this.x) + Math.abs(this.y); } normalize() { return this.divideScalar(this.length() || 1); } angle() { return Math.atan2(-this.y, -this.x) + Math.PI; } distanceTo(t) { return Math.sqrt(this.distanceToSquared(t)); } distanceToSquared(t) { const e = this.x - t.x, n = this.y - t.y; return e * e + n * n; } manhattanDistanceTo(t) { return Math.abs(this.x - t.x) + Math.abs(this.y - t.y); } setLength(t) { return this.normalize().multiplyScalar(t); } lerp(t, e) { return ( (this.x += (t.x - this.x) * e), (this.y += (t.y - this.y) * e), this ); } lerpVectors(t, e, n) { return ( (this.x = t.x + (e.x - t.x) * n), (this.y = t.y + (e.y - t.y) * n), this ); } equals(t) { return t.x === this.x && t.y === this.y; } fromArray(t, e = 0) { return (this.x = t[e]), (this.y = t[e + 1]), this; } toArray(t = [], e = 0) { return (t[e] = this.x), (t[e + 1] = this.y), t; } fromBufferAttribute(t, e, n) { return ( void 0 !== n && console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ), (this.x = t.getX(e)), (this.y = t.getY(e)), this ); } rotateAround(t, e) { const n = Math.cos(e), i = Math.sin(e), r = this.x - t.x, s = this.y - t.y; return ( (this.x = r * n - s * i + t.x), (this.y = r * i + s * n + t.y), this ); } random() { return (this.x = Math.random()), (this.y = Math.random()), this; } } vt.prototype.isVector2 = !0; class yt { constructor() { (this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1]), arguments.length > 0 && console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); } set(t, e, n, i, r, s, a, o, l) { const c = this.elements; return ( (c[0] = t), (c[1] = i), (c[2] = a), (c[3] = e), (c[4] = r), (c[5] = o), (c[6] = n), (c[7] = s), (c[8] = l), this ); } identity() { return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1), this; } copy(t) { const e = this.elements, n = t.elements; return ( (e[0] = n[0]), (e[1] = n[1]), (e[2] = n[2]), (e[3] = n[3]), (e[4] = n[4]), (e[5] = n[5]), (e[6] = n[6]), (e[7] = n[7]), (e[8] = n[8]), this ); } extractBasis(t, e, n) { return ( t.setFromMatrix3Column(this, 0), e.setFromMatrix3Column(this, 1), n.setFromMatrix3Column(this, 2), this ); } setFromMatrix4(t) { const e = t.elements; return ( this.set(e[0], e[4], e[8], e[1], e[5], e[9], e[2], e[6], e[10]), this ); } multiply(t) { return this.multiplyMatrices(this, t); } premultiply(t) { return this.multiplyMatrices(t, this); } multiplyMatrices(t, e) { const n = t.elements, i = e.elements, r = this.elements, s = n[0], a = n[3], o = n[6], l = n[1], c = n[4], h = n[7], u = n[2], d = n[5], p = n[8], m = i[0], f = i[3], g = i[6], v = i[1], y = i[4], x = i[7], _ = i[2], w = i[5], b = i[8]; return ( (r[0] = s * m + a * v + o * _), (r[3] = s * f + a * y + o * w), (r[6] = s * g + a * x + o * b), (r[1] = l * m + c * v + h * _), (r[4] = l * f + c * y + h * w), (r[7] = l * g + c * x + h * b), (r[2] = u * m + d * v + p * _), (r[5] = u * f + d * y + p * w), (r[8] = u * g + d * x + p * b), this ); } multiplyScalar(t) { const e = this.elements; return ( (e[0] *= t), (e[3] *= t), (e[6] *= t), (e[1] *= t), (e[4] *= t), (e[7] *= t), (e[2] *= t), (e[5] *= t), (e[8] *= t), this ); } determinant() { const t = this.elements, e = t[0], n = t[1], i = t[2], r = t[3], s = t[4], a = t[5], o = t[6], l = t[7], c = t[8]; return ( e * s * c - e * a * l - n * r * c + n * a * o + i * r * l - i * s * o ); } invert() { const t = this.elements, e = t[0], n = t[1], i = t[2], r = t[3], s = t[4], a = t[5], o = t[6], l = t[7], c = t[8], h = c * s - a * l, u = a * o - c * r, d = l * r - s * o, p = e * h + n * u + i * d; if (0 === p) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); const m = 1 / p; return ( (t[0] = h * m), (t[1] = (i * l - c * n) * m), (t[2] = (a * n - i * s) * m), (t[3] = u * m), (t[4] = (c * e - i * o) * m), (t[5] = (i * r - a * e) * m), (t[6] = d * m), (t[7] = (n * o - l * e) * m), (t[8] = (s * e - n * r) * m), this ); } transpose() { let t; const e = this.elements; return ( (t = e[1]), (e[1] = e[3]), (e[3] = t), (t = e[2]), (e[2] = e[6]), (e[6] = t), (t = e[5]), (e[5] = e[7]), (e[7] = t), this ); } getNormalMatrix(t) { return this.setFromMatrix4(t).invert().transpose(); } transposeIntoArray(t) { const e = this.elements; return ( (t[0] = e[0]), (t[1] = e[3]), (t[2] = e[6]), (t[3] = e[1]), (t[4] = e[4]), (t[5] = e[7]), (t[6] = e[2]), (t[7] = e[5]), (t[8] = e[8]), this ); } setUvTransform(t, e, n, i, r, s, a) { const o = Math.cos(r), l = Math.sin(r); return ( this.set( n * o, n * l, -n * (o * s + l * a) + s + t, -i * l, i * o, -i * (-l * s + o * a) + a + e, 0, 0, 1 ), this ); } scale(t, e) { const n = this.elements; return ( (n[0] *= t), (n[3] *= t), (n[6] *= t), (n[1] *= e), (n[4] *= e), (n[7] *= e), this ); } rotate(t) { const e = Math.cos(t), n = Math.sin(t), i = this.elements, r = i[0], s = i[3], a = i[6], o = i[1], l = i[4], c = i[7]; return ( (i[0] = e * r + n * o), (i[3] = e * s + n * l), (i[6] = e * a + n * c), (i[1] = -n * r + e * o), (i[4] = -n * s + e * l), (i[7] = -n * a + e * c), this ); } translate(t, e) { const n = this.elements; return ( (n[0] += t * n[2]), (n[3] += t * n[5]), (n[6] += t * n[8]), (n[1] += e * n[2]), (n[4] += e * n[5]), (n[7] += e * n[8]), this ); } equals(t) { const e = this.elements, n = t.elements; for (let t = 0; t < 9; t++) if (e[t] !== n[t]) return !1; return !0; } fromArray(t, e = 0) { for (let n = 0; n < 9; n++) this.elements[n] = t[n + e]; return this; } toArray(t = [], e = 0) { const n = this.elements; return ( (t[e] = n[0]), (t[e + 1] = n[1]), (t[e + 2] = n[2]), (t[e + 3] = n[3]), (t[e + 4] = n[4]), (t[e + 5] = n[5]), (t[e + 6] = n[6]), (t[e + 7] = n[7]), (t[e + 8] = n[8]), t ); } clone() { return new this.constructor().fromArray(this.elements); } } let xt; yt.prototype.isMatrix3 = !0; class _t { static getDataURL(t) { if (/^data:/i.test(t.src)) return t.src; if ('undefined' == typeof HTMLCanvasElement) return t.src; let e; if (t instanceof HTMLCanvasElement) e = t; else { void 0 === xt && (xt = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' )), (xt.width = t.width), (xt.height = t.height); const n = xt.getContext('2d'); t instanceof ImageData ? n.putImageData(t, 0, 0) : n.drawImage(t, 0, 0, t.width, t.height), (e = xt); } return e.width > 2048 || e.height > 2048 ? (console.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', t ), e.toDataURL('image/jpeg', 0.6)) : e.toDataURL('image/png'); } } let wt = 0; class bt extends rt { constructor( t = bt.DEFAULT_IMAGE, e = bt.DEFAULT_MAPPING, n = 1001, i = 1001, r = 1006, s = 1008, a = 1023, o = 1009, l = 1, c = 3e3 ) { super(), Object.defineProperty(this, 'id', { value: wt++ }), (this.uuid = ct()), (this.name = ''), (this.image = t), (this.mipmaps = []), (this.mapping = e), (this.wrapS = n), (this.wrapT = i), (this.magFilter = r), (this.minFilter = s), (this.anisotropy = l), (this.format = a), (this.internalFormat = null), (this.type = o), (this.offset = new vt(0, 0)), (this.repeat = new vt(1, 1)), (this.center = new vt(0, 0)), (this.rotation = 0), (this.matrixAutoUpdate = !0), (this.matrix = new yt()), (this.generateMipmaps = !0), (this.premultiplyAlpha = !1), (this.flipY = !0), (this.unpackAlignment = 4), (this.encoding = c), (this.version = 0), (this.onUpdate = null); } updateMatrix() { this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); } clone() { return new this.constructor().copy(this); } copy(t) { return ( (this.name = t.name), (this.image = t.image), (this.mipmaps = t.mipmaps.slice(0)), (this.mapping = t.mapping), (this.wrapS = t.wrapS), (this.wrapT = t.wrapT), (this.magFilter = t.magFilter), (this.minFilter = t.minFilter), (this.anisotropy = t.anisotropy), (this.format = t.format), (this.internalFormat = t.internalFormat), (this.type = t.type), this.offset.copy(t.offset), this.repeat.copy(t.repeat), this.center.copy(t.center), (this.rotation = t.rotation), (this.matrixAutoUpdate = t.matrixAutoUpdate), this.matrix.copy(t.matrix), (this.generateMipmaps = t.generateMipmaps), (this.premultiplyAlpha = t.premultiplyAlpha), (this.flipY = t.flipY), (this.unpackAlignment = t.unpackAlignment), (this.encoding = t.encoding), this ); } toJSON(t) { const e = void 0 === t || 'string' == typeof t; if (!e && void 0 !== t.textures[this.uuid]) return t.textures[this.uuid]; const n = { metadata: { version: 4.5, type: 'Texture', generator: 'Texture.toJSON', }, uuid: this.uuid, name: this.name, mapping: this.mapping, repeat: [this.repeat.x, this.repeat.y], offset: [this.offset.x, this.offset.y], center: [this.center.x, this.center.y], rotation: this.rotation, wrap: [this.wrapS, this.wrapT], format: this.format, type: this.type, encoding: this.encoding, minFilter: this.minFilter, magFilter: this.magFilter, anisotropy: this.anisotropy, flipY: this.flipY, premultiplyAlpha: this.premultiplyAlpha, unpackAlignment: this.unpackAlignment, }; if (void 0 !== this.image) { const i = this.image; if ( (void 0 === i.uuid && (i.uuid = ct()), !e && void 0 === t.images[i.uuid]) ) { let e; if (Array.isArray(i)) { e = []; for (let t = 0, n = i.length; t < n; t++) i[t].isDataTexture ? e.push(Mt(i[t].image)) : e.push(Mt(i[t])); } else e = Mt(i); t.images[i.uuid] = { uuid: i.uuid, url: e }; } n.image = i.uuid; } return e || (t.textures[this.uuid] = n), n; } dispose() { this.dispatchEvent({ type: 'dispose' }); } transformUv(t) { if (this.mapping !== i) return t; if ((t.applyMatrix3(this.matrix), t.x < 0 || t.x > 1)) switch (this.wrapS) { case h: t.x = t.x - Math.floor(t.x); break; case u: t.x = t.x < 0 ? 0 : 1; break; case d: 1 === Math.abs(Math.floor(t.x) % 2) ? (t.x = Math.ceil(t.x) - t.x) : (t.x = t.x - Math.floor(t.x)); } if (t.y < 0 || t.y > 1) switch (this.wrapT) { case h: t.y = t.y - Math.floor(t.y); break; case u: t.y = t.y < 0 ? 0 : 1; break; case d: 1 === Math.abs(Math.floor(t.y) % 2) ? (t.y = Math.ceil(t.y) - t.y) : (t.y = t.y - Math.floor(t.y)); } return this.flipY && (t.y = 1 - t.y), t; } set needsUpdate(t) { !0 === t && this.version++; } } function Mt(t) { return ('undefined' != typeof HTMLImageElement && t instanceof HTMLImageElement) || ('undefined' != typeof HTMLCanvasElement && t instanceof HTMLCanvasElement) || ('undefined' != typeof ImageBitmap && t instanceof ImageBitmap) ? _t.getDataURL(t) : t.data ? { data: Array.prototype.slice.call(t.data), width: t.width, height: t.height, type: t.data.constructor.name, } : (console.warn('THREE.Texture: Unable to serialize Texture.'), {}); } (bt.DEFAULT_IMAGE = void 0), (bt.DEFAULT_MAPPING = i), (bt.prototype.isTexture = !0); class St { constructor(t = 0, e = 0, n = 0, i = 1) { (this.x = t), (this.y = e), (this.z = n), (this.w = i); } get width() { return this.z; } set width(t) { this.z = t; } get height() { return this.w; } set height(t) { this.w = t; } set(t, e, n, i) { return (this.x = t), (this.y = e), (this.z = n), (this.w = i), this; } setScalar(t) { return (this.x = t), (this.y = t), (this.z = t), (this.w = t), this; } setX(t) { return (this.x = t), this; } setY(t) { return (this.y = t), this; } setZ(t) { return (this.z = t), this; } setW(t) { return (this.w = t), this; } setComponent(t, e) { switch (t) { case 0: this.x = e; break; case 1: this.y = e; break; case 2: this.z = e; break; case 3: this.w = e; break; default: throw new Error('index is out of range: ' + t); } return this; } getComponent(t) { switch (t) { case 0: return this.x; case 1: return this.y; case 2: return this.z; case 3: return this.w; default: throw new Error('index is out of range: ' + t); } } clone() { return new this.constructor(this.x, this.y, this.z, this.w); } copy(t) { return ( (this.x = t.x), (this.y = t.y), (this.z = t.z), (this.w = void 0 !== t.w ? t.w : 1), this ); } add(t, e) { return void 0 !== e ? (console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ), this.addVectors(t, e)) : ((this.x += t.x), (this.y += t.y), (this.z += t.z), (this.w += t.w), this); } addScalar(t) { return (this.x += t), (this.y += t), (this.z += t), (this.w += t), this; } addVectors(t, e) { return ( (this.x = t.x + e.x), (this.y = t.y + e.y), (this.z = t.z + e.z), (this.w = t.w + e.w), this ); } addScaledVector(t, e) { return ( (this.x += t.x * e), (this.y += t.y * e), (this.z += t.z * e), (this.w += t.w * e), this ); } sub(t, e) { return void 0 !== e ? (console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ), this.subVectors(t, e)) : ((this.x -= t.x), (this.y -= t.y), (this.z -= t.z), (this.w -= t.w), this); } subScalar(t) { return (this.x -= t), (this.y -= t), (this.z -= t), (this.w -= t), this; } subVectors(t, e) { return ( (this.x = t.x - e.x), (this.y = t.y - e.y), (this.z = t.z - e.z), (this.w = t.w - e.w), this ); } multiply(t) { return ( (this.x *= t.x), (this.y *= t.y), (this.z *= t.z), (this.w *= t.w), this ); } multiplyScalar(t) { return (this.x *= t), (this.y *= t), (this.z *= t), (this.w *= t), this; } applyMatrix4(t) { const e = this.x, n = this.y, i = this.z, r = this.w, s = t.elements; return ( (this.x = s[0] * e + s[4] * n + s[8] * i + s[12] * r), (this.y = s[1] * e + s[5] * n + s[9] * i + s[13] * r), (this.z = s[2] * e + s[6] * n + s[10] * i + s[14] * r), (this.w = s[3] * e + s[7] * n + s[11] * i + s[15] * r), this ); } divideScalar(t) { return this.multiplyScalar(1 / t); } setAxisAngleFromQuaternion(t) { this.w = 2 * Math.acos(t.w); const e = Math.sqrt(1 - t.w * t.w); return ( e < 1e-4 ? ((this.x = 1), (this.y = 0), (this.z = 0)) : ((this.x = t.x / e), (this.y = t.y / e), (this.z = t.z / e)), this ); } setAxisAngleFromRotationMatrix(t) { let e, n, i, r; const s = 0.01, a = 0.1, o = t.elements, l = o[0], c = o[4], h = o[8], u = o[1], d = o[5], p = o[9], m = o[2], f = o[6], g = o[10]; if (Math.abs(c - u) < s && Math.abs(h - m) < s && Math.abs(p - f) < s) { if ( Math.abs(c + u) < a && Math.abs(h + m) < a && Math.abs(p + f) < a && Math.abs(l + d + g - 3) < a ) return this.set(1, 0, 0, 0), this; e = Math.PI; const t = (l + 1) / 2, o = (d + 1) / 2, v = (g + 1) / 2, y = (c + u) / 4, x = (h + m) / 4, _ = (p + f) / 4; return ( t > o && t > v ? t < s ? ((n = 0), (i = 0.707106781), (r = 0.707106781)) : ((n = Math.sqrt(t)), (i = y / n), (r = x / n)) : o > v ? o < s ? ((n = 0.707106781), (i = 0), (r = 0.707106781)) : ((i = Math.sqrt(o)), (n = y / i), (r = _ / i)) : v < s ? ((n = 0.707106781), (i = 0.707106781), (r = 0)) : ((r = Math.sqrt(v)), (n = x / r), (i = _ / r)), this.set(n, i, r, e), this ); } let v = Math.sqrt( (f - p) * (f - p) + (h - m) * (h - m) + (u - c) * (u - c) ); return ( Math.abs(v) < 0.001 && (v = 1), (this.x = (f - p) / v), (this.y = (h - m) / v), (this.z = (u - c) / v), (this.w = Math.acos((l + d + g - 1) / 2)), this ); } min(t) { return ( (this.x = Math.min(this.x, t.x)), (this.y = Math.min(this.y, t.y)), (this.z = Math.min(this.z, t.z)), (this.w = Math.min(this.w, t.w)), this ); } max(t) { return ( (this.x = Math.max(this.x, t.x)), (this.y = Math.max(this.y, t.y)), (this.z = Math.max(this.z, t.z)), (this.w = Math.max(this.w, t.w)), this ); } clamp(t, e) { return ( (this.x = Math.max(t.x, Math.min(e.x, this.x))), (this.y = Math.max(t.y, Math.min(e.y, this.y))), (this.z = Math.max(t.z, Math.min(e.z, this.z))), (this.w = Math.max(t.w, Math.min(e.w, this.w))), this ); } clampScalar(t, e) { return ( (this.x = Math.max(t, Math.min(e, this.x))), (this.y = Math.max(t, Math.min(e, this.y))), (this.z = Math.max(t, Math.min(e, this.z))), (this.w = Math.max(t, Math.min(e, this.w))), this ); } clampLength(t, e) { const n = this.length(); return this.divideScalar(n || 1).multiplyScalar( Math.max(t, Math.min(e, n)) ); } floor() { return ( (this.x = Math.floor(this.x)), (this.y = Math.floor(this.y)), (this.z = Math.floor(this.z)), (this.w = Math.floor(this.w)), this ); } ceil() { return ( (this.x = Math.ceil(this.x)), (this.y = Math.ceil(this.y)), (this.z = Math.ceil(this.z)), (this.w = Math.ceil(this.w)), this ); } round() { return ( (this.x = Math.round(this.x)), (this.y = Math.round(this.y)), (this.z = Math.round(this.z)), (this.w = Math.round(this.w)), this ); } roundToZero() { return ( (this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x)), (this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y)), (this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z)), (this.w = this.w < 0 ? Math.ceil(this.w) : Math.floor(this.w)), this ); } negate() { return ( (this.x = -this.x), (this.y = -this.y), (this.z = -this.z), (this.w = -this.w), this ); } dot(t) { return this.x * t.x + this.y * t.y + this.z * t.z + this.w * t.w; } lengthSq() { return ( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); } length() { return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); } manhattanLength() { return ( Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w) ); } normalize() { return this.divideScalar(this.length() || 1); } setLength(t) { return this.normalize().multiplyScalar(t); } lerp(t, e) { return ( (this.x += (t.x - this.x) * e), (this.y += (t.y - this.y) * e), (this.z += (t.z - this.z) * e), (this.w += (t.w - this.w) * e), this ); } lerpVectors(t, e, n) { return ( (this.x = t.x + (e.x - t.x) * n), (this.y = t.y + (e.y - t.y) * n), (this.z = t.z + (e.z - t.z) * n), (this.w = t.w + (e.w - t.w) * n), this ); } equals(t) { return ( t.x === this.x && t.y === this.y && t.z === this.z && t.w === this.w ); } fromArray(t, e = 0) { return ( (this.x = t[e]), (this.y = t[e + 1]), (this.z = t[e + 2]), (this.w = t[e + 3]), this ); } toArray(t = [], e = 0) { return ( (t[e] = this.x), (t[e + 1] = this.y), (t[e + 2] = this.z), (t[e + 3] = this.w), t ); } fromBufferAttribute(t, e, n) { return ( void 0 !== n && console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ), (this.x = t.getX(e)), (this.y = t.getY(e)), (this.z = t.getZ(e)), (this.w = t.getW(e)), this ); } random() { return ( (this.x = Math.random()), (this.y = Math.random()), (this.z = Math.random()), (this.w = Math.random()), this ); } } St.prototype.isVector4 = !0; class Tt extends rt { constructor(t, e, n) { super(), (this.width = t), (this.height = e), (this.depth = 1), (this.scissor = new St(0, 0, t, e)), (this.scissorTest = !1), (this.viewport = new St(0, 0, t, e)), (n = n || {}), (this.texture = new bt( void 0, n.mapping, n.wrapS, n.wrapT, n.magFilter, n.minFilter, n.format, n.type, n.anisotropy, n.encoding )), (this.texture.image = {}), (this.texture.image.width = t), (this.texture.image.height = e), (this.texture.image.depth = 1), (this.texture.generateMipmaps = void 0 !== n.generateMipmaps && n.generateMipmaps), (this.texture.minFilter = void 0 !== n.minFilter ? n.minFilter : g), (this.depthBuffer = void 0 === n.depthBuffer || n.depthBuffer), (this.stencilBuffer = void 0 !== n.stencilBuffer && n.stencilBuffer), (this.depthTexture = void 0 !== n.depthTexture ? n.depthTexture : null); } setTexture(t) { (t.image = { width: this.width, height: this.height, depth: this.depth }), (this.texture = t); } setSize(t, e, n = 1) { (this.width === t && this.height === e && this.depth === n) || ((this.width = t), (this.height = e), (this.depth = n), (this.texture.image.width = t), (this.texture.image.height = e), (this.texture.image.depth = n), this.dispose()), this.viewport.set(0, 0, t, e), this.scissor.set(0, 0, t, e); } clone() { return new this.constructor().copy(this); } copy(t) { return ( (this.width = t.width), (this.height = t.height), (this.depth = t.depth), this.viewport.copy(t.viewport), (this.texture = t.texture.clone()), (this.depthBuffer = t.depthBuffer), (this.stencilBuffer = t.stencilBuffer), (this.depthTexture = t.depthTexture), this ); } dispose() { this.dispatchEvent({ type: 'dispose' }); } } Tt.prototype.isWebGLRenderTarget = !0; class Et extends Tt { constructor(t, e, n) { super(t, e, n), (this.samples = 4); } copy(t) { return super.copy.call(this, t), (this.samples = t.samples), this; } } Et.prototype.isWebGLMultisampleRenderTarget = !0; class At { constructor(t = 0, e = 0, n = 0, i = 1) { (this._x = t), (this._y = e), (this._z = n), (this._w = i); } static slerp(t, e, n, i) { return ( console.warn( 'THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead.' ), n.slerpQuaternions(t, e, i) ); } static slerpFlat(t, e, n, i, r, s, a) { let o = n[i + 0], l = n[i + 1], c = n[i + 2], h = n[i + 3]; const u = r[s + 0], d = r[s + 1], p = r[s + 2], m = r[s + 3]; if (0 === a) return ( (t[e + 0] = o), (t[e + 1] = l), (t[e + 2] = c), void (t[e + 3] = h) ); if (1 === a) return ( (t[e + 0] = u), (t[e + 1] = d), (t[e + 2] = p), void (t[e + 3] = m) ); if (h !== m || o !== u || l !== d || c !== p) { let t = 1 - a; const e = o * u + l * d + c * p + h * m, n = e >= 0 ? 1 : -1, i = 1 - e * e; if (i > Number.EPSILON) { const r = Math.sqrt(i), s = Math.atan2(r, e * n); (t = Math.sin(t * s) / r), (a = Math.sin(a * s) / r); } const r = a * n; if ( ((o = o * t + u * r), (l = l * t + d * r), (c = c * t + p * r), (h = h * t + m * r), t === 1 - a) ) { const t = 1 / Math.sqrt(o * o + l * l + c * c + h * h); (o *= t), (l *= t), (c *= t), (h *= t); } } (t[e] = o), (t[e + 1] = l), (t[e + 2] = c), (t[e + 3] = h); } static multiplyQuaternionsFlat(t, e, n, i, r, s) { const a = n[i], o = n[i + 1], l = n[i + 2], c = n[i + 3], h = r[s], u = r[s + 1], d = r[s + 2], p = r[s + 3]; return ( (t[e] = a * p + c * h + o * d - l * u), (t[e + 1] = o * p + c * u + l * h - a * d), (t[e + 2] = l * p + c * d + a * u - o * h), (t[e + 3] = c * p - a * h - o * u - l * d), t ); } get x() { return this._x; } set x(t) { (this._x = t), this._onChangeCallback(); } get y() { return this._y; } set y(t) { (this._y = t), this._onChangeCallback(); } get z() { return this._z; } set z(t) { (this._z = t), this._onChangeCallback(); } get w() { return this._w; } set w(t) { (this._w = t), this._onChangeCallback(); } set(t, e, n, i) { return ( (this._x = t), (this._y = e), (this._z = n), (this._w = i), this._onChangeCallback(), this ); } clone() { return new this.constructor(this._x, this._y, this._z, this._w); } copy(t) { return ( (this._x = t.x), (this._y = t.y), (this._z = t.z), (this._w = t.w), this._onChangeCallback(), this ); } setFromEuler(t, e) { if (!t || !t.isEuler) throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); const n = t._x, i = t._y, r = t._z, s = t._order, a = Math.cos, o = Math.sin, l = a(n / 2), c = a(i / 2), h = a(r / 2), u = o(n / 2), d = o(i / 2), p = o(r / 2); switch (s) { case 'XYZ': (this._x = u * c * h + l * d * p), (this._y = l * d * h - u * c * p), (this._z = l * c * p + u * d * h), (this._w = l * c * h - u * d * p); break; case 'YXZ': (this._x = u * c * h + l * d * p), (this._y = l * d * h - u * c * p), (this._z = l * c * p - u * d * h), (this._w = l * c * h + u * d * p); break; case 'ZXY': (this._x = u * c * h - l * d * p), (this._y = l * d * h + u * c * p), (this._z = l * c * p + u * d * h), (this._w = l * c * h - u * d * p); break; case 'ZYX': (this._x = u * c * h - l * d * p), (this._y = l * d * h + u * c * p), (this._z = l * c * p - u * d * h), (this._w = l * c * h + u * d * p); break; case 'YZX': (this._x = u * c * h + l * d * p), (this._y = l * d * h + u * c * p), (this._z = l * c * p - u * d * h), (this._w = l * c * h - u * d * p); break; case 'XZY': (this._x = u * c * h - l * d * p), (this._y = l * d * h - u * c * p), (this._z = l * c * p + u * d * h), (this._w = l * c * h + u * d * p); break; default: console.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + s ); } return !1 !== e && this._onChangeCallback(), this; } setFromAxisAngle(t, e) { const n = e / 2, i = Math.sin(n); return ( (this._x = t.x * i), (this._y = t.y * i), (this._z = t.z * i), (this._w = Math.cos(n)), this._onChangeCallback(), this ); } setFromRotationMatrix(t) { const e = t.elements, n = e[0], i = e[4], r = e[8], s = e[1], a = e[5], o = e[9], l = e[2], c = e[6], h = e[10], u = n + a + h; if (u > 0) { const t = 0.5 / Math.sqrt(u + 1); (this._w = 0.25 / t), (this._x = (c - o) * t), (this._y = (r - l) * t), (this._z = (s - i) * t); } else if (n > a && n > h) { const t = 2 * Math.sqrt(1 + n - a - h); (this._w = (c - o) / t), (this._x = 0.25 * t), (this._y = (i + s) / t), (this._z = (r + l) / t); } else if (a > h) { const t = 2 * Math.sqrt(1 + a - n - h); (this._w = (r - l) / t), (this._x = (i + s) / t), (this._y = 0.25 * t), (this._z = (o + c) / t); } else { const t = 2 * Math.sqrt(1 + h - n - a); (this._w = (s - i) / t), (this._x = (r + l) / t), (this._y = (o + c) / t), (this._z = 0.25 * t); } return this._onChangeCallback(), this; } setFromUnitVectors(t, e) { let n = t.dot(e) + 1; return ( n < Number.EPSILON ? ((n = 0), Math.abs(t.x) > Math.abs(t.z) ? ((this._x = -t.y), (this._y = t.x), (this._z = 0), (this._w = n)) : ((this._x = 0), (this._y = -t.z), (this._z = t.y), (this._w = n))) : ((this._x = t.y * e.z - t.z * e.y), (this._y = t.z * e.x - t.x * e.z), (this._z = t.x * e.y - t.y * e.x), (this._w = n)), this.normalize() ); } angleTo(t) { return 2 * Math.acos(Math.abs(ht(this.dot(t), -1, 1))); } rotateTowards(t, e) { const n = this.angleTo(t); if (0 === n) return this; const i = Math.min(1, e / n); return this.slerp(t, i), this; } identity() { return this.set(0, 0, 0, 1); } invert() { return this.conjugate(); } conjugate() { return ( (this._x *= -1), (this._y *= -1), (this._z *= -1), this._onChangeCallback(), this ); } dot(t) { return this._x * t._x + this._y * t._y + this._z * t._z + this._w * t._w; } lengthSq() { return ( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); } length() { return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); } normalize() { let t = this.length(); return ( 0 === t ? ((this._x = 0), (this._y = 0), (this._z = 0), (this._w = 1)) : ((t = 1 / t), (this._x = this._x * t), (this._y = this._y * t), (this._z = this._z * t), (this._w = this._w * t)), this._onChangeCallback(), this ); } multiply(t, e) { return void 0 !== e ? (console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ), this.multiplyQuaternions(t, e)) : this.multiplyQuaternions(this, t); } premultiply(t) { return this.multiplyQuaternions(t, this); } multiplyQuaternions(t, e) { const n = t._x, i = t._y, r = t._z, s = t._w, a = e._x, o = e._y, l = e._z, c = e._w; return ( (this._x = n * c + s * a + i * l - r * o), (this._y = i * c + s * o + r * a - n * l), (this._z = r * c + s * l + n * o - i * a), (this._w = s * c - n * a - i * o - r * l), this._onChangeCallback(), this ); } slerp(t, e) { if (0 === e) return this; if (1 === e) return this.copy(t); const n = this._x, i = this._y, r = this._z, s = this._w; let a = s * t._w + n * t._x + i * t._y + r * t._z; if ( (a < 0 ? ((this._w = -t._w), (this._x = -t._x), (this._y = -t._y), (this._z = -t._z), (a = -a)) : this.copy(t), a >= 1) ) return (this._w = s), (this._x = n), (this._y = i), (this._z = r), this; const o = 1 - a * a; if (o <= Number.EPSILON) { const t = 1 - e; return ( (this._w = t * s + e * this._w), (this._x = t * n + e * this._x), (this._y = t * i + e * this._y), (this._z = t * r + e * this._z), this.normalize(), this._onChangeCallback(), this ); } const l = Math.sqrt(o), c = Math.atan2(l, a), h = Math.sin((1 - e) * c) / l, u = Math.sin(e * c) / l; return ( (this._w = s * h + this._w * u), (this._x = n * h + this._x * u), (this._y = i * h + this._y * u), (this._z = r * h + this._z * u), this._onChangeCallback(), this ); } slerpQuaternions(t, e, n) { this.copy(t).slerp(e, n); } equals(t) { return ( t._x === this._x && t._y === this._y && t._z === this._z && t._w === this._w ); } fromArray(t, e = 0) { return ( (this._x = t[e]), (this._y = t[e + 1]), (this._z = t[e + 2]), (this._w = t[e + 3]), this._onChangeCallback(), this ); } toArray(t = [], e = 0) { return ( (t[e] = this._x), (t[e + 1] = this._y), (t[e + 2] = this._z), (t[e + 3] = this._w), t ); } fromBufferAttribute(t, e) { return ( (this._x = t.getX(e)), (this._y = t.getY(e)), (this._z = t.getZ(e)), (this._w = t.getW(e)), this ); } _onChange(t) { return (this._onChangeCallback = t), this; } _onChangeCallback() {} } At.prototype.isQuaternion = !0; class Lt { constructor(t = 0, e = 0, n = 0) { (this.x = t), (this.y = e), (this.z = n); } set(t, e, n) { return ( void 0 === n && (n = this.z), (this.x = t), (this.y = e), (this.z = n), this ); } setScalar(t) { return (this.x = t), (this.y = t), (this.z = t), this; } setX(t) { return (this.x = t), this; } setY(t) { return (this.y = t), this; } setZ(t) { return (this.z = t), this; } setComponent(t, e) { switch (t) { case 0: this.x = e; break; case 1: this.y = e; break; case 2: this.z = e; break; default: throw new Error('index is out of range: ' + t); } return this; } getComponent(t) { switch (t) { case 0: return this.x; case 1: return this.y; case 2: return this.z; default: throw new Error('index is out of range: ' + t); } } clone() { return new this.constructor(this.x, this.y, this.z); } copy(t) { return (this.x = t.x), (this.y = t.y), (this.z = t.z), this; } add(t, e) { return void 0 !== e ? (console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ), this.addVectors(t, e)) : ((this.x += t.x), (this.y += t.y), (this.z += t.z), this); } addScalar(t) { return (this.x += t), (this.y += t), (this.z += t), this; } addVectors(t, e) { return ( (this.x = t.x + e.x), (this.y = t.y + e.y), (this.z = t.z + e.z), this ); } addScaledVector(t, e) { return ( (this.x += t.x * e), (this.y += t.y * e), (this.z += t.z * e), this ); } sub(t, e) { return void 0 !== e ? (console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ), this.subVectors(t, e)) : ((this.x -= t.x), (this.y -= t.y), (this.z -= t.z), this); } subScalar(t) { return (this.x -= t), (this.y -= t), (this.z -= t), this; } subVectors(t, e) { return ( (this.x = t.x - e.x), (this.y = t.y - e.y), (this.z = t.z - e.z), this ); } multiply(t, e) { return void 0 !== e ? (console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ), this.multiplyVectors(t, e)) : ((this.x *= t.x), (this.y *= t.y), (this.z *= t.z), this); } multiplyScalar(t) { return (this.x *= t), (this.y *= t), (this.z *= t), this; } multiplyVectors(t, e) { return ( (this.x = t.x * e.x), (this.y = t.y * e.y), (this.z = t.z * e.z), this ); } applyEuler(t) { return ( (t && t.isEuler) || console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ), this.applyQuaternion(Ct.setFromEuler(t)) ); } applyAxisAngle(t, e) { return this.applyQuaternion(Ct.setFromAxisAngle(t, e)); } applyMatrix3(t) { const e = this.x, n = this.y, i = this.z, r = t.elements; return ( (this.x = r[0] * e + r[3] * n + r[6] * i), (this.y = r[1] * e + r[4] * n + r[7] * i), (this.z = r[2] * e + r[5] * n + r[8] * i), this ); } applyNormalMatrix(t) { return this.applyMatrix3(t).normalize(); } applyMatrix4(t) { const e = this.x, n = this.y, i = this.z, r = t.elements, s = 1 / (r[3] * e + r[7] * n + r[11] * i + r[15]); return ( (this.x = (r[0] * e + r[4] * n + r[8] * i + r[12]) * s), (this.y = (r[1] * e + r[5] * n + r[9] * i + r[13]) * s), (this.z = (r[2] * e + r[6] * n + r[10] * i + r[14]) * s), this ); } applyQuaternion(t) { const e = this.x, n = this.y, i = this.z, r = t.x, s = t.y, a = t.z, o = t.w, l = o * e + s * i - a * n, c = o * n + a * e - r * i, h = o * i + r * n - s * e, u = -r * e - s * n - a * i; return ( (this.x = l * o + u * -r + c * -a - h * -s), (this.y = c * o + u * -s + h * -r - l * -a), (this.z = h * o + u * -a + l * -s - c * -r), this ); } project(t) { return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4( t.projectionMatrix ); } unproject(t) { return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4( t.matrixWorld ); } transformDirection(t) { const e = this.x, n = this.y, i = this.z, r = t.elements; return ( (this.x = r[0] * e + r[4] * n + r[8] * i), (this.y = r[1] * e + r[5] * n + r[9] * i), (this.z = r[2] * e + r[6] * n + r[10] * i), this.normalize() ); } divide(t) { return (this.x /= t.x), (this.y /= t.y), (this.z /= t.z), this; } divideScalar(t) { return this.multiplyScalar(1 / t); } min(t) { return ( (this.x = Math.min(this.x, t.x)), (this.y = Math.min(this.y, t.y)), (this.z = Math.min(this.z, t.z)), this ); } max(t) { return ( (this.x = Math.max(this.x, t.x)), (this.y = Math.max(this.y, t.y)), (this.z = Math.max(this.z, t.z)), this ); } clamp(t, e) { return ( (this.x = Math.max(t.x, Math.min(e.x, this.x))), (this.y = Math.max(t.y, Math.min(e.y, this.y))), (this.z = Math.max(t.z, Math.min(e.z, this.z))), this ); } clampScalar(t, e) { return ( (this.x = Math.max(t, Math.min(e, this.x))), (this.y = Math.max(t, Math.min(e, this.y))), (this.z = Math.max(t, Math.min(e, this.z))), this ); } clampLength(t, e) { const n = this.length(); return this.divideScalar(n || 1).multiplyScalar( Math.max(t, Math.min(e, n)) ); } floor() { return ( (this.x = Math.floor(this.x)), (this.y = Math.floor(this.y)), (this.z = Math.floor(this.z)), this ); } ceil() { return ( (this.x = Math.ceil(this.x)), (this.y = Math.ceil(this.y)), (this.z = Math.ceil(this.z)), this ); } round() { return ( (this.x = Math.round(this.x)), (this.y = Math.round(this.y)), (this.z = Math.round(this.z)), this ); } roundToZero() { return ( (this.x = this.x < 0 ? Math.ceil(this.x) : Math.floor(this.x)), (this.y = this.y < 0 ? Math.ceil(this.y) : Math.floor(this.y)), (this.z = this.z < 0 ? Math.ceil(this.z) : Math.floor(this.z)), this ); } negate() { return (this.x = -this.x), (this.y = -this.y), (this.z = -this.z), this; } dot(t) { return this.x * t.x + this.y * t.y + this.z * t.z; } lengthSq() { return this.x * this.x + this.y * this.y + this.z * this.z; } length() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); } manhattanLength() { return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z); } normalize() { return this.divideScalar(this.length() || 1); } setLength(t) { return this.normalize().multiplyScalar(t); } lerp(t, e) { return ( (this.x += (t.x - this.x) * e), (this.y += (t.y - this.y) * e), (this.z += (t.z - this.z) * e), this ); } lerpVectors(t, e, n) { return ( (this.x = t.x + (e.x - t.x) * n), (this.y = t.y + (e.y - t.y) * n), (this.z = t.z + (e.z - t.z) * n), this ); } cross(t, e) { return void 0 !== e ? (console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ), this.crossVectors(t, e)) : this.crossVectors(this, t); } crossVectors(t, e) { const n = t.x, i = t.y, r = t.z, s = e.x, a = e.y, o = e.z; return ( (this.x = i * o - r * a), (this.y = r * s - n * o), (this.z = n * a - i * s), this ); } projectOnVector(t) { const e = t.lengthSq(); if (0 === e) return this.set(0, 0, 0); const n = t.dot(this) / e; return this.copy(t).multiplyScalar(n); } projectOnPlane(t) { return Rt.copy(this).projectOnVector(t), this.sub(Rt); } reflect(t) { return this.sub(Rt.copy(t).multiplyScalar(2 * this.dot(t))); } angleTo(t) { const e = Math.sqrt(this.lengthSq() * t.lengthSq()); if (0 === e) return Math.PI / 2; const n = this.dot(t) / e; return Math.acos(ht(n, -1, 1)); } distanceTo(t) { return Math.sqrt(this.distanceToSquared(t)); } distanceToSquared(t) { const e = this.x - t.x, n = this.y - t.y, i = this.z - t.z; return e * e + n * n + i * i; } manhattanDistanceTo(t) { return ( Math.abs(this.x - t.x) + Math.abs(this.y - t.y) + Math.abs(this.z - t.z) ); } setFromSpherical(t) { return this.setFromSphericalCoords(t.radius, t.phi, t.theta); } setFromSphericalCoords(t, e, n) { const i = Math.sin(e) * t; return ( (this.x = i * Math.sin(n)), (this.y = Math.cos(e) * t), (this.z = i * Math.cos(n)), this ); } setFromCylindrical(t) { return this.setFromCylindricalCoords(t.radius, t.theta, t.y); } setFromCylindricalCoords(t, e, n) { return ( (this.x = t * Math.sin(e)), (this.y = n), (this.z = t * Math.cos(e)), this ); } setFromMatrixPosition(t) { const e = t.elements; return (this.x = e[12]), (this.y = e[13]), (this.z = e[14]), this; } setFromMatrixScale(t) { const e = this.setFromMatrixColumn(t, 0).length(), n = this.setFromMatrixColumn(t, 1).length(), i = this.setFromMatrixColumn(t, 2).length(); return (this.x = e), (this.y = n), (this.z = i), this; } setFromMatrixColumn(t, e) { return this.fromArray(t.elements, 4 * e); } setFromMatrix3Column(t, e) { return this.fromArray(t.elements, 3 * e); } equals(t) { return t.x === this.x && t.y === this.y && t.z === this.z; } fromArray(t, e = 0) { return (this.x = t[e]), (this.y = t[e + 1]), (this.z = t[e + 2]), this; } toArray(t = [], e = 0) { return (t[e] = this.x), (t[e + 1] = this.y), (t[e + 2] = this.z), t; } fromBufferAttribute(t, e, n) { return ( void 0 !== n && console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ), (this.x = t.getX(e)), (this.y = t.getY(e)), (this.z = t.getZ(e)), this ); } random() { return ( (this.x = Math.random()), (this.y = Math.random()), (this.z = Math.random()), this ); } } Lt.prototype.isVector3 = !0; const Rt = new Lt(), Ct = new At(); class Pt { constructor( t = new Lt(1 / 0, 1 / 0, 1 / 0), e = new Lt(-1 / 0, -1 / 0, -1 / 0) ) { (this.min = t), (this.max = e); } set(t, e) { return this.min.copy(t), this.max.copy(e), this; } setFromArray(t) { let e = 1 / 0, n = 1 / 0, i = 1 / 0, r = -1 / 0, s = -1 / 0, a = -1 / 0; for (let o = 0, l = t.length; o < l; o += 3) { const l = t[o], c = t[o + 1], h = t[o + 2]; l < e && (e = l), c < n && (n = c), h < i && (i = h), l > r && (r = l), c > s && (s = c), h > a && (a = h); } return this.min.set(e, n, i), this.max.set(r, s, a), this; } setFromBufferAttribute(t) { let e = 1 / 0, n = 1 / 0, i = 1 / 0, r = -1 / 0, s = -1 / 0, a = -1 / 0; for (let o = 0, l = t.count; o < l; o++) { const l = t.getX(o), c = t.getY(o), h = t.getZ(o); l < e && (e = l), c < n && (n = c), h < i && (i = h), l > r && (r = l), c > s && (s = c), h > a && (a = h); } return this.min.set(e, n, i), this.max.set(r, s, a), this; } setFromPoints(t) { this.makeEmpty(); for (let e = 0, n = t.length; e < n; e++) this.expandByPoint(t[e]); return this; } setFromCenterAndSize(t, e) { const n = It.copy(e).multiplyScalar(0.5); return this.min.copy(t).sub(n), this.max.copy(t).add(n), this; } setFromObject(t) { return this.makeEmpty(), this.expandByObject(t); } clone() { return new this.constructor().copy(this); } copy(t) { return this.min.copy(t.min), this.max.copy(t.max), this; } makeEmpty() { return ( (this.min.x = this.min.y = this.min.z = 1 / 0), (this.max.x = this.max.y = this.max.z = -1 / 0), this ); } isEmpty() { return ( this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z ); } getCenter(t) { return ( void 0 === t && (console.warn('THREE.Box3: .getCenter() target is now required'), (t = new Lt())), this.isEmpty() ? t.set(0, 0, 0) : t.addVectors(this.min, this.max).multiplyScalar(0.5) ); } getSize(t) { return ( void 0 === t && (console.warn('THREE.Box3: .getSize() target is now required'), (t = new Lt())), this.isEmpty() ? t.set(0, 0, 0) : t.subVectors(this.max, this.min) ); } expandByPoint(t) { return this.min.min(t), this.max.max(t), this; } expandByVector(t) { return this.min.sub(t), this.max.add(t), this; } expandByScalar(t) { return this.min.addScalar(-t), this.max.addScalar(t), this; } expandByObject(t) { t.updateWorldMatrix(!1, !1); const e = t.geometry; void 0 !== e && (null === e.boundingBox && e.computeBoundingBox(), Nt.copy(e.boundingBox), Nt.applyMatrix4(t.matrixWorld), this.union(Nt)); const n = t.children; for (let t = 0, e = n.length; t < e; t++) this.expandByObject(n[t]); return this; } containsPoint(t) { return !( t.x < this.min.x || t.x > this.max.x || t.y < this.min.y || t.y > this.max.y || t.z < this.min.z || t.z > this.max.z ); } containsBox(t) { return ( this.min.x <= t.min.x && t.max.x <= this.max.x && this.min.y <= t.min.y && t.max.y <= this.max.y && this.min.z <= t.min.z && t.max.z <= this.max.z ); } getParameter(t, e) { return ( void 0 === e && (console.warn('THREE.Box3: .getParameter() target is now required'), (e = new Lt())), e.set( (t.x - this.min.x) / (this.max.x - this.min.x), (t.y - this.min.y) / (this.max.y - this.min.y), (t.z - this.min.z) / (this.max.z - this.min.z) ) ); } intersectsBox(t) { return !( t.max.x < this.min.x || t.min.x > this.max.x || t.max.y < this.min.y || t.min.y > this.max.y || t.max.z < this.min.z || t.min.z > this.max.z ); } intersectsSphere(t) { return ( this.clampPoint(t.center, It), It.distanceToSquared(t.center) <= t.radius * t.radius ); } intersectsPlane(t) { let e, n; return ( t.normal.x > 0 ? ((e = t.normal.x * this.min.x), (n = t.normal.x * this.max.x)) : ((e = t.normal.x * this.max.x), (n = t.normal.x * this.min.x)), t.normal.y > 0 ? ((e += t.normal.y * this.min.y), (n += t.normal.y * this.max.y)) : ((e += t.normal.y * this.max.y), (n += t.normal.y * this.min.y)), t.normal.z > 0 ? ((e += t.normal.z * this.min.z), (n += t.normal.z * this.max.z)) : ((e += t.normal.z * this.max.z), (n += t.normal.z * this.min.z)), e <= -t.constant && n >= -t.constant ); } intersectsTriangle(t) { if (this.isEmpty()) return !1; this.getCenter(Ut), kt.subVectors(this.max, Ut), Bt.subVectors(t.a, Ut), zt.subVectors(t.b, Ut), Ft.subVectors(t.c, Ut), Ot.subVectors(zt, Bt), Ht.subVectors(Ft, zt), Gt.subVectors(Bt, Ft); let e = [ 0, -Ot.z, Ot.y, 0, -Ht.z, Ht.y, 0, -Gt.z, Gt.y, Ot.z, 0, -Ot.x, Ht.z, 0, -Ht.x, Gt.z, 0, -Gt.x, -Ot.y, Ot.x, 0, -Ht.y, Ht.x, 0, -Gt.y, Gt.x, 0, ]; return ( !!jt(e, Bt, zt, Ft, kt) && ((e = [1, 0, 0, 0, 1, 0, 0, 0, 1]), !!jt(e, Bt, zt, Ft, kt) && (Vt.crossVectors(Ot, Ht), (e = [Vt.x, Vt.y, Vt.z]), jt(e, Bt, zt, Ft, kt))) ); } clampPoint(t, e) { return ( void 0 === e && (console.warn('THREE.Box3: .clampPoint() target is now required'), (e = new Lt())), e.copy(t).clamp(this.min, this.max) ); } distanceToPoint(t) { return It.copy(t).clamp(this.min, this.max).sub(t).length(); } getBoundingSphere(t) { return ( void 0 === t && console.error( 'THREE.Box3: .getBoundingSphere() target is now required' ), this.getCenter(t.center), (t.radius = 0.5 * this.getSize(It).length()), t ); } intersect(t) { return ( this.min.max(t.min), this.max.min(t.max), this.isEmpty() && this.makeEmpty(), this ); } union(t) { return this.min.min(t.min), this.max.max(t.max), this; } applyMatrix4(t) { return ( this.isEmpty() || (Dt[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(t), Dt[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(t), Dt[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(t), Dt[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(t), Dt[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(t), Dt[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(t), Dt[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(t), Dt[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(t), this.setFromPoints(Dt)), this ); } translate(t) { return this.min.add(t), this.max.add(t), this; } equals(t) { return t.min.equals(this.min) && t.max.equals(this.max); } } Pt.prototype.isBox3 = !0; const Dt = [ new Lt(), new Lt(), new Lt(), new Lt(), new Lt(), new Lt(), new Lt(), new Lt(), ], It = new Lt(), Nt = new Pt(), Bt = new Lt(), zt = new Lt(), Ft = new Lt(), Ot = new Lt(), Ht = new Lt(), Gt = new Lt(), Ut = new Lt(), kt = new Lt(), Vt = new Lt(), Wt = new Lt(); function jt(t, e, n, i, r) { for (let s = 0, a = t.length - 3; s <= a; s += 3) { Wt.fromArray(t, s); const a = r.x * Math.abs(Wt.x) + r.y * Math.abs(Wt.y) + r.z * Math.abs(Wt.z), o = e.dot(Wt), l = n.dot(Wt), c = i.dot(Wt); if (Math.max(-Math.max(o, l, c), Math.min(o, l, c)) > a) return !1; } return !0; } const qt = new Pt(), Xt = new Lt(), Yt = new Lt(), Zt = new Lt(); class Jt { constructor(t = new Lt(), e = -1) { (this.center = t), (this.radius = e); } set(t, e) { return this.center.copy(t), (this.radius = e), this; } setFromPoints(t, e) { const n = this.center; void 0 !== e ? n.copy(e) : qt.setFromPoints(t).getCenter(n); let i = 0; for (let e = 0, r = t.length; e < r; e++) i = Math.max(i, n.distanceToSquared(t[e])); return (this.radius = Math.sqrt(i)), this; } copy(t) { return this.center.copy(t.center), (this.radius = t.radius), this; } isEmpty() { return this.radius < 0; } makeEmpty() { return this.center.set(0, 0, 0), (this.radius = -1), this; } containsPoint(t) { return t.distanceToSquared(this.center) <= this.radius * this.radius; } distanceToPoint(t) { return t.distanceTo(this.center) - this.radius; } intersectsSphere(t) { const e = this.radius + t.radius; return t.center.distanceToSquared(this.center) <= e * e; } intersectsBox(t) { return t.intersectsSphere(this); } intersectsPlane(t) { return Math.abs(t.distanceToPoint(this.center)) <= this.radius; } clampPoint(t, e) { const n = this.center.distanceToSquared(t); return ( void 0 === e && (console.warn('THREE.Sphere: .clampPoint() target is now required'), (e = new Lt())), e.copy(t), n > this.radius * this.radius && (e.sub(this.center).normalize(), e.multiplyScalar(this.radius).add(this.center)), e ); } getBoundingBox(t) { return ( void 0 === t && (console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ), (t = new Pt())), this.isEmpty() ? (t.makeEmpty(), t) : (t.set(this.center, this.center), t.expandByScalar(this.radius), t) ); } applyMatrix4(t) { return ( this.center.applyMatrix4(t), (this.radius = this.radius * t.getMaxScaleOnAxis()), this ); } translate(t) { return this.center.add(t), this; } expandByPoint(t) { Zt.subVectors(t, this.center); const e = Zt.lengthSq(); if (e > this.radius * this.radius) { const t = Math.sqrt(e), n = 0.5 * (t - this.radius); this.center.add(Zt.multiplyScalar(n / t)), (this.radius += n); } return this; } union(t) { return ( Yt.subVectors(t.center, this.center) .normalize() .multiplyScalar(t.radius), this.expandByPoint(Xt.copy(t.center).add(Yt)), this.expandByPoint(Xt.copy(t.center).sub(Yt)), this ); } equals(t) { return t.center.equals(this.center) && t.radius === this.radius; } clone() { return new this.constructor().copy(this); } } const Qt = new Lt(), Kt = new Lt(), $t = new Lt(), te = new Lt(), ee = new Lt(), ne = new Lt(), ie = new Lt(); class re { constructor(t = new Lt(), e = new Lt(0, 0, -1)) { (this.origin = t), (this.direction = e); } set(t, e) { return this.origin.copy(t), this.direction.copy(e), this; } copy(t) { return this.origin.copy(t.origin), this.direction.copy(t.direction), this; } at(t, e) { return ( void 0 === e && (console.warn('THREE.Ray: .at() target is now required'), (e = new Lt())), e.copy(this.direction).multiplyScalar(t).add(this.origin) ); } lookAt(t) { return this.direction.copy(t).sub(this.origin).normalize(), this; } recast(t) { return this.origin.copy(this.at(t, Qt)), this; } closestPointToPoint(t, e) { void 0 === e && (console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' ), (e = new Lt())), e.subVectors(t, this.origin); const n = e.dot(this.direction); return n < 0 ? e.copy(this.origin) : e.copy(this.direction).multiplyScalar(n).add(this.origin); } distanceToPoint(t) { return Math.sqrt(this.distanceSqToPoint(t)); } distanceSqToPoint(t) { const e = Qt.subVectors(t, this.origin).dot(this.direction); return e < 0 ? this.origin.distanceToSquared(t) : (Qt.copy(this.direction).multiplyScalar(e).add(this.origin), Qt.distanceToSquared(t)); } distanceSqToSegment(t, e, n, i) { Kt.copy(t).add(e).multiplyScalar(0.5), $t.copy(e).sub(t).normalize(), te.copy(this.origin).sub(Kt); const r = 0.5 * t.distanceTo(e), s = -this.direction.dot($t), a = te.dot(this.direction), o = -te.dot($t), l = te.lengthSq(), c = Math.abs(1 - s * s); let h, u, d, p; if (c > 0) if (((h = s * o - a), (u = s * a - o), (p = r * c), h >= 0)) if (u >= -p) if (u <= p) { const t = 1 / c; (h *= t), (u *= t), (d = h * (h + s * u + 2 * a) + u * (s * h + u + 2 * o) + l); } else (u = r), (h = Math.max(0, -(s * u + a))), (d = -h * h + u * (u + 2 * o) + l); else (u = -r), (h = Math.max(0, -(s * u + a))), (d = -h * h + u * (u + 2 * o) + l); else u <= -p ? ((h = Math.max(0, -(-s * r + a))), (u = h > 0 ? -r : Math.min(Math.max(-r, -o), r)), (d = -h * h + u * (u + 2 * o) + l)) : u <= p ? ((h = 0), (u = Math.min(Math.max(-r, -o), r)), (d = u * (u + 2 * o) + l)) : ((h = Math.max(0, -(s * r + a))), (u = h > 0 ? r : Math.min(Math.max(-r, -o), r)), (d = -h * h + u * (u + 2 * o) + l)); else (u = s > 0 ? -r : r), (h = Math.max(0, -(s * u + a))), (d = -h * h + u * (u + 2 * o) + l); return ( n && n.copy(this.direction).multiplyScalar(h).add(this.origin), i && i.copy($t).multiplyScalar(u).add(Kt), d ); } intersectSphere(t, e) { Qt.subVectors(t.center, this.origin); const n = Qt.dot(this.direction), i = Qt.dot(Qt) - n * n, r = t.radius * t.radius; if (i > r) return null; const s = Math.sqrt(r - i), a = n - s, o = n + s; return a < 0 && o < 0 ? null : a < 0 ? this.at(o, e) : this.at(a, e); } intersectsSphere(t) { return this.distanceSqToPoint(t.center) <= t.radius * t.radius; } distanceToPlane(t) { const e = t.normal.dot(this.direction); if (0 === e) return 0 === t.distanceToPoint(this.origin) ? 0 : null; const n = -(this.origin.dot(t.normal) + t.constant) / e; return n >= 0 ? n : null; } intersectPlane(t, e) { const n = this.distanceToPlane(t); return null === n ? null : this.at(n, e); } intersectsPlane(t) { const e = t.distanceToPoint(this.origin); if (0 === e) return !0; return t.normal.dot(this.direction) * e < 0; } intersectBox(t, e) { let n, i, r, s, a, o; const l = 1 / this.direction.x, c = 1 / this.direction.y, h = 1 / this.direction.z, u = this.origin; return ( l >= 0 ? ((n = (t.min.x - u.x) * l), (i = (t.max.x - u.x) * l)) : ((n = (t.max.x - u.x) * l), (i = (t.min.x - u.x) * l)), c >= 0 ? ((r = (t.min.y - u.y) * c), (s = (t.max.y - u.y) * c)) : ((r = (t.max.y - u.y) * c), (s = (t.min.y - u.y) * c)), n > s || r > i ? null : ((r > n || n != n) && (n = r), (s < i || i != i) && (i = s), h >= 0 ? ((a = (t.min.z - u.z) * h), (o = (t.max.z - u.z) * h)) : ((a = (t.max.z - u.z) * h), (o = (t.min.z - u.z) * h)), n > o || a > i ? null : ((a > n || n != n) && (n = a), (o < i || i != i) && (i = o), i < 0 ? null : this.at(n >= 0 ? n : i, e))) ); } intersectsBox(t) { return null !== this.intersectBox(t, Qt); } intersectTriangle(t, e, n, i, r) { ee.subVectors(e, t), ne.subVectors(n, t), ie.crossVectors(ee, ne); let s, a = this.direction.dot(ie); if (a > 0) { if (i) return null; s = 1; } else { if (!(a < 0)) return null; (s = -1), (a = -a); } te.subVectors(this.origin, t); const o = s * this.direction.dot(ne.crossVectors(te, ne)); if (o < 0) return null; const l = s * this.direction.dot(ee.cross(te)); if (l < 0) return null; if (o + l > a) return null; const c = -s * te.dot(ie); return c < 0 ? null : this.at(c / a, r); } applyMatrix4(t) { return ( this.origin.applyMatrix4(t), this.direction.transformDirection(t), this ); } equals(t) { return t.origin.equals(this.origin) && t.direction.equals(this.direction); } clone() { return new this.constructor().copy(this); } } class se { constructor() { (this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]), arguments.length > 0 && console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); } set(t, e, n, i, r, s, a, o, l, c, h, u, d, p, m, f) { const g = this.elements; return ( (g[0] = t), (g[4] = e), (g[8] = n), (g[12] = i), (g[1] = r), (g[5] = s), (g[9] = a), (g[13] = o), (g[2] = l), (g[6] = c), (g[10] = h), (g[14] = u), (g[3] = d), (g[7] = p), (g[11] = m), (g[15] = f), this ); } identity() { return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this; } clone() { return new se().fromArray(this.elements); } copy(t) { const e = this.elements, n = t.elements; return ( (e[0] = n[0]), (e[1] = n[1]), (e[2] = n[2]), (e[3] = n[3]), (e[4] = n[4]), (e[5] = n[5]), (e[6] = n[6]), (e[7] = n[7]), (e[8] = n[8]), (e[9] = n[9]), (e[10] = n[10]), (e[11] = n[11]), (e[12] = n[12]), (e[13] = n[13]), (e[14] = n[14]), (e[15] = n[15]), this ); } copyPosition(t) { const e = this.elements, n = t.elements; return (e[12] = n[12]), (e[13] = n[13]), (e[14] = n[14]), this; } setFromMatrix3(t) { const e = t.elements; return ( this.set( e[0], e[3], e[6], 0, e[1], e[4], e[7], 0, e[2], e[5], e[8], 0, 0, 0, 0, 1 ), this ); } extractBasis(t, e, n) { return ( t.setFromMatrixColumn(this, 0), e.setFromMatrixColumn(this, 1), n.setFromMatrixColumn(this, 2), this ); } makeBasis(t, e, n) { return ( this.set( t.x, e.x, n.x, 0, t.y, e.y, n.y, 0, t.z, e.z, n.z, 0, 0, 0, 0, 1 ), this ); } extractRotation(t) { const e = this.elements, n = t.elements, i = 1 / ae.setFromMatrixColumn(t, 0).length(), r = 1 / ae.setFromMatrixColumn(t, 1).length(), s = 1 / ae.setFromMatrixColumn(t, 2).length(); return ( (e[0] = n[0] * i), (e[1] = n[1] * i), (e[2] = n[2] * i), (e[3] = 0), (e[4] = n[4] * r), (e[5] = n[5] * r), (e[6] = n[6] * r), (e[7] = 0), (e[8] = n[8] * s), (e[9] = n[9] * s), (e[10] = n[10] * s), (e[11] = 0), (e[12] = 0), (e[13] = 0), (e[14] = 0), (e[15] = 1), this ); } makeRotationFromEuler(t) { (t && t.isEuler) || console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); const e = this.elements, n = t.x, i = t.y, r = t.z, s = Math.cos(n), a = Math.sin(n), o = Math.cos(i), l = Math.sin(i), c = Math.cos(r), h = Math.sin(r); if ('XYZ' === t.order) { const t = s * c, n = s * h, i = a * c, r = a * h; (e[0] = o * c), (e[4] = -o * h), (e[8] = l), (e[1] = n + i * l), (e[5] = t - r * l), (e[9] = -a * o), (e[2] = r - t * l), (e[6] = i + n * l), (e[10] = s * o); } else if ('YXZ' === t.order) { const t = o * c, n = o * h, i = l * c, r = l * h; (e[0] = t + r * a), (e[4] = i * a - n), (e[8] = s * l), (e[1] = s * h), (e[5] = s * c), (e[9] = -a), (e[2] = n * a - i), (e[6] = r + t * a), (e[10] = s * o); } else if ('ZXY' === t.order) { const t = o * c, n = o * h, i = l * c, r = l * h; (e[0] = t - r * a), (e[4] = -s * h), (e[8] = i + n * a), (e[1] = n + i * a), (e[5] = s * c), (e[9] = r - t * a), (e[2] = -s * l), (e[6] = a), (e[10] = s * o); } else if ('ZYX' === t.order) { const t = s * c, n = s * h, i = a * c, r = a * h; (e[0] = o * c), (e[4] = i * l - n), (e[8] = t * l + r), (e[1] = o * h), (e[5] = r * l + t), (e[9] = n * l - i), (e[2] = -l), (e[6] = a * o), (e[10] = s * o); } else if ('YZX' === t.order) { const t = s * o, n = s * l, i = a * o, r = a * l; (e[0] = o * c), (e[4] = r - t * h), (e[8] = i * h + n), (e[1] = h), (e[5] = s * c), (e[9] = -a * c), (e[2] = -l * c), (e[6] = n * h + i), (e[10] = t - r * h); } else if ('XZY' === t.order) { const t = s * o, n = s * l, i = a * o, r = a * l; (e[0] = o * c), (e[4] = -h), (e[8] = l * c), (e[1] = t * h + r), (e[5] = s * c), (e[9] = n * h - i), (e[2] = i * h - n), (e[6] = a * c), (e[10] = r * h + t); } return ( (e[3] = 0), (e[7] = 0), (e[11] = 0), (e[12] = 0), (e[13] = 0), (e[14] = 0), (e[15] = 1), this ); } makeRotationFromQuaternion(t) { return this.compose(le, t, ce); } lookAt(t, e, n) { const i = this.elements; return ( de.subVectors(t, e), 0 === de.lengthSq() && (de.z = 1), de.normalize(), he.crossVectors(n, de), 0 === he.lengthSq() && (1 === Math.abs(n.z) ? (de.x += 1e-4) : (de.z += 1e-4), de.normalize(), he.crossVectors(n, de)), he.normalize(), ue.crossVectors(de, he), (i[0] = he.x), (i[4] = ue.x), (i[8] = de.x), (i[1] = he.y), (i[5] = ue.y), (i[9] = de.y), (i[2] = he.z), (i[6] = ue.z), (i[10] = de.z), this ); } multiply(t, e) { return void 0 !== e ? (console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ), this.multiplyMatrices(t, e)) : this.multiplyMatrices(this, t); } premultiply(t) { return this.multiplyMatrices(t, this); } multiplyMatrices(t, e) { const n = t.elements, i = e.elements, r = this.elements, s = n[0], a = n[4], o = n[8], l = n[12], c = n[1], h = n[5], u = n[9], d = n[13], p = n[2], m = n[6], f = n[10], g = n[14], v = n[3], y = n[7], x = n[11], _ = n[15], w = i[0], b = i[4], M = i[8], S = i[12], T = i[1], E = i[5], A = i[9], L = i[13], R = i[2], C = i[6], P = i[10], D = i[14], I = i[3], N = i[7], B = i[11], z = i[15]; return ( (r[0] = s * w + a * T + o * R + l * I), (r[4] = s * b + a * E + o * C + l * N), (r[8] = s * M + a * A + o * P + l * B), (r[12] = s * S + a * L + o * D + l * z), (r[1] = c * w + h * T + u * R + d * I), (r[5] = c * b + h * E + u * C + d * N), (r[9] = c * M + h * A + u * P + d * B), (r[13] = c * S + h * L + u * D + d * z), (r[2] = p * w + m * T + f * R + g * I), (r[6] = p * b + m * E + f * C + g * N), (r[10] = p * M + m * A + f * P + g * B), (r[14] = p * S + m * L + f * D + g * z), (r[3] = v * w + y * T + x * R + _ * I), (r[7] = v * b + y * E + x * C + _ * N), (r[11] = v * M + y * A + x * P + _ * B), (r[15] = v * S + y * L + x * D + _ * z), this ); } multiplyScalar(t) { const e = this.elements; return ( (e[0] *= t), (e[4] *= t), (e[8] *= t), (e[12] *= t), (e[1] *= t), (e[5] *= t), (e[9] *= t), (e[13] *= t), (e[2] *= t), (e[6] *= t), (e[10] *= t), (e[14] *= t), (e[3] *= t), (e[7] *= t), (e[11] *= t), (e[15] *= t), this ); } determinant() { const t = this.elements, e = t[0], n = t[4], i = t[8], r = t[12], s = t[1], a = t[5], o = t[9], l = t[13], c = t[2], h = t[6], u = t[10], d = t[14]; return ( t[3] * (+r * o * h - i * l * h - r * a * u + n * l * u + i * a * d - n * o * d) + t[7] * (+e * o * d - e * l * u + r * s * u - i * s * d + i * l * c - r * o * c) + t[11] * (+e * l * h - e * a * d - r * s * h + n * s * d + r * a * c - n * l * c) + t[15] * (-i * a * c - e * o * h + e * a * u + i * s * h - n * s * u + n * o * c) ); } transpose() { const t = this.elements; let e; return ( (e = t[1]), (t[1] = t[4]), (t[4] = e), (e = t[2]), (t[2] = t[8]), (t[8] = e), (e = t[6]), (t[6] = t[9]), (t[9] = e), (e = t[3]), (t[3] = t[12]), (t[12] = e), (e = t[7]), (t[7] = t[13]), (t[13] = e), (e = t[11]), (t[11] = t[14]), (t[14] = e), this ); } setPosition(t, e, n) { const i = this.elements; return ( t.isVector3 ? ((i[12] = t.x), (i[13] = t.y), (i[14] = t.z)) : ((i[12] = t), (i[13] = e), (i[14] = n)), this ); } invert() { const t = this.elements, e = t[0], n = t[1], i = t[2], r = t[3], s = t[4], a = t[5], o = t[6], l = t[7], c = t[8], h = t[9], u = t[10], d = t[11], p = t[12], m = t[13], f = t[14], g = t[15], v = h * f * l - m * u * l + m * o * d - a * f * d - h * o * g + a * u * g, y = p * u * l - c * f * l - p * o * d + s * f * d + c * o * g - s * u * g, x = c * m * l - p * h * l + p * a * d - s * m * d - c * a * g + s * h * g, _ = p * h * o - c * m * o - p * a * u + s * m * u + c * a * f - s * h * f, w = e * v + n * y + i * x + r * _; if (0 === w) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); const b = 1 / w; return ( (t[0] = v * b), (t[1] = (m * u * r - h * f * r - m * i * d + n * f * d + h * i * g - n * u * g) * b), (t[2] = (a * f * r - m * o * r + m * i * l - n * f * l - a * i * g + n * o * g) * b), (t[3] = (h * o * r - a * u * r - h * i * l + n * u * l + a * i * d - n * o * d) * b), (t[4] = y * b), (t[5] = (c * f * r - p * u * r + p * i * d - e * f * d - c * i * g + e * u * g) * b), (t[6] = (p * o * r - s * f * r - p * i * l + e * f * l + s * i * g - e * o * g) * b), (t[7] = (s * u * r - c * o * r + c * i * l - e * u * l - s * i * d + e * o * d) * b), (t[8] = x * b), (t[9] = (p * h * r - c * m * r - p * n * d + e * m * d + c * n * g - e * h * g) * b), (t[10] = (s * m * r - p * a * r + p * n * l - e * m * l - s * n * g + e * a * g) * b), (t[11] = (c * a * r - s * h * r - c * n * l + e * h * l + s * n * d - e * a * d) * b), (t[12] = _ * b), (t[13] = (c * m * i - p * h * i + p * n * u - e * m * u - c * n * f + e * h * f) * b), (t[14] = (p * a * i - s * m * i - p * n * o + e * m * o + s * n * f - e * a * f) * b), (t[15] = (s * h * i - c * a * i + c * n * o - e * h * o - s * n * u + e * a * u) * b), this ); } scale(t) { const e = this.elements, n = t.x, i = t.y, r = t.z; return ( (e[0] *= n), (e[4] *= i), (e[8] *= r), (e[1] *= n), (e[5] *= i), (e[9] *= r), (e[2] *= n), (e[6] *= i), (e[10] *= r), (e[3] *= n), (e[7] *= i), (e[11] *= r), this ); } getMaxScaleOnAxis() { const t = this.elements, e = t[0] * t[0] + t[1] * t[1] + t[2] * t[2], n = t[4] * t[4] + t[5] * t[5] + t[6] * t[6], i = t[8] * t[8] + t[9] * t[9] + t[10] * t[10]; return Math.sqrt(Math.max(e, n, i)); } makeTranslation(t, e, n) { return this.set(1, 0, 0, t, 0, 1, 0, e, 0, 0, 1, n, 0, 0, 0, 1), this; } makeRotationX(t) { const e = Math.cos(t), n = Math.sin(t); return this.set(1, 0, 0, 0, 0, e, -n, 0, 0, n, e, 0, 0, 0, 0, 1), this; } makeRotationY(t) { const e = Math.cos(t), n = Math.sin(t); return this.set(e, 0, n, 0, 0, 1, 0, 0, -n, 0, e, 0, 0, 0, 0, 1), this; } makeRotationZ(t) { const e = Math.cos(t), n = Math.sin(t); return this.set(e, -n, 0, 0, n, e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this; } makeRotationAxis(t, e) { const n = Math.cos(e), i = Math.sin(e), r = 1 - n, s = t.x, a = t.y, o = t.z, l = r * s, c = r * a; return ( this.set( l * s + n, l * a - i * o, l * o + i * a, 0, l * a + i * o, c * a + n, c * o - i * s, 0, l * o - i * a, c * o + i * s, r * o * o + n, 0, 0, 0, 0, 1 ), this ); } makeScale(t, e, n) { return this.set(t, 0, 0, 0, 0, e, 0, 0, 0, 0, n, 0, 0, 0, 0, 1), this; } makeShear(t, e, n) { return this.set(1, e, n, 0, t, 1, n, 0, t, e, 1, 0, 0, 0, 0, 1), this; } compose(t, e, n) { const i = this.elements, r = e._x, s = e._y, a = e._z, o = e._w, l = r + r, c = s + s, h = a + a, u = r * l, d = r * c, p = r * h, m = s * c, f = s * h, g = a * h, v = o * l, y = o * c, x = o * h, _ = n.x, w = n.y, b = n.z; return ( (i[0] = (1 - (m + g)) * _), (i[1] = (d + x) * _), (i[2] = (p - y) * _), (i[3] = 0), (i[4] = (d - x) * w), (i[5] = (1 - (u + g)) * w), (i[6] = (f + v) * w), (i[7] = 0), (i[8] = (p + y) * b), (i[9] = (f - v) * b), (i[10] = (1 - (u + m)) * b), (i[11] = 0), (i[12] = t.x), (i[13] = t.y), (i[14] = t.z), (i[15] = 1), this ); } decompose(t, e, n) { const i = this.elements; let r = ae.set(i[0], i[1], i[2]).length(); const s = ae.set(i[4], i[5], i[6]).length(), a = ae.set(i[8], i[9], i[10]).length(); this.determinant() < 0 && (r = -r), (t.x = i[12]), (t.y = i[13]), (t.z = i[14]), oe.copy(this); const o = 1 / r, l = 1 / s, c = 1 / a; return ( (oe.elements[0] *= o), (oe.elements[1] *= o), (oe.elements[2] *= o), (oe.elements[4] *= l), (oe.elements[5] *= l), (oe.elements[6] *= l), (oe.elements[8] *= c), (oe.elements[9] *= c), (oe.elements[10] *= c), e.setFromRotationMatrix(oe), (n.x = r), (n.y = s), (n.z = a), this ); } makePerspective(t, e, n, i, r, s) { void 0 === s && console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); const a = this.elements, o = (2 * r) / (e - t), l = (2 * r) / (n - i), c = (e + t) / (e - t), h = (n + i) / (n - i), u = -(s + r) / (s - r), d = (-2 * s * r) / (s - r); return ( (a[0] = o), (a[4] = 0), (a[8] = c), (a[12] = 0), (a[1] = 0), (a[5] = l), (a[9] = h), (a[13] = 0), (a[2] = 0), (a[6] = 0), (a[10] = u), (a[14] = d), (a[3] = 0), (a[7] = 0), (a[11] = -1), (a[15] = 0), this ); } makeOrthographic(t, e, n, i, r, s) { const a = this.elements, o = 1 / (e - t), l = 1 / (n - i), c = 1 / (s - r), h = (e + t) * o, u = (n + i) * l, d = (s + r) * c; return ( (a[0] = 2 * o), (a[4] = 0), (a[8] = 0), (a[12] = -h), (a[1] = 0), (a[5] = 2 * l), (a[9] = 0), (a[13] = -u), (a[2] = 0), (a[6] = 0), (a[10] = -2 * c), (a[14] = -d), (a[3] = 0), (a[7] = 0), (a[11] = 0), (a[15] = 1), this ); } equals(t) { const e = this.elements, n = t.elements; for (let t = 0; t < 16; t++) if (e[t] !== n[t]) return !1; return !0; } fromArray(t, e = 0) { for (let n = 0; n < 16; n++) this.elements[n] = t[n + e]; return this; } toArray(t = [], e = 0) { const n = this.elements; return ( (t[e] = n[0]), (t[e + 1] = n[1]), (t[e + 2] = n[2]), (t[e + 3] = n[3]), (t[e + 4] = n[4]), (t[e + 5] = n[5]), (t[e + 6] = n[6]), (t[e + 7] = n[7]), (t[e + 8] = n[8]), (t[e + 9] = n[9]), (t[e + 10] = n[10]), (t[e + 11] = n[11]), (t[e + 12] = n[12]), (t[e + 13] = n[13]), (t[e + 14] = n[14]), (t[e + 15] = n[15]), t ); } } se.prototype.isMatrix4 = !0; const ae = new Lt(), oe = new se(), le = new Lt(0, 0, 0), ce = new Lt(1, 1, 1), he = new Lt(), ue = new Lt(), de = new Lt(), pe = new se(), me = new At(); class fe { constructor(t = 0, e = 0, n = 0, i = fe.DefaultOrder) { (this._x = t), (this._y = e), (this._z = n), (this._order = i); } get x() { return this._x; } set x(t) { (this._x = t), this._onChangeCallback(); } get y() { return this._y; } set y(t) { (this._y = t), this._onChangeCallback(); } get z() { return this._z; } set z(t) { (this._z = t), this._onChangeCallback(); } get order() { return this._order; } set order(t) { (this._order = t), this._onChangeCallback(); } set(t, e, n, i) { return ( (this._x = t), (this._y = e), (this._z = n), (this._order = i || this._order), this._onChangeCallback(), this ); } clone() { return new this.constructor(this._x, this._y, this._z, this._order); } copy(t) { return ( (this._x = t._x), (this._y = t._y), (this._z = t._z), (this._order = t._order), this._onChangeCallback(), this ); } setFromRotationMatrix(t, e, n) { const i = t.elements, r = i[0], s = i[4], a = i[8], o = i[1], l = i[5], c = i[9], h = i[2], u = i[6], d = i[10]; switch ((e = e || this._order)) { case 'XYZ': (this._y = Math.asin(ht(a, -1, 1))), Math.abs(a) < 0.9999999 ? ((this._x = Math.atan2(-c, d)), (this._z = Math.atan2(-s, r))) : ((this._x = Math.atan2(u, l)), (this._z = 0)); break; case 'YXZ': (this._x = Math.asin(-ht(c, -1, 1))), Math.abs(c) < 0.9999999 ? ((this._y = Math.atan2(a, d)), (this._z = Math.atan2(o, l))) : ((this._y = Math.atan2(-h, r)), (this._z = 0)); break; case 'ZXY': (this._x = Math.asin(ht(u, -1, 1))), Math.abs(u) < 0.9999999 ? ((this._y = Math.atan2(-h, d)), (this._z = Math.atan2(-s, l))) : ((this._y = 0), (this._z = Math.atan2(o, r))); break; case 'ZYX': (this._y = Math.asin(-ht(h, -1, 1))), Math.abs(h) < 0.9999999 ? ((this._x = Math.atan2(u, d)), (this._z = Math.atan2(o, r))) : ((this._x = 0), (this._z = Math.atan2(-s, l))); break; case 'YZX': (this._z = Math.asin(ht(o, -1, 1))), Math.abs(o) < 0.9999999 ? ((this._x = Math.atan2(-c, l)), (this._y = Math.atan2(-h, r))) : ((this._x = 0), (this._y = Math.atan2(a, d))); break; case 'XZY': (this._z = Math.asin(-ht(s, -1, 1))), Math.abs(s) < 0.9999999 ? ((this._x = Math.atan2(u, l)), (this._y = Math.atan2(a, r))) : ((this._x = Math.atan2(-c, d)), (this._y = 0)); break; default: console.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + e ); } return (this._order = e), !1 !== n && this._onChangeCallback(), this; } setFromQuaternion(t, e, n) { return ( pe.makeRotationFromQuaternion(t), this.setFromRotationMatrix(pe, e, n) ); } setFromVector3(t, e) { return this.set(t.x, t.y, t.z, e || this._order); } reorder(t) { return me.setFromEuler(this), this.setFromQuaternion(me, t); } equals(t) { return ( t._x === this._x && t._y === this._y && t._z === this._z && t._order === this._order ); } fromArray(t) { return ( (this._x = t[0]), (this._y = t[1]), (this._z = t[2]), void 0 !== t[3] && (this._order = t[3]), this._onChangeCallback(), this ); } toArray(t = [], e = 0) { return ( (t[e] = this._x), (t[e + 1] = this._y), (t[e + 2] = this._z), (t[e + 3] = this._order), t ); } toVector3(t) { return t ? t.set(this._x, this._y, this._z) : new Lt(this._x, this._y, this._z); } _onChange(t) { return (this._onChangeCallback = t), this; } _onChangeCallback() {} } (fe.prototype.isEuler = !0), (fe.DefaultOrder = 'XYZ'), (fe.RotationOrders = ['XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX']); class ge { constructor() { this.mask = 1; } set(t) { this.mask = (1 << t) | 0; } enable(t) { this.mask |= (1 << t) | 0; } enableAll() { this.mask = -1; } toggle(t) { this.mask ^= (1 << t) | 0; } disable(t) { this.mask &= ~((1 << t) | 0); } disableAll() { this.mask = 0; } test(t) { return 0 != (this.mask & t.mask); } } let ve = 0; const ye = new Lt(), xe = new At(), _e = new se(), we = new Lt(), be = new Lt(), Me = new Lt(), Se = new At(), Te = new Lt(1, 0, 0), Ee = new Lt(0, 1, 0), Ae = new Lt(0, 0, 1), Le = { type: 'added' }, Re = { type: 'removed' }; class Ce extends rt { constructor() { super(), Object.defineProperty(this, 'id', { value: ve++ }), (this.uuid = ct()), (this.name = ''), (this.type = 'Object3D'), (this.parent = null), (this.children = []), (this.up = Ce.DefaultUp.clone()); const t = new Lt(), e = new fe(), n = new At(), i = new Lt(1, 1, 1); e._onChange(function () { n.setFromEuler(e, !1); }), n._onChange(function () { e.setFromQuaternion(n, void 0, !1); }), Object.defineProperties(this, { position: { configurable: !0, enumerable: !0, value: t }, rotation: { configurable: !0, enumerable: !0, value: e }, quaternion: { configurable: !0, enumerable: !0, value: n }, scale: { configurable: !0, enumerable: !0, value: i }, modelViewMatrix: { value: new se() }, normalMatrix: { value: new yt() }, }), (this.matrix = new se()), (this.matrixWorld = new se()), (this.matrixAutoUpdate = Ce.DefaultMatrixAutoUpdate), (this.matrixWorldNeedsUpdate = !1), (this.layers = new ge()), (this.visible = !0), (this.castShadow = !1), (this.receiveShadow = !1), (this.frustumCulled = !0), (this.renderOrder = 0), (this.animations = []), (this.userData = {}); } onBeforeRender() {} onAfterRender() {} applyMatrix4(t) { this.matrixAutoUpdate && this.updateMatrix(), this.matrix.premultiply(t), this.matrix.decompose(this.position, this.quaternion, this.scale); } applyQuaternion(t) { return this.quaternion.premultiply(t), this; } setRotationFromAxisAngle(t, e) { this.quaternion.setFromAxisAngle(t, e); } setRotationFromEuler(t) { this.quaternion.setFromEuler(t, !0); } setRotationFromMatrix(t) { this.quaternion.setFromRotationMatrix(t); } setRotationFromQuaternion(t) { this.quaternion.copy(t); } rotateOnAxis(t, e) { return xe.setFromAxisAngle(t, e), this.quaternion.multiply(xe), this; } rotateOnWorldAxis(t, e) { return xe.setFromAxisAngle(t, e), this.quaternion.premultiply(xe), this; } rotateX(t) { return this.rotateOnAxis(Te, t); } rotateY(t) { return this.rotateOnAxis(Ee, t); } rotateZ(t) { return this.rotateOnAxis(Ae, t); } translateOnAxis(t, e) { return ( ye.copy(t).applyQuaternion(this.quaternion), this.position.add(ye.multiplyScalar(e)), this ); } translateX(t) { return this.translateOnAxis(Te, t); } translateY(t) { return this.translateOnAxis(Ee, t); } translateZ(t) { return this.translateOnAxis(Ae, t); } localToWorld(t) { return t.applyMatrix4(this.matrixWorld); } worldToLocal(t) { return t.applyMatrix4(_e.copy(this.matrixWorld).invert()); } lookAt(t, e, n) { t.isVector3 ? we.copy(t) : we.set(t, e, n); const i = this.parent; this.updateWorldMatrix(!0, !1), be.setFromMatrixPosition(this.matrixWorld), this.isCamera || this.isLight ? _e.lookAt(be, we, this.up) : _e.lookAt(we, be, this.up), this.quaternion.setFromRotationMatrix(_e), i && (_e.extractRotation(i.matrixWorld), xe.setFromRotationMatrix(_e), this.quaternion.premultiply(xe.invert())); } add(t) { if (arguments.length > 1) { for (let t = 0; t < arguments.length; t++) this.add(arguments[t]); return this; } return t === this ? (console.error( "THREE.Object3D.add: object can't be added as a child of itself.", t ), this) : (t && t.isObject3D ? (null !== t.parent && t.parent.remove(t), (t.parent = this), this.children.push(t), t.dispatchEvent(Le)) : console.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', t ), this); } remove(t) { if (arguments.length > 1) { for (let t = 0; t < arguments.length; t++) this.remove(arguments[t]); return this; } const e = this.children.indexOf(t); return ( -1 !== e && ((t.parent = null), this.children.splice(e, 1), t.dispatchEvent(Re)), this ); } clear() { for (let t = 0; t < this.children.length; t++) { const e = this.children[t]; (e.parent = null), e.dispatchEvent(Re); } return (this.children.length = 0), this; } attach(t) { return ( this.updateWorldMatrix(!0, !1), _e.copy(this.matrixWorld).invert(), null !== t.parent && (t.parent.updateWorldMatrix(!0, !1), _e.multiply(t.parent.matrixWorld)), t.applyMatrix4(_e), this.add(t), t.updateWorldMatrix(!1, !0), this ); } getObjectById(t) { return this.getObjectByProperty('id', t); } getObjectByName(t) { return this.getObjectByProperty('name', t); } getObjectByProperty(t, e) { if (this[t] === e) return this; for (let n = 0, i = this.children.length; n < i; n++) { const i = this.children[n].getObjectByProperty(t, e); if (void 0 !== i) return i; } } getWorldPosition(t) { return ( void 0 === t && (console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' ), (t = new Lt())), this.updateWorldMatrix(!0, !1), t.setFromMatrixPosition(this.matrixWorld) ); } getWorldQuaternion(t) { return ( void 0 === t && (console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' ), (t = new At())), this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(be, t, Me), t ); } getWorldScale(t) { return ( void 0 === t && (console.warn( 'THREE.Object3D: .getWorldScale() target is now required' ), (t = new Lt())), this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(be, Se, t), t ); } getWorldDirection(t) { void 0 === t && (console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' ), (t = new Lt())), this.updateWorldMatrix(!0, !1); const e = this.matrixWorld.elements; return t.set(e[8], e[9], e[10]).normalize(); } raycast() {} traverse(t) { t(this); const e = this.children; for (let n = 0, i = e.length; n < i; n++) e[n].traverse(t); } traverseVisible(t) { if (!1 === this.visible) return; t(this); const e = this.children; for (let n = 0, i = e.length; n < i; n++) e[n].traverseVisible(t); } traverseAncestors(t) { const e = this.parent; null !== e && (t(e), e.traverseAncestors(t)); } updateMatrix() { this.matrix.compose(this.position, this.quaternion, this.scale), (this.matrixWorldNeedsUpdate = !0); } updateMatrixWorld(t) { this.matrixAutoUpdate && this.updateMatrix(), (this.matrixWorldNeedsUpdate || t) && (null === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ), (this.matrixWorldNeedsUpdate = !1), (t = !0)); const e = this.children; for (let n = 0, i = e.length; n < i; n++) e[n].updateMatrixWorld(t); } updateWorldMatrix(t, e) { const n = this.parent; if ( (!0 === t && null !== n && n.updateWorldMatrix(!0, !1), this.matrixAutoUpdate && this.updateMatrix(), null === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ), !0 === e) ) { const t = this.children; for (let e = 0, n = t.length; e < n; e++) t[e].updateWorldMatrix(!1, !0); } } toJSON(t) { const e = void 0 === t || 'string' == typeof t, n = {}; e && ((t = { geometries: {}, materials: {}, textures: {}, images: {}, shapes: {}, skeletons: {}, animations: {}, }), (n.metadata = { version: 4.5, type: 'Object', generator: 'Object3D.toJSON', })); const i = {}; function r(e, n) { return void 0 === e[n.uuid] && (e[n.uuid] = n.toJSON(t)), n.uuid; } if ( ((i.uuid = this.uuid), (i.type = this.type), '' !== this.name && (i.name = this.name), !0 === this.castShadow && (i.castShadow = !0), !0 === this.receiveShadow && (i.receiveShadow = !0), !1 === this.visible && (i.visible = !1), !1 === this.frustumCulled && (i.frustumCulled = !1), 0 !== this.renderOrder && (i.renderOrder = this.renderOrder), '{}' !== JSON.stringify(this.userData) && (i.userData = this.userData), (i.layers = this.layers.mask), (i.matrix = this.matrix.toArray()), !1 === this.matrixAutoUpdate && (i.matrixAutoUpdate = !1), this.isInstancedMesh && ((i.type = 'InstancedMesh'), (i.count = this.count), (i.instanceMatrix = this.instanceMatrix.toJSON()), null !== this.instanceColor && (i.instanceColor = this.instanceColor.toJSON())), this.isMesh || this.isLine || this.isPoints) ) { i.geometry = r(t.geometries, this.geometry); const e = this.geometry.parameters; if (void 0 !== e && void 0 !== e.shapes) { const n = e.shapes; if (Array.isArray(n)) for (let e = 0, i = n.length; e < i; e++) { const i = n[e]; r(t.shapes, i); } else r(t.shapes, n); } } if ( (this.isSkinnedMesh && ((i.bindMode = this.bindMode), (i.bindMatrix = this.bindMatrix.toArray()), void 0 !== this.skeleton && (r(t.skeletons, this.skeleton), (i.skeleton = this.skeleton.uuid))), void 0 !== this.material) ) if (Array.isArray(this.material)) { const e = []; for (let n = 0, i = this.material.length; n < i; n++) e.push(r(t.materials, this.material[n])); i.material = e; } else i.material = r(t.materials, this.material); if (this.children.length > 0) { i.children = []; for (let e = 0; e < this.children.length; e++) i.children.push(this.children[e].toJSON(t).object); } if (this.animations.length > 0) { i.animations = []; for (let e = 0; e < this.animations.length; e++) { const n = this.animations[e]; i.animations.push(r(t.animations, n)); } } if (e) { const e = s(t.geometries), i = s(t.materials), r = s(t.textures), a = s(t.images), o = s(t.shapes), l = s(t.skeletons), c = s(t.animations); e.length > 0 && (n.geometries = e), i.length > 0 && (n.materials = i), r.length > 0 && (n.textures = r), a.length > 0 && (n.images = a), o.length > 0 && (n.shapes = o), l.length > 0 && (n.skeletons = l), c.length > 0 && (n.animations = c); } return (n.object = i), n; function s(t) { const e = []; for (const n in t) { const i = t[n]; delete i.metadata, e.push(i); } return e; } } clone(t) { return new this.constructor().copy(this, t); } copy(t, e = !0) { if ( ((this.name = t.name), this.up.copy(t.up), this.position.copy(t.position), (this.rotation.order = t.rotation.order), this.quaternion.copy(t.quaternion), this.scale.copy(t.scale), this.matrix.copy(t.matrix), this.matrixWorld.copy(t.matrixWorld), (this.matrixAutoUpdate = t.matrixAutoUpdate), (this.matrixWorldNeedsUpdate = t.matrixWorldNeedsUpdate), (this.layers.mask = t.layers.mask), (this.visible = t.visible), (this.castShadow = t.castShadow), (this.receiveShadow = t.receiveShadow), (this.frustumCulled = t.frustumCulled), (this.renderOrder = t.renderOrder), (this.userData = JSON.parse(JSON.stringify(t.userData))), !0 === e) ) for (let e = 0; e < t.children.length; e++) { const n = t.children[e]; this.add(n.clone()); } return this; } } (Ce.DefaultUp = new Lt(0, 1, 0)), (Ce.DefaultMatrixAutoUpdate = !0), (Ce.prototype.isObject3D = !0); const Pe = new Lt(), De = new Lt(), Ie = new yt(); class Ne { constructor(t = new Lt(1, 0, 0), e = 0) { (this.normal = t), (this.constant = e); } set(t, e) { return this.normal.copy(t), (this.constant = e), this; } setComponents(t, e, n, i) { return this.normal.set(t, e, n), (this.constant = i), this; } setFromNormalAndCoplanarPoint(t, e) { return this.normal.copy(t), (this.constant = -e.dot(this.normal)), this; } setFromCoplanarPoints(t, e, n) { const i = Pe.subVectors(n, e).cross(De.subVectors(t, e)).normalize(); return this.setFromNormalAndCoplanarPoint(i, t), this; } copy(t) { return this.normal.copy(t.normal), (this.constant = t.constant), this; } normalize() { const t = 1 / this.normal.length(); return this.normal.multiplyScalar(t), (this.constant *= t), this; } negate() { return (this.constant *= -1), this.normal.negate(), this; } distanceToPoint(t) { return this.normal.dot(t) + this.constant; } distanceToSphere(t) { return this.distanceToPoint(t.center) - t.radius; } projectPoint(t, e) { return ( void 0 === e && (console.warn('THREE.Plane: .projectPoint() target is now required'), (e = new Lt())), e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t) ); } intersectLine(t, e) { void 0 === e && (console.warn('THREE.Plane: .intersectLine() target is now required'), (e = new Lt())); const n = t.delta(Pe), i = this.normal.dot(n); if (0 === i) return 0 === this.distanceToPoint(t.start) ? e.copy(t.start) : null; const r = -(t.start.dot(this.normal) + this.constant) / i; return r < 0 || r > 1 ? null : e.copy(n).multiplyScalar(r).add(t.start); } intersectsLine(t) { const e = this.distanceToPoint(t.start), n = this.distanceToPoint(t.end); return (e < 0 && n > 0) || (n < 0 && e > 0); } intersectsBox(t) { return t.intersectsPlane(this); } intersectsSphere(t) { return t.intersectsPlane(this); } coplanarPoint(t) { return ( void 0 === t && (console.warn('THREE.Plane: .coplanarPoint() target is now required'), (t = new Lt())), t.copy(this.normal).multiplyScalar(-this.constant) ); } applyMatrix4(t, e) { const n = e || Ie.getNormalMatrix(t), i = this.coplanarPoint(Pe).applyMatrix4(t), r = this.normal.applyMatrix3(n).normalize(); return (this.constant = -i.dot(r)), this; } translate(t) { return (this.constant -= t.dot(this.normal)), this; } equals(t) { return t.normal.equals(this.normal) && t.constant === this.constant; } clone() { return new this.constructor().copy(this); } } Ne.prototype.isPlane = !0; const Be = new Lt(), ze = new Lt(), Fe = new Lt(), Oe = new Lt(), He = new Lt(), Ge = new Lt(), Ue = new Lt(), ke = new Lt(), Ve = new Lt(), We = new Lt(); class je { constructor(t = new Lt(), e = new Lt(), n = new Lt()) { (this.a = t), (this.b = e), (this.c = n); } static getNormal(t, e, n, i) { void 0 === i && (console.warn('THREE.Triangle: .getNormal() target is now required'), (i = new Lt())), i.subVectors(n, e), Be.subVectors(t, e), i.cross(Be); const r = i.lengthSq(); return r > 0 ? i.multiplyScalar(1 / Math.sqrt(r)) : i.set(0, 0, 0); } static getBarycoord(t, e, n, i, r) { Be.subVectors(i, e), ze.subVectors(n, e), Fe.subVectors(t, e); const s = Be.dot(Be), a = Be.dot(ze), o = Be.dot(Fe), l = ze.dot(ze), c = ze.dot(Fe), h = s * l - a * a; if ( (void 0 === r && (console.warn( 'THREE.Triangle: .getBarycoord() target is now required' ), (r = new Lt())), 0 === h) ) return r.set(-2, -1, -1); const u = 1 / h, d = (l * o - a * c) * u, p = (s * c - a * o) * u; return r.set(1 - d - p, p, d); } static containsPoint(t, e, n, i) { return ( this.getBarycoord(t, e, n, i, Oe), Oe.x >= 0 && Oe.y >= 0 && Oe.x + Oe.y <= 1 ); } static getUV(t, e, n, i, r, s, a, o) { return ( this.getBarycoord(t, e, n, i, Oe), o.set(0, 0), o.addScaledVector(r, Oe.x), o.addScaledVector(s, Oe.y), o.addScaledVector(a, Oe.z), o ); } static isFrontFacing(t, e, n, i) { return Be.subVectors(n, e), ze.subVectors(t, e), Be.cross(ze).dot(i) < 0; } set(t, e, n) { return this.a.copy(t), this.b.copy(e), this.c.copy(n), this; } setFromPointsAndIndices(t, e, n, i) { return this.a.copy(t[e]), this.b.copy(t[n]), this.c.copy(t[i]), this; } clone() { return new this.constructor().copy(this); } copy(t) { return this.a.copy(t.a), this.b.copy(t.b), this.c.copy(t.c), this; } getArea() { return ( Be.subVectors(this.c, this.b), ze.subVectors(this.a, this.b), 0.5 * Be.cross(ze).length() ); } getMidpoint(t) { return ( void 0 === t && (console.warn( 'THREE.Triangle: .getMidpoint() target is now required' ), (t = new Lt())), t .addVectors(this.a, this.b) .add(this.c) .multiplyScalar(1 / 3) ); } getNormal(t) { return je.getNormal(this.a, this.b, this.c, t); } getPlane(t) { return ( void 0 === t && (console.warn('THREE.Triangle: .getPlane() target is now required'), (t = new Ne())), t.setFromCoplanarPoints(this.a, this.b, this.c) ); } getBarycoord(t, e) { return je.getBarycoord(t, this.a, this.b, this.c, e); } getUV(t, e, n, i, r) { return je.getUV(t, this.a, this.b, this.c, e, n, i, r); } containsPoint(t) { return je.containsPoint(t, this.a, this.b, this.c); } isFrontFacing(t) { return je.isFrontFacing(this.a, this.b, this.c, t); } intersectsBox(t) { return t.intersectsTriangle(this); } closestPointToPoint(t, e) { void 0 === e && (console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' ), (e = new Lt())); const n = this.a, i = this.b, r = this.c; let s, a; He.subVectors(i, n), Ge.subVectors(r, n), ke.subVectors(t, n); const o = He.dot(ke), l = Ge.dot(ke); if (o <= 0 && l <= 0) return e.copy(n); Ve.subVectors(t, i); const c = He.dot(Ve), h = Ge.dot(Ve); if (c >= 0 && h <= c) return e.copy(i); const u = o * h - c * l; if (u <= 0 && o >= 0 && c <= 0) return (s = o / (o - c)), e.copy(n).addScaledVector(He, s); We.subVectors(t, r); const d = He.dot(We), p = Ge.dot(We); if (p >= 0 && d <= p) return e.copy(r); const m = d * l - o * p; if (m <= 0 && l >= 0 && p <= 0) return (a = l / (l - p)), e.copy(n).addScaledVector(Ge, a); const f = c * p - d * h; if (f <= 0 && h - c >= 0 && d - p >= 0) return ( Ue.subVectors(r, i), (a = (h - c) / (h - c + (d - p))), e.copy(i).addScaledVector(Ue, a) ); const g = 1 / (f + m + u); return ( (s = m * g), (a = u * g), e.copy(n).addScaledVector(He, s).addScaledVector(Ge, a) ); } equals(t) { return t.a.equals(this.a) && t.b.equals(this.b) && t.c.equals(this.c); } } let qe = 0; function Xe() { Object.defineProperty(this, 'id', { value: qe++ }), (this.uuid = ct()), (this.name = ''), (this.type = 'Material'), (this.fog = !0), (this.blending = 1), (this.side = 0), (this.vertexColors = !1), (this.opacity = 1), (this.transparent = !1), (this.blendSrc = 204), (this.blendDst = 205), (this.blendEquation = n), (this.blendSrcAlpha = null), (this.blendDstAlpha = null), (this.blendEquationAlpha = null), (this.depthFunc = 3), (this.depthTest = !0), (this.depthWrite = !0), (this.stencilWriteMask = 255), (this.stencilFunc = 519), (this.stencilRef = 0), (this.stencilFuncMask = 255), (this.stencilFail = tt), (this.stencilZFail = tt), (this.stencilZPass = tt), (this.stencilWrite = !1), (this.clippingPlanes = null), (this.clipIntersection = !1), (this.clipShadows = !1), (this.shadowSide = null), (this.colorWrite = !0), (this.precision = null), (this.polygonOffset = !1), (this.polygonOffsetFactor = 0), (this.polygonOffsetUnits = 0), (this.dithering = !1), (this.alphaTest = 0), (this.alphaToCoverage = !1), (this.premultipliedAlpha = !1), (this.visible = !0), (this.toneMapped = !0), (this.userData = {}), (this.version = 0); } (Xe.prototype = Object.assign(Object.create(rt.prototype), { constructor: Xe, isMaterial: !0, onBuild: function () {}, onBeforeCompile: function () {}, customProgramCacheKey: function () { return this.onBeforeCompile.toString(); }, setValues: function (t) { if (void 0 !== t) for (const e in t) { const n = t[e]; if (void 0 === n) { console.warn("THREE.Material: '" + e + "' parameter is undefined."); continue; } if ('shading' === e) { console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ), (this.flatShading = 1 === n); continue; } const i = this[e]; void 0 !== i ? i && i.isColor ? i.set(n) : i && i.isVector3 && n && n.isVector3 ? i.copy(n) : (this[e] = n) : console.warn( 'THREE.' + this.type + ": '" + e + "' is not a property of this material." ); } }, toJSON: function (t) { const e = void 0 === t || 'string' == typeof t; e && (t = { textures: {}, images: {} }); const n = { metadata: { version: 4.5, type: 'Material', generator: 'Material.toJSON', }, }; function i(t) { const e = []; for (const n in t) { const i = t[n]; delete i.metadata, e.push(i); } return e; } if ( ((n.uuid = this.uuid), (n.type = this.type), '' !== this.name && (n.name = this.name), this.color && this.color.isColor && (n.color = this.color.getHex()), void 0 !== this.roughness && (n.roughness = this.roughness), void 0 !== this.metalness && (n.metalness = this.metalness), this.sheen && this.sheen.isColor && (n.sheen = this.sheen.getHex()), this.emissive && this.emissive.isColor && (n.emissive = this.emissive.getHex()), this.emissiveIntensity && 1 !== this.emissiveIntensity && (n.emissiveIntensity = this.emissiveIntensity), this.specular && this.specular.isColor && (n.specular = this.specular.getHex()), void 0 !== this.shininess && (n.shininess = this.shininess), void 0 !== this.clearcoat && (n.clearcoat = this.clearcoat), void 0 !== this.clearcoatRoughness && (n.clearcoatRoughness = this.clearcoatRoughness), this.clearcoatMap && this.clearcoatMap.isTexture && (n.clearcoatMap = this.clearcoatMap.toJSON(t).uuid), this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture && (n.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(t).uuid), this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture && ((n.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(t).uuid), (n.clearcoatNormalScale = this.clearcoatNormalScale.toArray())), this.map && this.map.isTexture && (n.map = this.map.toJSON(t).uuid), this.matcap && this.matcap.isTexture && (n.matcap = this.matcap.toJSON(t).uuid), this.alphaMap && this.alphaMap.isTexture && (n.alphaMap = this.alphaMap.toJSON(t).uuid), this.lightMap && this.lightMap.isTexture && ((n.lightMap = this.lightMap.toJSON(t).uuid), (n.lightMapIntensity = this.lightMapIntensity)), this.aoMap && this.aoMap.isTexture && ((n.aoMap = this.aoMap.toJSON(t).uuid), (n.aoMapIntensity = this.aoMapIntensity)), this.bumpMap && this.bumpMap.isTexture && ((n.bumpMap = this.bumpMap.toJSON(t).uuid), (n.bumpScale = this.bumpScale)), this.normalMap && this.normalMap.isTexture && ((n.normalMap = this.normalMap.toJSON(t).uuid), (n.normalMapType = this.normalMapType), (n.normalScale = this.normalScale.toArray())), this.displacementMap && this.displacementMap.isTexture && ((n.displacementMap = this.displacementMap.toJSON(t).uuid), (n.displacementScale = this.displacementScale), (n.displacementBias = this.displacementBias)), this.roughnessMap && this.roughnessMap.isTexture && (n.roughnessMap = this.roughnessMap.toJSON(t).uuid), this.metalnessMap && this.metalnessMap.isTexture && (n.metalnessMap = this.metalnessMap.toJSON(t).uuid), this.emissiveMap && this.emissiveMap.isTexture && (n.emissiveMap = this.emissiveMap.toJSON(t).uuid), this.specularMap && this.specularMap.isTexture && (n.specularMap = this.specularMap.toJSON(t).uuid), this.envMap && this.envMap.isTexture && ((n.envMap = this.envMap.toJSON(t).uuid), void 0 !== this.combine && (n.combine = this.combine)), void 0 !== this.envMapIntensity && (n.envMapIntensity = this.envMapIntensity), void 0 !== this.reflectivity && (n.reflectivity = this.reflectivity), void 0 !== this.refractionRatio && (n.refractionRatio = this.refractionRatio), this.gradientMap && this.gradientMap.isTexture && (n.gradientMap = this.gradientMap.toJSON(t).uuid), void 0 !== this.size && (n.size = this.size), null !== this.shadowSide && (n.shadowSide = this.shadowSide), void 0 !== this.sizeAttenuation && (n.sizeAttenuation = this.sizeAttenuation), 1 !== this.blending && (n.blending = this.blending), 0 !== this.side && (n.side = this.side), this.vertexColors && (n.vertexColors = !0), this.opacity < 1 && (n.opacity = this.opacity), !0 === this.transparent && (n.transparent = this.transparent), (n.depthFunc = this.depthFunc), (n.depthTest = this.depthTest), (n.depthWrite = this.depthWrite), (n.colorWrite = this.colorWrite), (n.stencilWrite = this.stencilWrite), (n.stencilWriteMask = this.stencilWriteMask), (n.stencilFunc = this.stencilFunc), (n.stencilRef = this.stencilRef), (n.stencilFuncMask = this.stencilFuncMask), (n.stencilFail = this.stencilFail), (n.stencilZFail = this.stencilZFail), (n.stencilZPass = this.stencilZPass), this.rotation && 0 !== this.rotation && (n.rotation = this.rotation), !0 === this.polygonOffset && (n.polygonOffset = !0), 0 !== this.polygonOffsetFactor && (n.polygonOffsetFactor = this.polygonOffsetFactor), 0 !== this.polygonOffsetUnits && (n.polygonOffsetUnits = this.polygonOffsetUnits), this.linewidth && 1 !== this.linewidth && (n.linewidth = this.linewidth), void 0 !== this.dashSize && (n.dashSize = this.dashSize), void 0 !== this.gapSize && (n.gapSize = this.gapSize), void 0 !== this.scale && (n.scale = this.scale), !0 === this.dithering && (n.dithering = !0), this.alphaTest > 0 && (n.alphaTest = this.alphaTest), !0 === this.alphaToCoverage && (n.alphaToCoverage = this.alphaToCoverage), !0 === this.premultipliedAlpha && (n.premultipliedAlpha = this.premultipliedAlpha), !0 === this.wireframe && (n.wireframe = this.wireframe), this.wireframeLinewidth > 1 && (n.wireframeLinewidth = this.wireframeLinewidth), 'round' !== this.wireframeLinecap && (n.wireframeLinecap = this.wireframeLinecap), 'round' !== this.wireframeLinejoin && (n.wireframeLinejoin = this.wireframeLinejoin), !0 === this.morphTargets && (n.morphTargets = !0), !0 === this.morphNormals && (n.morphNormals = !0), !0 === this.skinning && (n.skinning = !0), !0 === this.flatShading && (n.flatShading = this.flatShading), !1 === this.visible && (n.visible = !1), !1 === this.toneMapped && (n.toneMapped = !1), '{}' !== JSON.stringify(this.userData) && (n.userData = this.userData), e) ) { const e = i(t.textures), r = i(t.images); e.length > 0 && (n.textures = e), r.length > 0 && (n.images = r); } return n; }, clone: function () { return new this.constructor().copy(this); }, copy: function (t) { (this.name = t.name), (this.fog = t.fog), (this.blending = t.blending), (this.side = t.side), (this.vertexColors = t.vertexColors), (this.opacity = t.opacity), (this.transparent = t.transparent), (this.blendSrc = t.blendSrc), (this.blendDst = t.blendDst), (this.blendEquation = t.blendEquation), (this.blendSrcAlpha = t.blendSrcAlpha), (this.blendDstAlpha = t.blendDstAlpha), (this.blendEquationAlpha = t.blendEquationAlpha), (this.depthFunc = t.depthFunc), (this.depthTest = t.depthTest), (this.depthWrite = t.depthWrite), (this.stencilWriteMask = t.stencilWriteMask), (this.stencilFunc = t.stencilFunc), (this.stencilRef = t.stencilRef), (this.stencilFuncMask = t.stencilFuncMask), (this.stencilFail = t.stencilFail), (this.stencilZFail = t.stencilZFail), (this.stencilZPass = t.stencilZPass), (this.stencilWrite = t.stencilWrite); const e = t.clippingPlanes; let n = null; if (null !== e) { const t = e.length; n = new Array(t); for (let i = 0; i !== t; ++i) n[i] = e[i].clone(); } return ( (this.clippingPlanes = n), (this.clipIntersection = t.clipIntersection), (this.clipShadows = t.clipShadows), (this.shadowSide = t.shadowSide), (this.colorWrite = t.colorWrite), (this.precision = t.precision), (this.polygonOffset = t.polygonOffset), (this.polygonOffsetFactor = t.polygonOffsetFactor), (this.polygonOffsetUnits = t.polygonOffsetUnits), (this.dithering = t.dithering), (this.alphaTest = t.alphaTest), (this.alphaToCoverage = t.alphaToCoverage), (this.premultipliedAlpha = t.premultipliedAlpha), (this.visible = t.visible), (this.toneMapped = t.toneMapped), (this.userData = JSON.parse(JSON.stringify(t.userData))), this ); }, dispose: function () { this.dispatchEvent({ type: 'dispose' }); }, })), Object.defineProperty(Xe.prototype, 'needsUpdate', { set: function (t) { !0 === t && this.version++; }, }); const Ye = { aliceblue: 15792383, antiquewhite: 16444375, aqua: 65535, aquamarine: 8388564, azure: 15794175, beige: 16119260, bisque: 16770244, black: 0, blanchedalmond: 16772045, blue: 255, blueviolet: 9055202, brown: 10824234, burlywood: 14596231, cadetblue: 6266528, chartreuse: 8388352, chocolate: 13789470, coral: 16744272, cornflowerblue: 6591981, cornsilk: 16775388, crimson: 14423100, cyan: 65535, darkblue: 139, darkcyan: 35723, darkgoldenrod: 12092939, darkgray: 11119017, darkgreen: 25600, darkgrey: 11119017, darkkhaki: 12433259, darkmagenta: 9109643, darkolivegreen: 5597999, darkorange: 16747520, darkorchid: 10040012, darkred: 9109504, darksalmon: 15308410, darkseagreen: 9419919, darkslateblue: 4734347, darkslategray: 3100495, darkslategrey: 3100495, darkturquoise: 52945, darkviolet: 9699539, deeppink: 16716947, deepskyblue: 49151, dimgray: 6908265, dimgrey: 6908265, dodgerblue: 2003199, firebrick: 11674146, floralwhite: 16775920, forestgreen: 2263842, fuchsia: 16711935, gainsboro: 14474460, ghostwhite: 16316671, gold: 16766720, goldenrod: 14329120, gray: 8421504, green: 32768, greenyellow: 11403055, grey: 8421504, honeydew: 15794160, hotpink: 16738740, indianred: 13458524, indigo: 4915330, ivory: 16777200, khaki: 15787660, lavender: 15132410, lavenderblush: 16773365, lawngreen: 8190976, lemonchiffon: 16775885, lightblue: 11393254, lightcoral: 15761536, lightcyan: 14745599, lightgoldenrodyellow: 16448210, lightgray: 13882323, lightgreen: 9498256, lightgrey: 13882323, lightpink: 16758465, lightsalmon: 16752762, lightseagreen: 2142890, lightskyblue: 8900346, lightslategray: 7833753, lightslategrey: 7833753, lightsteelblue: 11584734, lightyellow: 16777184, lime: 65280, limegreen: 3329330, linen: 16445670, magenta: 16711935, maroon: 8388608, mediumaquamarine: 6737322, mediumblue: 205, mediumorchid: 12211667, mediumpurple: 9662683, mediumseagreen: 3978097, mediumslateblue: 8087790, mediumspringgreen: 64154, mediumturquoise: 4772300, mediumvioletred: 13047173, midnightblue: 1644912, mintcream: 16121850, mistyrose: 16770273, moccasin: 16770229, navajowhite: 16768685, navy: 128, oldlace: 16643558, olive: 8421376, olivedrab: 7048739, orange: 16753920, orangered: 16729344, orchid: 14315734, palegoldenrod: 15657130, palegreen: 10025880, paleturquoise: 11529966, palevioletred: 14381203, papayawhip: 16773077, peachpuff: 16767673, peru: 13468991, pink: 16761035, plum: 14524637, powderblue: 11591910, purple: 8388736, rebeccapurple: 6697881, red: 16711680, rosybrown: 12357519, royalblue: 4286945, saddlebrown: 9127187, salmon: 16416882, sandybrown: 16032864, seagreen: 3050327, seashell: 16774638, sienna: 10506797, silver: 12632256, skyblue: 8900331, slateblue: 6970061, slategray: 7372944, slategrey: 7372944, snow: 16775930, springgreen: 65407, steelblue: 4620980, tan: 13808780, teal: 32896, thistle: 14204888, tomato: 16737095, turquoise: 4251856, violet: 15631086, wheat: 16113331, white: 16777215, whitesmoke: 16119285, yellow: 16776960, yellowgreen: 10145074, }, Ze = { h: 0, s: 0, l: 0 }, Je = { h: 0, s: 0, l: 0 }; function Qe(t, e, n) { return ( n < 0 && (n += 1), n > 1 && (n -= 1), n < 1 / 6 ? t + 6 * (e - t) * n : n < 0.5 ? e : n < 2 / 3 ? t + 6 * (e - t) * (2 / 3 - n) : t ); } function Ke(t) { return t < 0.04045 ? 0.0773993808 * t : Math.pow(0.9478672986 * t + 0.0521327014, 2.4); } function $e(t) { return t < 0.0031308 ? 12.92 * t : 1.055 * Math.pow(t, 0.41666) - 0.055; } class tn { constructor(t, e, n) { return void 0 === e && void 0 === n ? this.set(t) : this.setRGB(t, e, n); } set(t) { return ( t && t.isColor ? this.copy(t) : 'number' == typeof t ? this.setHex(t) : 'string' == typeof t && this.setStyle(t), this ); } setScalar(t) { return (this.r = t), (this.g = t), (this.b = t), this; } setHex(t) { return ( (t = Math.floor(t)), (this.r = ((t >> 16) & 255) / 255), (this.g = ((t >> 8) & 255) / 255), (this.b = (255 & t) / 255), this ); } setRGB(t, e, n) { return (this.r = t), (this.g = e), (this.b = n), this; } setHSL(t, e, n) { if (((t = ut(t, 1)), (e = ht(e, 0, 1)), (n = ht(n, 0, 1)), 0 === e)) this.r = this.g = this.b = n; else { const i = n <= 0.5 ? n * (1 + e) : n + e - n * e, r = 2 * n - i; (this.r = Qe(r, i, t + 1 / 3)), (this.g = Qe(r, i, t)), (this.b = Qe(r, i, t - 1 / 3)); } return this; } setStyle(t) { function e(e) { void 0 !== e && parseFloat(e) < 1 && console.warn( 'THREE.Color: Alpha component of ' + t + ' will be ignored.' ); } let n; if ((n = /^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t))) { let t; const i = n[1], r = n[2]; switch (i) { case 'rgb': case 'rgba': if ( (t = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( r )) ) return ( (this.r = Math.min(255, parseInt(t[1], 10)) / 255), (this.g = Math.min(255, parseInt(t[2], 10)) / 255), (this.b = Math.min(255, parseInt(t[3], 10)) / 255), e(t[4]), this ); if ( (t = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( r )) ) return ( (this.r = Math.min(100, parseInt(t[1], 10)) / 100), (this.g = Math.min(100, parseInt(t[2], 10)) / 100), (this.b = Math.min(100, parseInt(t[3], 10)) / 100), e(t[4]), this ); break; case 'hsl': case 'hsla': if ( (t = /^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec( r )) ) { const n = parseFloat(t[1]) / 360, i = parseInt(t[2], 10) / 100, r = parseInt(t[3], 10) / 100; return e(t[4]), this.setHSL(n, i, r); } } } else if ((n = /^\#([A-Fa-f\d]+)$/.exec(t))) { const t = n[1], e = t.length; if (3 === e) return ( (this.r = parseInt(t.charAt(0) + t.charAt(0), 16) / 255), (this.g = parseInt(t.charAt(1) + t.charAt(1), 16) / 255), (this.b = parseInt(t.charAt(2) + t.charAt(2), 16) / 255), this ); if (6 === e) return ( (this.r = parseInt(t.charAt(0) + t.charAt(1), 16) / 255), (this.g = parseInt(t.charAt(2) + t.charAt(3), 16) / 255), (this.b = parseInt(t.charAt(4) + t.charAt(5), 16) / 255), this ); } return t && t.length > 0 ? this.setColorName(t) : this; } setColorName(t) { const e = Ye[t.toLowerCase()]; return ( void 0 !== e ? this.setHex(e) : console.warn('THREE.Color: Unknown color ' + t), this ); } clone() { return new this.constructor(this.r, this.g, this.b); } copy(t) { return (this.r = t.r), (this.g = t.g), (this.b = t.b), this; } copyGammaToLinear(t, e = 2) { return ( (this.r = Math.pow(t.r, e)), (this.g = Math.pow(t.g, e)), (this.b = Math.pow(t.b, e)), this ); } copyLinearToGamma(t, e = 2) { const n = e > 0 ? 1 / e : 1; return ( (this.r = Math.pow(t.r, n)), (this.g = Math.pow(t.g, n)), (this.b = Math.pow(t.b, n)), this ); } convertGammaToLinear(t) { return this.copyGammaToLinear(this, t), this; } convertLinearToGamma(t) { return this.copyLinearToGamma(this, t), this; } copySRGBToLinear(t) { return (this.r = Ke(t.r)), (this.g = Ke(t.g)), (this.b = Ke(t.b)), this; } copyLinearToSRGB(t) { return (this.r = $e(t.r)), (this.g = $e(t.g)), (this.b = $e(t.b)), this; } convertSRGBToLinear() { return this.copySRGBToLinear(this), this; } convertLinearToSRGB() { return this.copyLinearToSRGB(this), this; } getHex() { return ( ((255 * this.r) << 16) ^ ((255 * this.g) << 8) ^ ((255 * this.b) << 0) ); } getHexString() { return ('000000' + this.getHex().toString(16)).slice(-6); } getHSL(t) { void 0 === t && (console.warn('THREE.Color: .getHSL() target is now required'), (t = { h: 0, s: 0, l: 0 })); const e = this.r, n = this.g, i = this.b, r = Math.max(e, n, i), s = Math.min(e, n, i); let a, o; const l = (s + r) / 2; if (s === r) (a = 0), (o = 0); else { const t = r - s; switch (((o = l <= 0.5 ? t / (r + s) : t / (2 - r - s)), r)) { case e: a = (n - i) / t + (n < i ? 6 : 0); break; case n: a = (i - e) / t + 2; break; case i: a = (e - n) / t + 4; } a /= 6; } return (t.h = a), (t.s = o), (t.l = l), t; } getStyle() { return ( 'rgb(' + ((255 * this.r) | 0) + ',' + ((255 * this.g) | 0) + ',' + ((255 * this.b) | 0) + ')' ); } offsetHSL(t, e, n) { return ( this.getHSL(Ze), (Ze.h += t), (Ze.s += e), (Ze.l += n), this.setHSL(Ze.h, Ze.s, Ze.l), this ); } add(t) { return (this.r += t.r), (this.g += t.g), (this.b += t.b), this; } addColors(t, e) { return ( (this.r = t.r + e.r), (this.g = t.g + e.g), (this.b = t.b + e.b), this ); } addScalar(t) { return (this.r += t), (this.g += t), (this.b += t), this; } sub(t) { return ( (this.r = Math.max(0, this.r - t.r)), (this.g = Math.max(0, this.g - t.g)), (this.b = Math.max(0, this.b - t.b)), this ); } multiply(t) { return (this.r *= t.r), (this.g *= t.g), (this.b *= t.b), this; } multiplyScalar(t) { return (this.r *= t), (this.g *= t), (this.b *= t), this; } lerp(t, e) { return ( (this.r += (t.r - this.r) * e), (this.g += (t.g - this.g) * e), (this.b += (t.b - this.b) * e), this ); } lerpColors(t, e, n) { return ( (this.r = t.r + (e.r - t.r) * n), (this.g = t.g + (e.g - t.g) * n), (this.b = t.b + (e.b - t.b) * n), this ); } lerpHSL(t, e) { this.getHSL(Ze), t.getHSL(Je); const n = dt(Ze.h, Je.h, e), i = dt(Ze.s, Je.s, e), r = dt(Ze.l, Je.l, e); return this.setHSL(n, i, r), this; } equals(t) { return t.r === this.r && t.g === this.g && t.b === this.b; } fromArray(t, e = 0) { return (this.r = t[e]), (this.g = t[e + 1]), (this.b = t[e + 2]), this; } toArray(t = [], e = 0) { return (t[e] = this.r), (t[e + 1] = this.g), (t[e + 2] = this.b), t; } fromBufferAttribute(t, e) { return ( (this.r = t.getX(e)), (this.g = t.getY(e)), (this.b = t.getZ(e)), !0 === t.normalized && ((this.r /= 255), (this.g /= 255), (this.b /= 255)), this ); } toJSON() { return this.getHex(); } } (tn.NAMES = Ye), (tn.prototype.isColor = !0), (tn.prototype.r = 1), (tn.prototype.g = 1), (tn.prototype.b = 1); class en extends Xe { constructor(t) { super(), (this.type = 'MeshBasicMaterial'), (this.color = new tn(16777215)), (this.map = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.specularMap = null), (this.alphaMap = null), (this.envMap = null), (this.combine = 0), (this.reflectivity = 1), (this.refractionRatio = 0.98), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = 'round'), (this.wireframeLinejoin = 'round'), (this.skinning = !1), (this.morphTargets = !1), this.setValues(t); } copy(t) { return ( super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), (this.specularMap = t.specularMap), (this.alphaMap = t.alphaMap), (this.envMap = t.envMap), (this.combine = t.combine), (this.reflectivity = t.reflectivity), (this.refractionRatio = t.refractionRatio), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), this ); } } en.prototype.isMeshBasicMaterial = !0; const nn = new Lt(), rn = new vt(); class sn { constructor(t, e, n) { if (Array.isArray(t)) throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); (this.name = ''), (this.array = t), (this.itemSize = e), (this.count = void 0 !== t ? t.length / e : 0), (this.normalized = !0 === n), (this.usage = et), (this.updateRange = { offset: 0, count: -1 }), (this.version = 0), (this.onUploadCallback = function () {}); } set needsUpdate(t) { !0 === t && this.version++; } setUsage(t) { return (this.usage = t), this; } copy(t) { return ( (this.name = t.name), (this.array = new t.array.constructor(t.array)), (this.itemSize = t.itemSize), (this.count = t.count), (this.normalized = t.normalized), (this.usage = t.usage), this ); } copyAt(t, e, n) { (t *= this.itemSize), (n *= e.itemSize); for (let i = 0, r = this.itemSize; i < r; i++) this.array[t + i] = e.array[n + i]; return this; } copyArray(t) { return this.array.set(t), this; } copyColorsArray(t) { const e = this.array; let n = 0; for (let i = 0, r = t.length; i < r; i++) { let r = t[i]; void 0 === r && (console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ), (r = new tn())), (e[n++] = r.r), (e[n++] = r.g), (e[n++] = r.b); } return this; } copyVector2sArray(t) { const e = this.array; let n = 0; for (let i = 0, r = t.length; i < r; i++) { let r = t[i]; void 0 === r && (console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ), (r = new vt())), (e[n++] = r.x), (e[n++] = r.y); } return this; } copyVector3sArray(t) { const e = this.array; let n = 0; for (let i = 0, r = t.length; i < r; i++) { let r = t[i]; void 0 === r && (console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ), (r = new Lt())), (e[n++] = r.x), (e[n++] = r.y), (e[n++] = r.z); } return this; } copyVector4sArray(t) { const e = this.array; let n = 0; for (let i = 0, r = t.length; i < r; i++) { let r = t[i]; void 0 === r && (console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ), (r = new St())), (e[n++] = r.x), (e[n++] = r.y), (e[n++] = r.z), (e[n++] = r.w); } return this; } applyMatrix3(t) { if (2 === this.itemSize) for (let e = 0, n = this.count; e < n; e++) rn.fromBufferAttribute(this, e), rn.applyMatrix3(t), this.setXY(e, rn.x, rn.y); else if (3 === this.itemSize) for (let e = 0, n = this.count; e < n; e++) nn.fromBufferAttribute(this, e), nn.applyMatrix3(t), this.setXYZ(e, nn.x, nn.y, nn.z); return this; } applyMatrix4(t) { for (let e = 0, n = this.count; e < n; e++) (nn.x = this.getX(e)), (nn.y = this.getY(e)), (nn.z = this.getZ(e)), nn.applyMatrix4(t), this.setXYZ(e, nn.x, nn.y, nn.z); return this; } applyNormalMatrix(t) { for (let e = 0, n = this.count; e < n; e++) (nn.x = this.getX(e)), (nn.y = this.getY(e)), (nn.z = this.getZ(e)), nn.applyNormalMatrix(t), this.setXYZ(e, nn.x, nn.y, nn.z); return this; } transformDirection(t) { for (let e = 0, n = this.count; e < n; e++) (nn.x = this.getX(e)), (nn.y = this.getY(e)), (nn.z = this.getZ(e)), nn.transformDirection(t), this.setXYZ(e, nn.x, nn.y, nn.z); return this; } set(t, e = 0) { return this.array.set(t, e), this; } getX(t) { return this.array[t * this.itemSize]; } setX(t, e) { return (this.array[t * this.itemSize] = e), this; } getY(t) { return this.array[t * this.itemSize + 1]; } setY(t, e) { return (this.array[t * this.itemSize + 1] = e), this; } getZ(t) { return this.array[t * this.itemSize + 2]; } setZ(t, e) { return (this.array[t * this.itemSize + 2] = e), this; } getW(t) { return this.array[t * this.itemSize + 3]; } setW(t, e) { return (this.array[t * this.itemSize + 3] = e), this; } setXY(t, e, n) { return ( (t *= this.itemSize), (this.array[t + 0] = e), (this.array[t + 1] = n), this ); } setXYZ(t, e, n, i) { return ( (t *= this.itemSize), (this.array[t + 0] = e), (this.array[t + 1] = n), (this.array[t + 2] = i), this ); } setXYZW(t, e, n, i, r) { return ( (t *= this.itemSize), (this.array[t + 0] = e), (this.array[t + 1] = n), (this.array[t + 2] = i), (this.array[t + 3] = r), this ); } onUpload(t) { return (this.onUploadCallback = t), this; } clone() { return new this.constructor(this.array, this.itemSize).copy(this); } toJSON() { const t = { itemSize: this.itemSize, type: this.array.constructor.name, array: Array.prototype.slice.call(this.array), normalized: this.normalized, }; return ( '' !== this.name && (t.name = this.name), this.usage !== et && (t.usage = this.usage), (0 === this.updateRange.offset && -1 === this.updateRange.count) || (t.updateRange = this.updateRange), t ); } } sn.prototype.isBufferAttribute = !0; class an extends sn { constructor(t, e, n) { super(new Int8Array(t), e, n); } } class on extends sn { constructor(t, e, n) { super(new Uint8Array(t), e, n); } } class ln extends sn { constructor(t, e, n) { super(new Uint8ClampedArray(t), e, n); } } class cn extends sn { constructor(t, e, n) { super(new Int16Array(t), e, n); } } class hn extends sn { constructor(t, e, n) { super(new Uint16Array(t), e, n); } } class un extends sn { constructor(t, e, n) { super(new Int32Array(t), e, n); } } class dn extends sn { constructor(t, e, n) { super(new Uint32Array(t), e, n); } } class pn extends sn { constructor(t, e, n) { super(new Uint16Array(t), e, n); } } pn.prototype.isFloat16BufferAttribute = !0; class mn extends sn { constructor(t, e, n) { super(new Float32Array(t), e, n); } } class fn extends sn { constructor(t, e, n) { super(new Float64Array(t), e, n); } } function gn(t) { if (0 === t.length) return -1 / 0; let e = t[0]; for (let n = 1, i = t.length; n < i; ++n) t[n] > e && (e = t[n]); return e; } const vn = { Int8Array: Int8Array, Uint8Array: Uint8Array, Uint8ClampedArray: Uint8ClampedArray, Int16Array: Int16Array, Uint16Array: Uint16Array, Int32Array: Int32Array, Uint32Array: Uint32Array, Float32Array: Float32Array, Float64Array: Float64Array, }; function yn(t, e) { return new vn[t](e); } let xn = 0; const _n = new se(), wn = new Ce(), bn = new Lt(), Mn = new Pt(), Sn = new Pt(), Tn = new Lt(); class En extends rt { constructor() { super(), Object.defineProperty(this, 'id', { value: xn++ }), (this.uuid = ct()), (this.name = ''), (this.type = 'BufferGeometry'), (this.index = null), (this.attributes = {}), (this.morphAttributes = {}), (this.morphTargetsRelative = !1), (this.groups = []), (this.boundingBox = null), (this.boundingSphere = null), (this.drawRange = { start: 0, count: 1 / 0 }), (this.userData = {}); } getIndex() { return this.index; } setIndex(t) { return ( Array.isArray(t) ? (this.index = new (gn(t) > 65535 ? dn : hn)(t, 1)) : (this.index = t), this ); } getAttribute(t) { return this.attributes[t]; } setAttribute(t, e) { return (this.attributes[t] = e), this; } deleteAttribute(t) { return delete this.attributes[t], this; } hasAttribute(t) { return void 0 !== this.attributes[t]; } addGroup(t, e, n = 0) { this.groups.push({ start: t, count: e, materialIndex: n }); } clearGroups() { this.groups = []; } setDrawRange(t, e) { (this.drawRange.start = t), (this.drawRange.count = e); } applyMatrix4(t) { const e = this.attributes.position; void 0 !== e && (e.applyMatrix4(t), (e.needsUpdate = !0)); const n = this.attributes.normal; if (void 0 !== n) { const e = new yt().getNormalMatrix(t); n.applyNormalMatrix(e), (n.needsUpdate = !0); } const i = this.attributes.tangent; return ( void 0 !== i && (i.transformDirection(t), (i.needsUpdate = !0)), null !== this.boundingBox && this.computeBoundingBox(), null !== this.boundingSphere && this.computeBoundingSphere(), this ); } rotateX(t) { return _n.makeRotationX(t), this.applyMatrix4(_n), this; } rotateY(t) { return _n.makeRotationY(t), this.applyMatrix4(_n), this; } rotateZ(t) { return _n.makeRotationZ(t), this.applyMatrix4(_n), this; } translate(t, e, n) { return _n.makeTranslation(t, e, n), this.applyMatrix4(_n), this; } scale(t, e, n) { return _n.makeScale(t, e, n), this.applyMatrix4(_n), this; } lookAt(t) { return ( wn.lookAt(t), wn.updateMatrix(), this.applyMatrix4(wn.matrix), this ); } center() { return ( this.computeBoundingBox(), this.boundingBox.getCenter(bn).negate(), this.translate(bn.x, bn.y, bn.z), this ); } setFromPoints(t) { const e = []; for (let n = 0, i = t.length; n < i; n++) { const i = t[n]; e.push(i.x, i.y, i.z || 0); } return this.setAttribute('position', new mn(e, 3)), this; } computeBoundingBox() { null === this.boundingBox && (this.boundingBox = new Pt()); const t = this.attributes.position, e = this.morphAttributes.position; if (t && t.isGLBufferAttribute) return ( console.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".', this ), void this.boundingBox.set( new Lt(-1 / 0, -1 / 0, -1 / 0), new Lt(1 / 0, 1 / 0, 1 / 0) ) ); if (void 0 !== t) { if ((this.boundingBox.setFromBufferAttribute(t), e)) for (let t = 0, n = e.length; t < n; t++) { const n = e[t]; Mn.setFromBufferAttribute(n), this.morphTargetsRelative ? (Tn.addVectors(this.boundingBox.min, Mn.min), this.boundingBox.expandByPoint(Tn), Tn.addVectors(this.boundingBox.max, Mn.max), this.boundingBox.expandByPoint(Tn)) : (this.boundingBox.expandByPoint(Mn.min), this.boundingBox.expandByPoint(Mn.max)); } } else 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() { null === this.boundingSphere && (this.boundingSphere = new Jt()); const t = this.attributes.position, e = this.morphAttributes.position; if (t && t.isGLBufferAttribute) return ( console.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".', this ), void this.boundingSphere.set(new Lt(), 1 / 0) ); if (t) { const n = this.boundingSphere.center; if ((Mn.setFromBufferAttribute(t), e)) for (let t = 0, n = e.length; t < n; t++) { const n = e[t]; Sn.setFromBufferAttribute(n), this.morphTargetsRelative ? (Tn.addVectors(Mn.min, Sn.min), Mn.expandByPoint(Tn), Tn.addVectors(Mn.max, Sn.max), Mn.expandByPoint(Tn)) : (Mn.expandByPoint(Sn.min), Mn.expandByPoint(Sn.max)); } Mn.getCenter(n); let i = 0; for (let e = 0, r = t.count; e < r; e++) Tn.fromBufferAttribute(t, e), (i = Math.max(i, n.distanceToSquared(Tn))); if (e) for (let r = 0, s = e.length; r < s; r++) { const s = e[r], a = this.morphTargetsRelative; for (let e = 0, r = s.count; e < r; e++) Tn.fromBufferAttribute(s, e), a && (bn.fromBufferAttribute(t, e), Tn.add(bn)), (i = Math.max(i, n.distanceToSquared(Tn))); } (this.boundingSphere.radius = Math.sqrt(i)), isNaN(this.boundingSphere.radius) && console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); } } computeFaceNormals() {} computeTangents() { const t = this.index, e = this.attributes; if ( null === t || void 0 === e.position || void 0 === e.normal || void 0 === e.uv ) return void console.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' ); const n = t.array, i = e.position.array, r = e.normal.array, s = e.uv.array, a = i.length / 3; void 0 === e.tangent && this.setAttribute('tangent', new sn(new Float32Array(4 * a), 4)); const o = e.tangent.array, l = [], c = []; for (let t = 0; t < a; t++) (l[t] = new Lt()), (c[t] = new Lt()); const h = new Lt(), u = new Lt(), d = new Lt(), p = new vt(), m = new vt(), f = new vt(), g = new Lt(), v = new Lt(); function y(t, e, n) { h.fromArray(i, 3 * t), u.fromArray(i, 3 * e), d.fromArray(i, 3 * n), p.fromArray(s, 2 * t), m.fromArray(s, 2 * e), f.fromArray(s, 2 * n), u.sub(h), d.sub(h), m.sub(p), f.sub(p); const r = 1 / (m.x * f.y - f.x * m.y); isFinite(r) && (g .copy(u) .multiplyScalar(f.y) .addScaledVector(d, -m.y) .multiplyScalar(r), v .copy(d) .multiplyScalar(m.x) .addScaledVector(u, -f.x) .multiplyScalar(r), l[t].add(g), l[e].add(g), l[n].add(g), c[t].add(v), c[e].add(v), c[n].add(v)); } let x = this.groups; 0 === x.length && (x = [{ start: 0, count: n.length }]); for (let t = 0, e = x.length; t < e; ++t) { const e = x[t], i = e.start; for (let t = i, r = i + e.count; t < r; t += 3) y(n[t + 0], n[t + 1], n[t + 2]); } const _ = new Lt(), w = new Lt(), b = new Lt(), M = new Lt(); function S(t) { b.fromArray(r, 3 * t), M.copy(b); const e = l[t]; _.copy(e), _.sub(b.multiplyScalar(b.dot(e))).normalize(), w.crossVectors(M, e); const n = w.dot(c[t]) < 0 ? -1 : 1; (o[4 * t] = _.x), (o[4 * t + 1] = _.y), (o[4 * t + 2] = _.z), (o[4 * t + 3] = n); } for (let t = 0, e = x.length; t < e; ++t) { const e = x[t], i = e.start; for (let t = i, r = i + e.count; t < r; t += 3) S(n[t + 0]), S(n[t + 1]), S(n[t + 2]); } } computeVertexNormals() { const t = this.index, e = this.getAttribute('position'); if (void 0 !== e) { let n = this.getAttribute('normal'); if (void 0 === n) (n = new sn(new Float32Array(3 * e.count), 3)), this.setAttribute('normal', n); else for (let t = 0, e = n.count; t < e; t++) n.setXYZ(t, 0, 0, 0); const i = new Lt(), r = new Lt(), s = new Lt(), a = new Lt(), o = new Lt(), l = new Lt(), c = new Lt(), h = new Lt(); if (t) for (let u = 0, d = t.count; u < d; u += 3) { const d = t.getX(u + 0), p = t.getX(u + 1), m = t.getX(u + 2); i.fromBufferAttribute(e, d), r.fromBufferAttribute(e, p), s.fromBufferAttribute(e, m), c.subVectors(s, r), h.subVectors(i, r), c.cross(h), a.fromBufferAttribute(n, d), o.fromBufferAttribute(n, p), l.fromBufferAttribute(n, m), a.add(c), o.add(c), l.add(c), n.setXYZ(d, a.x, a.y, a.z), n.setXYZ(p, o.x, o.y, o.z), n.setXYZ(m, l.x, l.y, l.z); } else for (let t = 0, a = e.count; t < a; t += 3) i.fromBufferAttribute(e, t + 0), r.fromBufferAttribute(e, t + 1), s.fromBufferAttribute(e, t + 2), c.subVectors(s, r), h.subVectors(i, r), c.cross(h), n.setXYZ(t + 0, c.x, c.y, c.z), n.setXYZ(t + 1, c.x, c.y, c.z), n.setXYZ(t + 2, c.x, c.y, c.z); this.normalizeNormals(), (n.needsUpdate = !0); } } merge(t, e) { if (!t || !t.isBufferGeometry) return void console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', t ); void 0 === e && ((e = 0), console.warn( 'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.' )); const n = this.attributes; for (const i in n) { if (void 0 === t.attributes[i]) continue; const r = n[i].array, s = t.attributes[i], a = s.array, o = s.itemSize * e, l = Math.min(a.length, r.length - o); for (let t = 0, e = o; t < l; t++, e++) r[e] = a[t]; } return this; } normalizeNormals() { const t = this.attributes.normal; for (let e = 0, n = t.count; e < n; e++) Tn.fromBufferAttribute(t, e), Tn.normalize(), t.setXYZ(e, Tn.x, Tn.y, Tn.z); } toNonIndexed() { function t(t, e) { const n = t.array, i = t.itemSize, r = t.normalized, s = new n.constructor(e.length * i); let a = 0, o = 0; for (let t = 0, r = e.length; t < r; t++) { a = e[t] * i; for (let t = 0; t < i; t++) s[o++] = n[a++]; } return new sn(s, i, r); } if (null === this.index) return ( console.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' ), this ); const e = new En(), n = this.index.array, i = this.attributes; for (const r in i) { const s = t(i[r], n); e.setAttribute(r, s); } const r = this.morphAttributes; for (const i in r) { const s = [], a = r[i]; for (let e = 0, i = a.length; e < i; e++) { const i = t(a[e], n); s.push(i); } e.morphAttributes[i] = s; } e.morphTargetsRelative = this.morphTargetsRelative; const s = this.groups; for (let t = 0, n = s.length; t < n; t++) { const n = s[t]; e.addGroup(n.start, n.count, n.materialIndex); } return e; } toJSON() { const t = { metadata: { version: 4.5, type: 'BufferGeometry', generator: 'BufferGeometry.toJSON', }, }; if ( ((t.uuid = this.uuid), (t.type = this.type), '' !== this.name && (t.name = this.name), Object.keys(this.userData).length > 0 && (t.userData = this.userData), void 0 !== this.parameters) ) { const e = this.parameters; for (const n in e) void 0 !== e[n] && (t[n] = e[n]); return t; } t.data = { attributes: {} }; const e = this.index; null !== e && (t.data.index = { type: e.array.constructor.name, array: Array.prototype.slice.call(e.array), }); const n = this.attributes; for (const e in n) { const i = n[e]; t.data.attributes[e] = i.toJSON(t.data); } const i = {}; let r = !1; for (const e in this.morphAttributes) { const n = this.morphAttributes[e], s = []; for (let e = 0, i = n.length; e < i; e++) { const i = n[e]; s.push(i.toJSON(t.data)); } s.length > 0 && ((i[e] = s), (r = !0)); } r && ((t.data.morphAttributes = i), (t.data.morphTargetsRelative = this.morphTargetsRelative)); const s = this.groups; s.length > 0 && (t.data.groups = JSON.parse(JSON.stringify(s))); const a = this.boundingSphere; return ( null !== a && (t.data.boundingSphere = { center: a.center.toArray(), radius: a.radius, }), t ); } clone() { return new En().copy(this); } copy(t) { (this.index = null), (this.attributes = {}), (this.morphAttributes = {}), (this.groups = []), (this.boundingBox = null), (this.boundingSphere = null); const e = {}; this.name = t.name; const n = t.index; null !== n && this.setIndex(n.clone(e)); const i = t.attributes; for (const t in i) { const n = i[t]; this.setAttribute(t, n.clone(e)); } const r = t.morphAttributes; for (const t in r) { const n = [], i = r[t]; for (let t = 0, r = i.length; t < r; t++) n.push(i[t].clone(e)); this.morphAttributes[t] = n; } this.morphTargetsRelative = t.morphTargetsRelative; const s = t.groups; for (let t = 0, e = s.length; t < e; t++) { const e = s[t]; this.addGroup(e.start, e.count, e.materialIndex); } const a = t.boundingBox; null !== a && (this.boundingBox = a.clone()); const o = t.boundingSphere; return ( null !== o && (this.boundingSphere = o.clone()), (this.drawRange.start = t.drawRange.start), (this.drawRange.count = t.drawRange.count), (this.userData = t.userData), this ); } dispose() { this.dispatchEvent({ type: 'dispose' }); } } En.prototype.isBufferGeometry = !0; const An = new se(), Ln = new re(), Rn = new Jt(), Cn = new Lt(), Pn = new Lt(), Dn = new Lt(), In = new Lt(), Nn = new Lt(), Bn = new Lt(), zn = new Lt(), Fn = new Lt(), On = new Lt(), Hn = new vt(), Gn = new vt(), Un = new vt(), kn = new Lt(), Vn = new Lt(); class Wn extends Ce { constructor(t = new En(), e = new en()) { super(), (this.type = 'Mesh'), (this.geometry = t), (this.material = e), this.updateMorphTargets(); } copy(t) { return ( super.copy(t), void 0 !== t.morphTargetInfluences && (this.morphTargetInfluences = t.morphTargetInfluences.slice()), void 0 !== t.morphTargetDictionary && (this.morphTargetDictionary = Object.assign( {}, t.morphTargetDictionary )), (this.material = t.material), (this.geometry = t.geometry), this ); } updateMorphTargets() { const t = this.geometry; if (t.isBufferGeometry) { const e = t.morphAttributes, n = Object.keys(e); if (n.length > 0) { const t = e[n[0]]; if (void 0 !== t) { (this.morphTargetInfluences = []), (this.morphTargetDictionary = {}); for (let e = 0, n = t.length; e < n; e++) { const n = t[e].name || String(e); this.morphTargetInfluences.push(0), (this.morphTargetDictionary[n] = e); } } } } else { const e = t.morphTargets; void 0 !== e && e.length > 0 && console.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); } } raycast(t, e) { const n = this.geometry, i = this.material, r = this.matrixWorld; if (void 0 === i) return; if ( (null === n.boundingSphere && n.computeBoundingSphere(), Rn.copy(n.boundingSphere), Rn.applyMatrix4(r), !1 === t.ray.intersectsSphere(Rn)) ) return; if ( (An.copy(r).invert(), Ln.copy(t.ray).applyMatrix4(An), null !== n.boundingBox && !1 === Ln.intersectsBox(n.boundingBox)) ) return; let s; if (n.isBufferGeometry) { const r = n.index, a = n.attributes.position, o = n.morphAttributes.position, l = n.morphTargetsRelative, c = n.attributes.uv, h = n.attributes.uv2, u = n.groups, d = n.drawRange; if (null !== r) if (Array.isArray(i)) for (let n = 0, p = u.length; n < p; n++) { const p = u[n], m = i[p.materialIndex]; for ( let n = Math.max(p.start, d.start), i = Math.min(p.start + p.count, d.start + d.count); n < i; n += 3 ) { const i = r.getX(n), u = r.getX(n + 1), d = r.getX(n + 2); (s = jn(this, m, t, Ln, a, o, l, c, h, i, u, d)), s && ((s.faceIndex = Math.floor(n / 3)), (s.face.materialIndex = p.materialIndex), e.push(s)); } } else { for ( let n = Math.max(0, d.start), u = Math.min(r.count, d.start + d.count); n < u; n += 3 ) { const u = r.getX(n), d = r.getX(n + 1), p = r.getX(n + 2); (s = jn(this, i, t, Ln, a, o, l, c, h, u, d, p)), s && ((s.faceIndex = Math.floor(n / 3)), e.push(s)); } } else if (void 0 !== a) if (Array.isArray(i)) for (let n = 0, r = u.length; n < r; n++) { const r = u[n], p = i[r.materialIndex]; for ( let n = Math.max(r.start, d.start), i = Math.min(r.start + r.count, d.start + d.count); n < i; n += 3 ) { (s = jn(this, p, t, Ln, a, o, l, c, h, n, n + 1, n + 2)), s && ((s.faceIndex = Math.floor(n / 3)), (s.face.materialIndex = r.materialIndex), e.push(s)); } } else { for ( let n = Math.max(0, d.start), r = Math.min(a.count, d.start + d.count); n < r; n += 3 ) { (s = jn(this, i, t, Ln, a, o, l, c, h, n, n + 1, n + 2)), s && ((s.faceIndex = Math.floor(n / 3)), e.push(s)); } } } else n.isGeometry && console.error( 'THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); } } function jn(t, e, n, i, r, s, a, o, l, c, h, u) { Cn.fromBufferAttribute(r, c), Pn.fromBufferAttribute(r, h), Dn.fromBufferAttribute(r, u); const d = t.morphTargetInfluences; if (e.morphTargets && s && d) { zn.set(0, 0, 0), Fn.set(0, 0, 0), On.set(0, 0, 0); for (let t = 0, e = s.length; t < e; t++) { const e = d[t], n = s[t]; 0 !== e && (In.fromBufferAttribute(n, c), Nn.fromBufferAttribute(n, h), Bn.fromBufferAttribute(n, u), a ? (zn.addScaledVector(In, e), Fn.addScaledVector(Nn, e), On.addScaledVector(Bn, e)) : (zn.addScaledVector(In.sub(Cn), e), Fn.addScaledVector(Nn.sub(Pn), e), On.addScaledVector(Bn.sub(Dn), e))); } Cn.add(zn), Pn.add(Fn), Dn.add(On); } t.isSkinnedMesh && e.skinning && (t.boneTransform(c, Cn), t.boneTransform(h, Pn), t.boneTransform(u, Dn)); const p = (function (t, e, n, i, r, s, a, o) { let l; if ( ((l = 1 === e.side ? i.intersectTriangle(a, s, r, !0, o) : i.intersectTriangle(r, s, a, 2 !== e.side, o)), null === l) ) return null; Vn.copy(o), Vn.applyMatrix4(t.matrixWorld); const c = n.ray.origin.distanceTo(Vn); return c < n.near || c > n.far ? null : { distance: c, point: Vn.clone(), object: t }; })(t, e, n, i, Cn, Pn, Dn, kn); if (p) { o && (Hn.fromBufferAttribute(o, c), Gn.fromBufferAttribute(o, h), Un.fromBufferAttribute(o, u), (p.uv = je.getUV(kn, Cn, Pn, Dn, Hn, Gn, Un, new vt()))), l && (Hn.fromBufferAttribute(l, c), Gn.fromBufferAttribute(l, h), Un.fromBufferAttribute(l, u), (p.uv2 = je.getUV(kn, Cn, Pn, Dn, Hn, Gn, Un, new vt()))); const t = { a: c, b: h, c: u, normal: new Lt(), materialIndex: 0 }; je.getNormal(Cn, Pn, Dn, t.normal), (p.face = t); } return p; } Wn.prototype.isMesh = !0; class qn extends En { constructor(t = 1, e = 1, n = 1, i = 1, r = 1, s = 1) { super(), (this.type = 'BoxGeometry'), (this.parameters = { width: t, height: e, depth: n, widthSegments: i, heightSegments: r, depthSegments: s, }); const a = this; (i = Math.floor(i)), (r = Math.floor(r)), (s = Math.floor(s)); const o = [], l = [], c = [], h = []; let u = 0, d = 0; function p(t, e, n, i, r, s, p, m, f, g, v) { const y = s / f, x = p / g, _ = s / 2, w = p / 2, b = m / 2, M = f + 1, S = g + 1; let T = 0, E = 0; const A = new Lt(); for (let s = 0; s < S; s++) { const a = s * x - w; for (let o = 0; o < M; o++) { const u = o * y - _; (A[t] = u * i), (A[e] = a * r), (A[n] = b), l.push(A.x, A.y, A.z), (A[t] = 0), (A[e] = 0), (A[n] = m > 0 ? 1 : -1), c.push(A.x, A.y, A.z), h.push(o / f), h.push(1 - s / g), (T += 1); } } for (let t = 0; t < g; t++) for (let e = 0; e < f; e++) { const n = u + e + M * t, i = u + e + M * (t + 1), r = u + (e + 1) + M * (t + 1), s = u + (e + 1) + M * t; o.push(n, i, s), o.push(i, r, s), (E += 6); } a.addGroup(d, E, v), (d += E), (u += T); } p('z', 'y', 'x', -1, -1, n, e, t, s, r, 0), p('z', 'y', 'x', 1, -1, n, e, -t, s, r, 1), p('x', 'z', 'y', 1, 1, t, n, e, i, s, 2), p('x', 'z', 'y', 1, -1, t, n, -e, i, s, 3), p('x', 'y', 'z', 1, -1, t, e, n, i, r, 4), p('x', 'y', 'z', -1, -1, t, e, -n, i, r, 5), this.setIndex(o), this.setAttribute('position', new mn(l, 3)), this.setAttribute('normal', new mn(c, 3)), this.setAttribute('uv', new mn(h, 2)); } } function Xn(t) { const e = {}; for (const n in t) { e[n] = {}; for (const i in t[n]) { const r = t[n][i]; r && (r.isColor || r.isMatrix3 || r.isMatrix4 || r.isVector2 || r.isVector3 || r.isVector4 || r.isTexture || r.isQuaternion) ? (e[n][i] = r.clone()) : Array.isArray(r) ? (e[n][i] = r.slice()) : (e[n][i] = r); } } return e; } function Yn(t) { const e = {}; for (let n = 0; n < t.length; n++) { const i = Xn(t[n]); for (const t in i) e[t] = i[t]; } return e; } const Zn = { clone: Xn, merge: Yn }; class Jn extends Xe { constructor(t) { super(), (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.fog = !1), (this.lights = !1), (this.clipping = !1), (this.skinning = !1), (this.morphTargets = !1), (this.morphNormals = !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), (this.uniformsNeedUpdate = !1), (this.glslVersion = null), void 0 !== t && (void 0 !== t.attributes && console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ), this.setValues(t)); } copy(t) { return ( super.copy(t), (this.fragmentShader = t.fragmentShader), (this.vertexShader = t.vertexShader), (this.uniforms = Xn(t.uniforms)), (this.defines = Object.assign({}, t.defines)), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.lights = t.lights), (this.clipping = t.clipping), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.morphNormals = t.morphNormals), (this.extensions = Object.assign({}, t.extensions)), (this.glslVersion = t.glslVersion), this ); } toJSON(t) { const e = super.toJSON(t); (e.glslVersion = this.glslVersion), (e.uniforms = {}); for (const n in this.uniforms) { const i = this.uniforms[n].value; i && i.isTexture ? (e.uniforms[n] = { type: 't', value: i.toJSON(t).uuid }) : i && i.isColor ? (e.uniforms[n] = { type: 'c', value: i.getHex() }) : i && i.isVector2 ? (e.uniforms[n] = { type: 'v2', value: i.toArray() }) : i && i.isVector3 ? (e.uniforms[n] = { type: 'v3', value: i.toArray() }) : i && i.isVector4 ? (e.uniforms[n] = { type: 'v4', value: i.toArray() }) : i && i.isMatrix3 ? (e.uniforms[n] = { type: 'm3', value: i.toArray() }) : i && i.isMatrix4 ? (e.uniforms[n] = { type: 'm4', value: i.toArray() }) : (e.uniforms[n] = { value: i }); } Object.keys(this.defines).length > 0 && (e.defines = this.defines), (e.vertexShader = this.vertexShader), (e.fragmentShader = this.fragmentShader); const n = {}; for (const t in this.extensions) !0 === this.extensions[t] && (n[t] = !0); return Object.keys(n).length > 0 && (e.extensions = n), e; } } Jn.prototype.isShaderMaterial = !0; class Qn extends Ce { constructor() { super(), (this.type = 'Camera'), (this.matrixWorldInverse = new se()), (this.projectionMatrix = new se()), (this.projectionMatrixInverse = new se()); } copy(t, e) { return ( super.copy(t, e), this.matrixWorldInverse.copy(t.matrixWorldInverse), this.projectionMatrix.copy(t.projectionMatrix), this.projectionMatrixInverse.copy(t.projectionMatrixInverse), this ); } getWorldDirection(t) { void 0 === t && (console.warn( 'THREE.Camera: .getWorldDirection() target is now required' ), (t = new Lt())), this.updateWorldMatrix(!0, !1); const e = this.matrixWorld.elements; return t.set(-e[8], -e[9], -e[10]).normalize(); } updateMatrixWorld(t) { super.updateMatrixWorld(t), this.matrixWorldInverse.copy(this.matrixWorld).invert(); } updateWorldMatrix(t, e) { super.updateWorldMatrix(t, e), this.matrixWorldInverse.copy(this.matrixWorld).invert(); } clone() { return new this.constructor().copy(this); } } Qn.prototype.isCamera = !0; class Kn extends Qn { constructor(t = 50, e = 1, n = 0.1, i = 2e3) { super(), (this.type = 'PerspectiveCamera'), (this.fov = t), (this.zoom = 1), (this.near = n), (this.far = i), (this.focus = 10), (this.aspect = e), (this.view = null), (this.filmGauge = 35), (this.filmOffset = 0), this.updateProjectionMatrix(); } copy(t, e) { return ( super.copy(t, e), (this.fov = t.fov), (this.zoom = t.zoom), (this.near = t.near), (this.far = t.far), (this.focus = t.focus), (this.aspect = t.aspect), (this.view = null === t.view ? null : Object.assign({}, t.view)), (this.filmGauge = t.filmGauge), (this.filmOffset = t.filmOffset), this ); } setFocalLength(t) { const e = (0.5 * this.getFilmHeight()) / t; (this.fov = 2 * lt * Math.atan(e)), this.updateProjectionMatrix(); } getFocalLength() { const t = Math.tan(0.5 * ot * this.fov); return (0.5 * this.getFilmHeight()) / t; } getEffectiveFOV() { return 2 * lt * Math.atan(Math.tan(0.5 * ot * this.fov) / this.zoom); } getFilmWidth() { return this.filmGauge * Math.min(this.aspect, 1); } getFilmHeight() { return this.filmGauge / Math.max(this.aspect, 1); } setViewOffset(t, e, n, i, r, s) { (this.aspect = t / e), null === this.view && (this.view = { enabled: !0, fullWidth: 1, fullHeight: 1, offsetX: 0, offsetY: 0, width: 1, height: 1, }), (this.view.enabled = !0), (this.view.fullWidth = t), (this.view.fullHeight = e), (this.view.offsetX = n), (this.view.offsetY = i), (this.view.width = r), (this.view.height = s), this.updateProjectionMatrix(); } clearViewOffset() { null !== this.view && (this.view.enabled = !1), this.updateProjectionMatrix(); } updateProjectionMatrix() { const t = this.near; let e = (t * Math.tan(0.5 * ot * this.fov)) / this.zoom, n = 2 * e, i = this.aspect * n, r = -0.5 * i; const s = this.view; if (null !== this.view && this.view.enabled) { const t = s.fullWidth, a = s.fullHeight; (r += (s.offsetX * i) / t), (e -= (s.offsetY * n) / a), (i *= s.width / t), (n *= s.height / a); } const a = this.filmOffset; 0 !== a && (r += (t * a) / this.getFilmWidth()), this.projectionMatrix.makePerspective(r, r + i, e, e - n, t, this.far), this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); } toJSON(t) { const e = super.toJSON(t); return ( (e.object.fov = this.fov), (e.object.zoom = this.zoom), (e.object.near = this.near), (e.object.far = this.far), (e.object.focus = this.focus), (e.object.aspect = this.aspect), null !== this.view && (e.object.view = Object.assign({}, this.view)), (e.object.filmGauge = this.filmGauge), (e.object.filmOffset = this.filmOffset), e ); } } Kn.prototype.isPerspectiveCamera = !0; const $n = 90; class ti extends Ce { constructor(t, e, n) { if ( (super(), (this.type = 'CubeCamera'), !0 !== n.isWebGLCubeRenderTarget) ) return void console.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' ); this.renderTarget = n; const i = new Kn($n, 1, t, e); (i.layers = this.layers), i.up.set(0, -1, 0), i.lookAt(new Lt(1, 0, 0)), this.add(i); const r = new Kn($n, 1, t, e); (r.layers = this.layers), r.up.set(0, -1, 0), r.lookAt(new Lt(-1, 0, 0)), this.add(r); const s = new Kn($n, 1, t, e); (s.layers = this.layers), s.up.set(0, 0, 1), s.lookAt(new Lt(0, 1, 0)), this.add(s); const a = new Kn($n, 1, t, e); (a.layers = this.layers), a.up.set(0, 0, -1), a.lookAt(new Lt(0, -1, 0)), this.add(a); const o = new Kn($n, 1, t, e); (o.layers = this.layers), o.up.set(0, -1, 0), o.lookAt(new Lt(0, 0, 1)), this.add(o); const l = new Kn($n, 1, t, e); (l.layers = this.layers), l.up.set(0, -1, 0), l.lookAt(new Lt(0, 0, -1)), this.add(l); } update(t, e) { null === this.parent && this.updateMatrixWorld(); const n = this.renderTarget, [i, r, s, a, o, l] = this.children, c = t.xr.enabled, h = t.getRenderTarget(); t.xr.enabled = !1; const u = n.texture.generateMipmaps; (n.texture.generateMipmaps = !1), t.setRenderTarget(n, 0), t.render(e, i), t.setRenderTarget(n, 1), t.render(e, r), t.setRenderTarget(n, 2), t.render(e, s), t.setRenderTarget(n, 3), t.render(e, a), t.setRenderTarget(n, 4), t.render(e, o), (n.texture.generateMipmaps = u), t.setRenderTarget(n, 5), t.render(e, l), t.setRenderTarget(h), (t.xr.enabled = c); } } class ei extends bt { constructor(t, e, n, i, s, a, o, l, c, h) { super( (t = void 0 !== t ? t : []), (e = void 0 !== e ? e : r), n, i, s, a, (o = void 0 !== o ? o : T), l, c, h ), (this._needsFlipEnvMap = !0), (this.flipY = !1); } get images() { return this.image; } set images(t) { this.image = t; } } ei.prototype.isCubeTexture = !0; class ni extends Tt { constructor(t, e, n) { Number.isInteger(e) && (console.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' ), (e = n)), super(t, t, e), (e = e || {}), (this.texture = new ei( void 0, e.mapping, e.wrapS, e.wrapT, e.magFilter, e.minFilter, e.format, e.type, e.anisotropy, e.encoding )), (this.texture.generateMipmaps = void 0 !== e.generateMipmaps && e.generateMipmaps), (this.texture.minFilter = void 0 !== e.minFilter ? e.minFilter : g), (this.texture._needsFlipEnvMap = !1); } fromEquirectangularTexture(t, e) { (this.texture.type = e.type), (this.texture.format = E), (this.texture.encoding = e.encoding), (this.texture.generateMipmaps = e.generateMipmaps), (this.texture.minFilter = e.minFilter), (this.texture.magFilter = e.magFilter); const n = { uniforms: { tEquirect: { value: null } }, vertexShader: '\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t', fragmentShader: '\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t', }, i = new qn(5, 5, 5), r = new Jn({ name: 'CubemapFromEquirect', uniforms: Xn(n.uniforms), vertexShader: n.vertexShader, fragmentShader: n.fragmentShader, side: 1, blending: 0, }); r.uniforms.tEquirect.value = e; const s = new Wn(i, r), a = e.minFilter; e.minFilter === y && (e.minFilter = g); return ( new ti(1, 10, this).update(t, s), (e.minFilter = a), s.geometry.dispose(), s.material.dispose(), this ); } clear(t, e, n, i) { const r = t.getRenderTarget(); for (let r = 0; r < 6; r++) t.setRenderTarget(this, r), t.clear(e, n, i); t.setRenderTarget(r); } } ni.prototype.isWebGLCubeRenderTarget = !0; class ii extends bt { constructor(t, e, n, i, r, s, a, o, l, c, h, u) { super(null, s, a, o, l, c, i, r, h, u), (this.image = { data: t || null, width: e || 1, height: n || 1 }), (this.magFilter = void 0 !== l ? l : p), (this.minFilter = void 0 !== c ? c : p), (this.generateMipmaps = !1), (this.flipY = !1), (this.unpackAlignment = 1), (this.needsUpdate = !0); } } ii.prototype.isDataTexture = !0; const ri = new Jt(), si = new Lt(); class ai { constructor( t = new Ne(), e = new Ne(), n = new Ne(), i = new Ne(), r = new Ne(), s = new Ne() ) { this.planes = [t, e, n, i, r, s]; } set(t, e, n, i, r, s) { const a = this.planes; return ( a[0].copy(t), a[1].copy(e), a[2].copy(n), a[3].copy(i), a[4].copy(r), a[5].copy(s), this ); } copy(t) { const e = this.planes; for (let n = 0; n < 6; n++) e[n].copy(t.planes[n]); return this; } setFromProjectionMatrix(t) { const e = this.planes, n = t.elements, i = n[0], r = n[1], s = n[2], a = n[3], o = n[4], l = n[5], c = n[6], h = n[7], u = n[8], d = n[9], p = n[10], m = n[11], f = n[12], g = n[13], v = n[14], y = n[15]; return ( e[0].setComponents(a - i, h - o, m - u, y - f).normalize(), e[1].setComponents(a + i, h + o, m + u, y + f).normalize(), e[2].setComponents(a + r, h + l, m + d, y + g).normalize(), e[3].setComponents(a - r, h - l, m - d, y - g).normalize(), e[4].setComponents(a - s, h - c, m - p, y - v).normalize(), e[5].setComponents(a + s, h + c, m + p, y + v).normalize(), this ); } intersectsObject(t) { const e = t.geometry; return ( null === e.boundingSphere && e.computeBoundingSphere(), ri.copy(e.boundingSphere).applyMatrix4(t.matrixWorld), this.intersectsSphere(ri) ); } intersectsSprite(t) { return ( ri.center.set(0, 0, 0), (ri.radius = 0.7071067811865476), ri.applyMatrix4(t.matrixWorld), this.intersectsSphere(ri) ); } intersectsSphere(t) { const e = this.planes, n = t.center, i = -t.radius; for (let t = 0; t < 6; t++) { if (e[t].distanceToPoint(n) < i) return !1; } return !0; } intersectsBox(t) { const e = this.planes; for (let n = 0; n < 6; n++) { const i = e[n]; if ( ((si.x = i.normal.x > 0 ? t.max.x : t.min.x), (si.y = i.normal.y > 0 ? t.max.y : t.min.y), (si.z = i.normal.z > 0 ? t.max.z : t.min.z), i.distanceToPoint(si) < 0) ) return !1; } return !0; } containsPoint(t) { const e = this.planes; for (let n = 0; n < 6; n++) if (e[n].distanceToPoint(t) < 0) return !1; return !0; } clone() { return new this.constructor().copy(this); } } function oi() { let t = null, e = !1, n = null, i = null; function r(e, s) { n(e, s), (i = t.requestAnimationFrame(r)); } return { start: function () { !0 !== e && null !== n && ((i = t.requestAnimationFrame(r)), (e = !0)); }, stop: function () { t.cancelAnimationFrame(i), (e = !1); }, setAnimationLoop: function (t) { n = t; }, setContext: function (e) { t = e; }, }; } function li(t, e) { const n = e.isWebGL2, i = new WeakMap(); return { get: function (t) { return t.isInterleavedBufferAttribute && (t = t.data), i.get(t); }, remove: function (e) { e.isInterleavedBufferAttribute && (e = e.data); const n = i.get(e); n && (t.deleteBuffer(n.buffer), i.delete(e)); }, update: function (e, r) { if (e.isGLBufferAttribute) { const t = i.get(e); return void ( (!t || t.version < e.version) && i.set(e, { buffer: e.buffer, type: e.type, bytesPerElement: e.elementSize, version: e.version, }) ); } e.isInterleavedBufferAttribute && (e = e.data); const s = i.get(e); void 0 === s ? i.set( e, (function (e, i) { const r = e.array, s = e.usage, a = t.createBuffer(); t.bindBuffer(i, a), t.bufferData(i, r, s), e.onUploadCallback(); let o = 5126; return ( r instanceof Float32Array ? (o = 5126) : r instanceof Float64Array ? console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' ) : r instanceof Uint16Array ? e.isFloat16BufferAttribute ? n ? (o = 5131) : console.warn( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' ) : (o = 5123) : r instanceof Int16Array ? (o = 5122) : r instanceof Uint32Array ? (o = 5125) : r instanceof Int32Array ? (o = 5124) : r instanceof Int8Array ? (o = 5120) : r instanceof Uint8Array && (o = 5121), { buffer: a, type: o, bytesPerElement: r.BYTES_PER_ELEMENT, version: e.version, } ); })(e, r) ) : s.version < e.version && (!(function (e, i, r) { const s = i.array, a = i.updateRange; t.bindBuffer(r, e), -1 === a.count ? t.bufferSubData(r, 0, s) : (n ? t.bufferSubData( r, a.offset * s.BYTES_PER_ELEMENT, s, a.offset, a.count ) : t.bufferSubData( r, a.offset * s.BYTES_PER_ELEMENT, s.subarray(a.offset, a.offset + a.count) ), (a.count = -1)); })(s.buffer, e, r), (s.version = e.version)); }, }; } class ci extends En { constructor(t = 1, e = 1, n = 1, i = 1) { super(), (this.type = 'PlaneGeometry'), (this.parameters = { width: t, height: e, widthSegments: n, heightSegments: i, }); const r = t / 2, s = e / 2, a = Math.floor(n), o = Math.floor(i), l = a + 1, c = o + 1, h = t / a, u = e / o, d = [], p = [], m = [], f = []; for (let t = 0; t < c; t++) { const e = t * u - s; for (let n = 0; n < l; n++) { const i = n * h - r; p.push(i, -e, 0), m.push(0, 0, 1), f.push(n / a), f.push(1 - t / o); } } for (let t = 0; t < o; t++) for (let e = 0; e < a; e++) { const n = e + l * t, i = e + l * (t + 1), r = e + 1 + l * (t + 1), s = e + 1 + l * t; d.push(n, i, s), d.push(i, r, s); } this.setIndex(d), this.setAttribute('position', new mn(p, 3)), this.setAttribute('normal', new mn(m, 3)), this.setAttribute('uv', new mn(f, 2)); } } const hi = { alphamap_fragment: '#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif', alphamap_pars_fragment: '#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif', alphatest_fragment: '#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif', 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( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif', aomap_pars_fragment: '#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif', begin_vertex: 'vec3 transformed = vec3( position );', beginnormal_vertex: 'vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif', bsdfs: 'vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\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\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\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}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\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 vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\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#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif', 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, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\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', clipping_planes_fragment: '#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif', clipping_planes_pars_fragment: '#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif', clipping_planes_pars_vertex: '#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif', clipping_planes_vertex: '#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif', color_fragment: '#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif', color_pars_fragment: '#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif', color_pars_vertex: '#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif', color_vertex: '#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif', common: '#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(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}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\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#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}', cube_uv_reflection_fragment: '#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif', defaultnormal_vertex: 'vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif', displacementmap_pars_vertex: '#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif', displacementmap_vertex: '#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif', emissivemap_fragment: '#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif', emissivemap_pars_fragment: '#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif', encodings_fragment: 'gl_FragColor = linearToOutputTexel( gl_FragColor );', encodings_pars_fragment: '\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}', envmap_fragment: '#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\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', envmap_common_pars_fragment: '#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif', envmap_pars_fragment: '#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif', envmap_pars_vertex: '#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif', envmap_physical_pars_fragment: '#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 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 roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif', envmap_vertex: '#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\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', fog_vertex: '#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif', fog_pars_vertex: '#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif', fog_fragment: '#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif', fog_pars_fragment: '#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif', gradientmap_pars_fragment: '#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}', lightmap_fragment: '#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif', 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 = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\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\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\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\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\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\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif', lights_pars_begin: 'uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\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};\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};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif', lights_toon_fragment: 'ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;', lights_toon_pars_fragment: 'varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * 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}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)', lights_phong_fragment: 'BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;', lights_phong_pars_fragment: 'varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\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)', lights_physical_fragment: 'PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif', lights_physical_pars_fragment: 'struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(\t\t0, 1,\t\t0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\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 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\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}', lights_fragment_begin: '\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif', lights_fragment_maps: '#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * 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 defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif', lights_fragment_end: '#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif', logdepthbuf_fragment: '#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif', logdepthbuf_pars_fragment: '#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif', logdepthbuf_pars_vertex: '#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif', logdepthbuf_vertex: '#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif', map_fragment: '#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif', map_pars_fragment: '#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif', map_particle_fragment: '#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif', map_particle_pars_fragment: '#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif', metalnessmap_fragment: 'float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif', metalnessmap_pars_fragment: '#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif', morphnormal_vertex: '#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif', morphtarget_pars_vertex: '#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif', morphtarget_vertex: '#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif', normal_fragment_begin: 'float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;', normal_fragment_maps: '#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif', normalmap_pars_fragment: '#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif', clearcoat_normal_fragment_begin: '#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif', clearcoat_normal_fragment_maps: '#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif', clearcoat_pars_fragment: '#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif', packing: 'vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}', premultiplied_alpha_fragment: '#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif', project_vertex: 'vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;', dithering_fragment: '#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif', dithering_pars_fragment: '#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif', roughnessmap_fragment: 'float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif', roughnessmap_pars_fragment: '#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif', shadowmap_pars_fragment: '#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), 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( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), 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 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\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', shadowmap_pars_vertex: '#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif', shadowmap_vertex: '#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif', shadowmask_pars_fragment: 'float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\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 highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif', skinning_vertex: '#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif', 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\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif', 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\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif', tonemapping_pars_fragment: '#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }', transmissionmap_fragment: '#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif', transmissionmap_pars_fragment: '#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\n#endif', uv_pars_fragment: '#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif', uv_pars_vertex: '#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif', uv_vertex: '#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif', uv2_pars_fragment: '#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif', uv2_pars_vertex: '#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif', uv2_vertex: '#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif', worldpos_vertex: '#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif', background_frag: 'uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}', background_vert: 'varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}', cube_frag: '#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}', cube_vert: 'varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}', depth_frag: '#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}', depth_vert: '#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}', distanceRGBA_frag: '#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}', distanceRGBA_vert: '#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}', equirect_frag: 'uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}', equirect_vert: 'varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}', linedashed_frag: 'uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}', linedashed_vert: 'uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshbasic_frag: 'uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshbasic_vert: '#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshlambert_frag: 'uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshlambert_vert: '#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshmatcap_frag: '#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshmatcap_vert: '#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}', meshtoon_frag: '#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshtoon_vert: '#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}', meshphong_frag: '#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshphong_vert: '#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}', meshphysical_frag: '#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSMISSION\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSMISSION\n\tuniform float transmission;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#ifdef TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSMISSION\n\t\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', meshphysical_vert: '#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}', normal_frag: '#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}', normal_vert: '#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}', points_frag: 'uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}', points_vert: 'uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}', shadow_frag: 'uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}', shadow_vert: '#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}', sprite_frag: 'uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}', sprite_vert: 'uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}', }, ui = { common: { diffuse: { value: new tn(15658734) }, opacity: { value: 1 }, map: { value: null }, uvTransform: { value: new yt() }, uv2Transform: { value: new yt() }, alphaMap: { value: null }, }, specularmap: { specularMap: { value: null } }, envmap: { envMap: { value: null }, flipEnvMap: { value: -1 }, reflectivity: { value: 1 }, refractionRatio: { value: 0.98 }, maxMipLevel: { value: 0 }, }, 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 vt(1, 1) }, }, displacementmap: { displacementMap: { value: null }, displacementScale: { value: 1 }, displacementBias: { value: 0 }, }, roughnessmap: { roughnessMap: { value: null } }, metalnessmap: { metalnessMap: { value: null } }, gradientmap: { gradientMap: { value: null } }, fog: { fogDensity: { value: 25e-5 }, fogNear: { value: 1 }, fogFar: { value: 2e3 }, fogColor: { value: new tn(16777215) }, }, lights: { ambientLightColor: { value: [] }, lightProbe: { value: [] }, directionalLights: { value: [], properties: { direction: {}, color: {} }, }, directionalLightShadows: { value: [], properties: { shadowBias: {}, shadowNormalBias: {}, shadowRadius: {}, shadowMapSize: {}, }, }, directionalShadowMap: { value: [] }, directionalShadowMatrix: { value: [] }, spotLights: { value: [], properties: { color: {}, position: {}, direction: {}, distance: {}, coneCos: {}, penumbraCos: {}, decay: {}, }, }, spotLightShadows: { value: [], properties: { shadowBias: {}, shadowNormalBias: {}, shadowRadius: {}, shadowMapSize: {}, }, }, spotShadowMap: { value: [] }, spotShadowMatrix: { value: [] }, pointLights: { value: [], properties: { color: {}, position: {}, decay: {}, distance: {} }, }, pointLightShadows: { value: [], properties: { shadowBias: {}, shadowNormalBias: {}, shadowRadius: {}, shadowMapSize: {}, shadowCameraNear: {}, shadowCameraFar: {}, }, }, pointShadowMap: { value: [] }, pointShadowMatrix: { value: [] }, hemisphereLights: { value: [], properties: { direction: {}, skyColor: {}, groundColor: {} }, }, rectAreaLights: { value: [], properties: { color: {}, position: {}, width: {}, height: {} }, }, ltc_1: { value: null }, ltc_2: { value: null }, }, points: { diffuse: { value: new tn(15658734) }, opacity: { value: 1 }, size: { value: 1 }, scale: { value: 1 }, map: { value: null }, alphaMap: { value: null }, uvTransform: { value: new yt() }, }, sprite: { diffuse: { value: new tn(15658734) }, opacity: { value: 1 }, center: { value: new vt(0.5, 0.5) }, rotation: { value: 0 }, map: { value: null }, alphaMap: { value: null }, uvTransform: { value: new yt() }, }, }, di = { basic: { uniforms: Yn([ ui.common, ui.specularmap, ui.envmap, ui.aomap, ui.lightmap, ui.fog, ]), vertexShader: hi.meshbasic_vert, fragmentShader: hi.meshbasic_frag, }, lambert: { uniforms: Yn([ ui.common, ui.specularmap, ui.envmap, ui.aomap, ui.lightmap, ui.emissivemap, ui.fog, ui.lights, { emissive: { value: new tn(0) } }, ]), vertexShader: hi.meshlambert_vert, fragmentShader: hi.meshlambert_frag, }, phong: { uniforms: Yn([ ui.common, ui.specularmap, ui.envmap, ui.aomap, ui.lightmap, ui.emissivemap, ui.bumpmap, ui.normalmap, ui.displacementmap, ui.fog, ui.lights, { emissive: { value: new tn(0) }, specular: { value: new tn(1118481) }, shininess: { value: 30 }, }, ]), vertexShader: hi.meshphong_vert, fragmentShader: hi.meshphong_frag, }, standard: { uniforms: Yn([ ui.common, ui.envmap, ui.aomap, ui.lightmap, ui.emissivemap, ui.bumpmap, ui.normalmap, ui.displacementmap, ui.roughnessmap, ui.metalnessmap, ui.fog, ui.lights, { emissive: { value: new tn(0) }, roughness: { value: 1 }, metalness: { value: 0 }, envMapIntensity: { value: 1 }, }, ]), vertexShader: hi.meshphysical_vert, fragmentShader: hi.meshphysical_frag, }, toon: { uniforms: Yn([ ui.common, ui.aomap, ui.lightmap, ui.emissivemap, ui.bumpmap, ui.normalmap, ui.displacementmap, ui.gradientmap, ui.fog, ui.lights, { emissive: { value: new tn(0) } }, ]), vertexShader: hi.meshtoon_vert, fragmentShader: hi.meshtoon_frag, }, matcap: { uniforms: Yn([ ui.common, ui.bumpmap, ui.normalmap, ui.displacementmap, ui.fog, { matcap: { value: null } }, ]), vertexShader: hi.meshmatcap_vert, fragmentShader: hi.meshmatcap_frag, }, points: { uniforms: Yn([ui.points, ui.fog]), vertexShader: hi.points_vert, fragmentShader: hi.points_frag, }, dashed: { uniforms: Yn([ ui.common, ui.fog, { scale: { value: 1 }, dashSize: { value: 1 }, totalSize: { value: 2 }, }, ]), vertexShader: hi.linedashed_vert, fragmentShader: hi.linedashed_frag, }, depth: { uniforms: Yn([ui.common, ui.displacementmap]), vertexShader: hi.depth_vert, fragmentShader: hi.depth_frag, }, normal: { uniforms: Yn([ ui.common, ui.bumpmap, ui.normalmap, ui.displacementmap, { opacity: { value: 1 } }, ]), vertexShader: hi.normal_vert, fragmentShader: hi.normal_frag, }, sprite: { uniforms: Yn([ui.sprite, ui.fog]), vertexShader: hi.sprite_vert, fragmentShader: hi.sprite_frag, }, background: { uniforms: { uvTransform: { value: new yt() }, t2D: { value: null } }, vertexShader: hi.background_vert, fragmentShader: hi.background_frag, }, cube: { uniforms: Yn([ui.envmap, { opacity: { value: 1 } }]), vertexShader: hi.cube_vert, fragmentShader: hi.cube_frag, }, equirect: { uniforms: { tEquirect: { value: null } }, vertexShader: hi.equirect_vert, fragmentShader: hi.equirect_frag, }, distanceRGBA: { uniforms: Yn([ ui.common, ui.displacementmap, { referencePosition: { value: new Lt() }, nearDistance: { value: 1 }, farDistance: { value: 1e3 }, }, ]), vertexShader: hi.distanceRGBA_vert, fragmentShader: hi.distanceRGBA_frag, }, shadow: { uniforms: Yn([ ui.lights, ui.fog, { color: { value: new tn(0) }, opacity: { value: 1 } }, ]), vertexShader: hi.shadow_vert, fragmentShader: hi.shadow_frag, }, }; function pi(t, e, n, i, r) { const s = new tn(0); let a, o, c = 0, h = null, u = 0, d = null; function p(t, e) { n.buffers.color.setClear(t.r, t.g, t.b, e, r); } return { getClearColor: function () { return s; }, setClearColor: function (t, e = 1) { s.set(t), (c = e), p(s, c); }, getClearAlpha: function () { return c; }, setClearAlpha: function (t) { (c = t), p(s, c); }, render: function (n, r, m, f) { let g = !0 === r.isScene ? r.background : null; g && g.isTexture && (g = e.get(g)); const v = t.xr, y = v.getSession && v.getSession(); y && 'additive' === y.environmentBlendMode && (g = null), null === g ? p(s, c) : g && g.isColor && (p(g, 1), (f = !0)), (t.autoClear || f) && t.clear(t.autoClearColor, t.autoClearDepth, t.autoClearStencil), g && (g.isCubeTexture || g.mapping === l) ? (void 0 === o && ((o = new Wn( new qn(1, 1, 1), new Jn({ name: 'BackgroundCubeMaterial', uniforms: Xn(di.cube.uniforms), vertexShader: di.cube.vertexShader, fragmentShader: di.cube.fragmentShader, side: 1, depthTest: !1, depthWrite: !1, fog: !1, }) )), o.geometry.deleteAttribute('normal'), o.geometry.deleteAttribute('uv'), (o.onBeforeRender = function (t, e, n) { this.matrixWorld.copyPosition(n.matrixWorld); }), Object.defineProperty(o.material, 'envMap', { get: function () { return this.uniforms.envMap.value; }, }), i.update(o)), (o.material.uniforms.envMap.value = g), (o.material.uniforms.flipEnvMap.value = g.isCubeTexture && g._needsFlipEnvMap ? -1 : 1), (h === g && u === g.version && d === t.toneMapping) || ((o.material.needsUpdate = !0), (h = g), (u = g.version), (d = t.toneMapping)), n.unshift(o, o.geometry, o.material, 0, 0, null)) : g && g.isTexture && (void 0 === a && ((a = new Wn( new ci(2, 2), new Jn({ name: 'BackgroundMaterial', uniforms: Xn(di.background.uniforms), vertexShader: di.background.vertexShader, fragmentShader: di.background.fragmentShader, side: 0, depthTest: !1, depthWrite: !1, fog: !1, }) )), a.geometry.deleteAttribute('normal'), Object.defineProperty(a.material, 'map', { get: function () { return this.uniforms.t2D.value; }, }), i.update(a)), (a.material.uniforms.t2D.value = g), !0 === g.matrixAutoUpdate && g.updateMatrix(), a.material.uniforms.uvTransform.value.copy(g.matrix), (h === g && u === g.version && d === t.toneMapping) || ((a.material.needsUpdate = !0), (h = g), (u = g.version), (d = t.toneMapping)), n.unshift(a, a.geometry, a.material, 0, 0, null)); }, }; } function mi(t, e, n, i) { const r = t.getParameter(34921), s = i.isWebGL2 ? null : e.get('OES_vertex_array_object'), a = i.isWebGL2 || null !== s, o = {}, l = d(null); let c = l; function h(e) { return i.isWebGL2 ? t.bindVertexArray(e) : s.bindVertexArrayOES(e); } function u(e) { return i.isWebGL2 ? t.deleteVertexArray(e) : s.deleteVertexArrayOES(e); } function d(t) { const e = [], n = [], i = []; for (let t = 0; t < r; t++) (e[t] = 0), (n[t] = 0), (i[t] = 0); return { geometry: null, program: null, wireframe: !1, newAttributes: e, enabledAttributes: n, attributeDivisors: i, object: t, attributes: {}, index: null, }; } function p() { const t = c.newAttributes; for (let e = 0, n = t.length; e < n; e++) t[e] = 0; } function m(t) { f(t, 0); } function f(n, r) { const s = c.newAttributes, a = c.enabledAttributes, o = c.attributeDivisors; if ( ((s[n] = 1), 0 === a[n] && (t.enableVertexAttribArray(n), (a[n] = 1)), o[n] !== r) ) { (i.isWebGL2 ? t : e.get('ANGLE_instanced_arrays'))[ i.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ](n, r), (o[n] = r); } } function g() { const e = c.newAttributes, n = c.enabledAttributes; for (let i = 0, r = n.length; i < r; i++) n[i] !== e[i] && (t.disableVertexAttribArray(i), (n[i] = 0)); } function v(e, n, r, s, a, o) { !0 !== i.isWebGL2 || (5124 !== r && 5125 !== r) ? t.vertexAttribPointer(e, n, r, s, a, o) : t.vertexAttribIPointer(e, n, r, a, o); } function y() { x(), c !== l && ((c = l), h(c.object)); } function x() { (l.geometry = null), (l.program = null), (l.wireframe = !1); } return { setup: function (r, l, u, y, x) { let _ = !1; if (a) { const e = (function (e, n, r) { const a = !0 === r.wireframe; let l = o[e.id]; void 0 === l && ((l = {}), (o[e.id] = l)); let c = l[n.id]; void 0 === c && ((c = {}), (l[n.id] = c)); let h = c[a]; void 0 === h && ((h = d( i.isWebGL2 ? t.createVertexArray() : s.createVertexArrayOES() )), (c[a] = h)); return h; })(y, u, l); c !== e && ((c = e), h(c.object)), (_ = (function (t, e) { const n = c.attributes, i = t.attributes; let r = 0; for (const t in i) { const e = n[t], s = i[t]; if (void 0 === e) return !0; if (e.attribute !== s) return !0; if (e.data !== s.data) return !0; r++; } return c.attributesNum !== r || c.index !== e; })(y, x)), _ && (function (t, e) { const n = {}, i = t.attributes; let r = 0; for (const t in i) { const e = i[t], s = {}; (s.attribute = e), e.data && (s.data = e.data), (n[t] = s), r++; } (c.attributes = n), (c.attributesNum = r), (c.index = e); })(y, x); } else { const t = !0 === l.wireframe; (c.geometry === y.id && c.program === u.id && c.wireframe === t) || ((c.geometry = y.id), (c.program = u.id), (c.wireframe = t), (_ = !0)); } !0 === r.isInstancedMesh && (_ = !0), null !== x && n.update(x, 34963), _ && (!(function (r, s, a, o) { if ( !1 === i.isWebGL2 && (r.isInstancedMesh || o.isInstancedBufferGeometry) && null === e.get('ANGLE_instanced_arrays') ) return; p(); const l = o.attributes, c = a.getAttributes(), h = s.defaultAttributeValues; for (const e in c) { const i = c[e]; if (i >= 0) { const s = l[e]; if (void 0 !== s) { const e = s.normalized, r = s.itemSize, a = n.get(s); if (void 0 === a) continue; const l = a.buffer, c = a.type, h = a.bytesPerElement; if (s.isInterleavedBufferAttribute) { const n = s.data, a = n.stride, u = s.offset; n && n.isInstancedInterleavedBuffer ? (f(i, n.meshPerAttribute), void 0 === o._maxInstanceCount && (o._maxInstanceCount = n.meshPerAttribute * n.count)) : m(i), t.bindBuffer(34962, l), v(i, r, c, e, a * h, u * h); } else s.isInstancedBufferAttribute ? (f(i, s.meshPerAttribute), void 0 === o._maxInstanceCount && (o._maxInstanceCount = s.meshPerAttribute * s.count)) : m(i), t.bindBuffer(34962, l), v(i, r, c, e, 0, 0); } else if ('instanceMatrix' === e) { const e = n.get(r.instanceMatrix); if (void 0 === e) continue; const s = e.buffer, a = e.type; f(i + 0, 1), f(i + 1, 1), f(i + 2, 1), f(i + 3, 1), t.bindBuffer(34962, s), t.vertexAttribPointer(i + 0, 4, a, !1, 64, 0), t.vertexAttribPointer(i + 1, 4, a, !1, 64, 16), t.vertexAttribPointer(i + 2, 4, a, !1, 64, 32), t.vertexAttribPointer(i + 3, 4, a, !1, 64, 48); } else if ('instanceColor' === e) { const e = n.get(r.instanceColor); if (void 0 === e) continue; const s = e.buffer, a = e.type; f(i, 1), t.bindBuffer(34962, s), t.vertexAttribPointer(i, 3, a, !1, 12, 0); } else if (void 0 !== h) { const n = h[e]; if (void 0 !== n) switch (n.length) { case 2: t.vertexAttrib2fv(i, n); break; case 3: t.vertexAttrib3fv(i, n); break; case 4: t.vertexAttrib4fv(i, n); break; default: t.vertexAttrib1fv(i, n); } } } } g(); })(r, l, u, y), null !== x && t.bindBuffer(34963, n.get(x).buffer)); }, reset: y, resetDefaultState: x, dispose: function () { y(); for (const t in o) { const e = o[t]; for (const t in e) { const n = e[t]; for (const t in n) u(n[t].object), delete n[t]; delete e[t]; } delete o[t]; } }, releaseStatesOfGeometry: function (t) { if (void 0 === o[t.id]) return; const e = o[t.id]; for (const t in e) { const n = e[t]; for (const t in n) u(n[t].object), delete n[t]; delete e[t]; } delete o[t.id]; }, releaseStatesOfProgram: function (t) { for (const e in o) { const n = o[e]; if (void 0 === n[t.id]) continue; const i = n[t.id]; for (const t in i) u(i[t].object), delete i[t]; delete n[t.id]; } }, initAttributes: p, enableAttribute: m, disableUnusedAttributes: g, }; } function fi(t, e, n, i) { const r = i.isWebGL2; let s; (this.setMode = function (t) { s = t; }), (this.render = function (e, i) { t.drawArrays(s, e, i), n.update(i, s, 1); }), (this.renderInstances = function (i, a, o) { if (0 === o) return; let l, c; if (r) (l = t), (c = 'drawArraysInstanced'); else if ( ((l = e.get('ANGLE_instanced_arrays')), (c = 'drawArraysInstancedANGLE'), null === l) ) return void console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); l[c](s, i, a, o), n.update(a, s, o); }); } function gi(t, e, n) { let i; function r(e) { if ('highp' === e) { if ( t.getShaderPrecisionFormat(35633, 36338).precision > 0 && t.getShaderPrecisionFormat(35632, 36338).precision > 0 ) return 'highp'; e = 'mediump'; } return 'mediump' === e && t.getShaderPrecisionFormat(35633, 36337).precision > 0 && t.getShaderPrecisionFormat(35632, 36337).precision > 0 ? 'mediump' : 'lowp'; } const s = ('undefined' != typeof WebGL2RenderingContext && t instanceof WebGL2RenderingContext) || ('undefined' != typeof WebGL2ComputeRenderingContext && t instanceof WebGL2ComputeRenderingContext); let a = void 0 !== n.precision ? n.precision : 'highp'; const o = r(a); o !== a && (console.warn( 'THREE.WebGLRenderer:', a, 'not supported, using', o, 'instead.' ), (a = o)); const l = !0 === n.logarithmicDepthBuffer, c = t.getParameter(34930), h = t.getParameter(35660), u = t.getParameter(3379), d = t.getParameter(34076), p = t.getParameter(34921), m = t.getParameter(36347), f = t.getParameter(36348), g = t.getParameter(36349), v = h > 0, y = s || e.has('OES_texture_float'); return { isWebGL2: s, getMaxAnisotropy: function () { if (void 0 !== i) return i; if (!0 === e.has('EXT_texture_filter_anisotropic')) { const n = e.get('EXT_texture_filter_anisotropic'); i = t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT); } else i = 0; return i; }, getMaxPrecision: r, precision: a, logarithmicDepthBuffer: l, maxTextures: c, maxVertexTextures: h, maxTextureSize: u, maxCubemapSize: d, maxAttributes: p, maxVertexUniforms: m, maxVaryings: f, maxFragmentUniforms: g, vertexTextures: v, floatFragmentTextures: y, floatVertexTextures: v && y, maxSamples: s ? t.getParameter(36183) : 0, }; } function vi(t) { const e = this; let n = null, i = 0, r = !1, s = !1; const a = new Ne(), o = new yt(), l = { value: null, needsUpdate: !1 }; function c() { l.value !== n && ((l.value = n), (l.needsUpdate = i > 0)), (e.numPlanes = i), (e.numIntersection = 0); } function h(t, n, i, r) { const s = null !== t ? t.length : 0; let c = null; if (0 !== s) { if (((c = l.value), !0 !== r || null === c)) { const e = i + 4 * s, r = n.matrixWorldInverse; o.getNormalMatrix(r), (null === c || c.length < e) && (c = new Float32Array(e)); for (let e = 0, n = i; e !== s; ++e, n += 4) a.copy(t[e]).applyMatrix4(r, o), a.normal.toArray(c, n), (c[n + 3] = a.constant); } (l.value = c), (l.needsUpdate = !0); } return (e.numPlanes = s), (e.numIntersection = 0), c; } (this.uniform = l), (this.numPlanes = 0), (this.numIntersection = 0), (this.init = function (t, e, s) { const a = 0 !== t.length || e || 0 !== i || r; return (r = e), (n = h(t, s, 0)), (i = t.length), a; }), (this.beginShadows = function () { (s = !0), h(null); }), (this.endShadows = function () { (s = !1), c(); }), (this.setState = function (e, a, o) { const u = e.clippingPlanes, d = e.clipIntersection, p = e.clipShadows, m = t.get(e); if (!r || null === u || 0 === u.length || (s && !p)) s ? h(null) : c(); else { const t = s ? 0 : i, e = 4 * t; let r = m.clippingState || null; (l.value = r), (r = h(u, a, e, o)); for (let t = 0; t !== e; ++t) r[t] = n[t]; (m.clippingState = r), (this.numIntersection = d ? this.numPlanes : 0), (this.numPlanes += t); } }); } function yi(t) { let e = new WeakMap(); function n(t, e) { return e === a ? (t.mapping = r) : e === o && (t.mapping = s), t; } function i(t) { const n = t.target; n.removeEventListener('dispose', i); const r = e.get(n); void 0 !== r && (e.delete(n), r.dispose()); } return { get: function (r) { if (r && r.isTexture) { const s = r.mapping; if (s === a || s === o) { if (e.has(r)) { return n(e.get(r).texture, r.mapping); } { const s = r.image; if (s && s.height > 0) { const a = t.getRenderTarget(), o = new ni(s.height / 2); return ( o.fromEquirectangularTexture(t, r), e.set(r, o), t.setRenderTarget(a), r.addEventListener('dispose', i), n(o.texture, r.mapping) ); } return null; } } } return r; }, dispose: function () { e = new WeakMap(); }, }; } function xi(t) { const e = {}; function n(n) { if (void 0 !== e[n]) return e[n]; let i; switch (n) { case 'WEBGL_depth_texture': i = t.getExtension('WEBGL_depth_texture') || t.getExtension('MOZ_WEBGL_depth_texture') || t.getExtension('WEBKIT_WEBGL_depth_texture'); break; case 'EXT_texture_filter_anisotropic': i = t.getExtension('EXT_texture_filter_anisotropic') || t.getExtension('MOZ_EXT_texture_filter_anisotropic') || t.getExtension('WEBKIT_EXT_texture_filter_anisotropic'); break; case 'WEBGL_compressed_texture_s3tc': i = t.getExtension('WEBGL_compressed_texture_s3tc') || t.getExtension('MOZ_WEBGL_compressed_texture_s3tc') || t.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc'); break; case 'WEBGL_compressed_texture_pvrtc': i = t.getExtension('WEBGL_compressed_texture_pvrtc') || t.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'); break; default: i = t.getExtension(n); } return (e[n] = i), i; } return { has: function (t) { return null !== n(t); }, init: function (t) { t.isWebGL2 ? n('EXT_color_buffer_float') : (n('WEBGL_depth_texture'), n('OES_texture_float'), n('OES_texture_half_float'), n('OES_texture_half_float_linear'), n('OES_standard_derivatives'), n('OES_element_index_uint'), n('OES_vertex_array_object'), n('ANGLE_instanced_arrays')), n('OES_texture_float_linear'), n('EXT_color_buffer_half_float'); }, get: function (t) { const e = n(t); return ( null === e && console.warn( 'THREE.WebGLRenderer: ' + t + ' extension not supported.' ), e ); }, }; } function _i(t, e, n, i) { const r = {}, s = new WeakMap(); function a(t) { const o = t.target; null !== o.index && e.remove(o.index); for (const t in o.attributes) e.remove(o.attributes[t]); o.removeEventListener('dispose', a), delete r[o.id]; const l = s.get(o); l && (e.remove(l), s.delete(o)), i.releaseStatesOfGeometry(o), !0 === o.isInstancedBufferGeometry && delete o._maxInstanceCount, n.memory.geometries--; } function o(t) { const n = [], i = t.index, r = t.attributes.position; let a = 0; if (null !== i) { const t = i.array; a = i.version; for (let e = 0, i = t.length; e < i; e += 3) { const i = t[e + 0], r = t[e + 1], s = t[e + 2]; n.push(i, r, r, s, s, i); } } else { const t = r.array; a = r.version; for (let e = 0, i = t.length / 3 - 1; e < i; e += 3) { const t = e + 0, i = e + 1, r = e + 2; n.push(t, i, i, r, r, t); } } const o = new (gn(n) > 65535 ? dn : hn)(n, 1); o.version = a; const l = s.get(t); l && e.remove(l), s.set(t, o); } return { get: function (t, e) { return ( !0 === r[e.id] || (e.addEventListener('dispose', a), (r[e.id] = !0), n.memory.geometries++), e ); }, update: function (t) { const n = t.attributes; for (const t in n) e.update(n[t], 34962); const i = t.morphAttributes; for (const t in i) { const n = i[t]; for (let t = 0, i = n.length; t < i; t++) e.update(n[t], 34962); } }, getWireframeAttribute: function (t) { const e = s.get(t); if (e) { const n = t.index; null !== n && e.version < n.version && o(t); } else o(t); return s.get(t); }, }; } function wi(t, e, n, i) { const r = i.isWebGL2; let s, a, o; (this.setMode = function (t) { s = t; }), (this.setIndex = function (t) { (a = t.type), (o = t.bytesPerElement); }), (this.render = function (e, i) { t.drawElements(s, i, a, e * o), n.update(i, s, 1); }), (this.renderInstances = function (i, l, c) { if (0 === c) return; let h, u; if (r) (h = t), (u = 'drawElementsInstanced'); else if ( ((h = e.get('ANGLE_instanced_arrays')), (u = 'drawElementsInstancedANGLE'), null === h) ) return void console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); h[u](s, l, a, i * o, c), n.update(l, s, c); }); } function bi(t) { const e = { frame: 0, calls: 0, triangles: 0, points: 0, lines: 0 }; return { memory: { geometries: 0, textures: 0 }, render: e, programs: null, autoReset: !0, reset: function () { e.frame++, (e.calls = 0), (e.triangles = 0), (e.points = 0), (e.lines = 0); }, update: function (t, n, i) { switch ((e.calls++, n)) { case 4: e.triangles += i * (t / 3); break; case 1: e.lines += i * (t / 2); break; case 3: e.lines += i * (t - 1); break; case 2: e.lines += i * t; break; case 0: e.points += i * t; break; default: console.error('THREE.WebGLInfo: Unknown draw mode:', n); } }, }; } function Mi(t, e) { return t[0] - e[0]; } function Si(t, e) { return Math.abs(e[1]) - Math.abs(t[1]); } function Ti(t) { const e = {}, n = new Float32Array(8), i = []; for (let t = 0; t < 8; t++) i[t] = [t, 0]; return { update: function (r, s, a, o) { const l = r.morphTargetInfluences, c = void 0 === l ? 0 : l.length; let h = e[s.id]; if (void 0 === h) { h = []; for (let t = 0; t < c; t++) h[t] = [t, 0]; e[s.id] = h; } for (let t = 0; t < c; t++) { const e = h[t]; (e[0] = t), (e[1] = l[t]); } h.sort(Si); for (let t = 0; t < 8; t++) t < c && h[t][1] ? ((i[t][0] = h[t][0]), (i[t][1] = h[t][1])) : ((i[t][0] = Number.MAX_SAFE_INTEGER), (i[t][1] = 0)); i.sort(Mi); const u = a.morphTargets && s.morphAttributes.position, d = a.morphNormals && s.morphAttributes.normal; let p = 0; for (let t = 0; t < 8; t++) { const e = i[t], r = e[0], a = e[1]; r !== Number.MAX_SAFE_INTEGER && a ? (u && s.getAttribute('morphTarget' + t) !== u[r] && s.setAttribute('morphTarget' + t, u[r]), d && s.getAttribute('morphNormal' + t) !== d[r] && s.setAttribute('morphNormal' + t, d[r]), (n[t] = a), (p += a)) : (u && !0 === s.hasAttribute('morphTarget' + t) && s.deleteAttribute('morphTarget' + t), d && !0 === s.hasAttribute('morphNormal' + t) && s.deleteAttribute('morphNormal' + t), (n[t] = 0)); } const m = s.morphTargetsRelative ? 1 : 1 - p; o.getUniforms().setValue(t, 'morphTargetBaseInfluence', m), o.getUniforms().setValue(t, 'morphTargetInfluences', n); }, }; } function Ei(t, e, n, i) { let r = new WeakMap(); function s(t) { const e = t.target; e.removeEventListener('dispose', s), n.remove(e.instanceMatrix), null !== e.instanceColor && n.remove(e.instanceColor); } return { update: function (t) { const a = i.render.frame, o = t.geometry, l = e.get(t, o); return ( r.get(l) !== a && (e.update(l), r.set(l, a)), t.isInstancedMesh && (!1 === t.hasEventListener('dispose', s) && t.addEventListener('dispose', s), n.update(t.instanceMatrix, 34962), null !== t.instanceColor && n.update(t.instanceColor, 34962)), l ); }, dispose: function () { r = new WeakMap(); }, }; } di.physical = { uniforms: Yn([ di.standard.uniforms, { clearcoat: { value: 0 }, clearcoatMap: { value: null }, clearcoatRoughness: { value: 0 }, clearcoatRoughnessMap: { value: null }, clearcoatNormalScale: { value: new vt(1, 1) }, clearcoatNormalMap: { value: null }, sheen: { value: new tn(0) }, transmission: { value: 0 }, transmissionMap: { value: null }, }, ]), vertexShader: hi.meshphysical_vert, fragmentShader: hi.meshphysical_frag, }; class Ai extends bt { constructor(t = null, e = 1, n = 1, i = 1) { super(null), (this.image = { data: t, width: e, height: n, depth: i }), (this.magFilter = p), (this.minFilter = p), (this.wrapR = u), (this.generateMipmaps = !1), (this.flipY = !1), (this.unpackAlignment = 1), (this.needsUpdate = !0); } } Ai.prototype.isDataTexture2DArray = !0; class Li extends bt { constructor(t = null, e = 1, n = 1, i = 1) { super(null), (this.image = { data: t, width: e, height: n, depth: i }), (this.magFilter = p), (this.minFilter = p), (this.wrapR = u), (this.generateMipmaps = !1), (this.flipY = !1), (this.unpackAlignment = 1), (this.needsUpdate = !0); } } Li.prototype.isDataTexture3D = !0; const Ri = new bt(), Ci = new Ai(), Pi = new Li(), Di = new ei(), Ii = [], Ni = [], Bi = new Float32Array(16), zi = new Float32Array(9), Fi = new Float32Array(4); function Oi(t, e, n) { const i = t[0]; if (i <= 0 || i > 0) return t; const r = e * n; let s = Ii[r]; if ((void 0 === s && ((s = new Float32Array(r)), (Ii[r] = s)), 0 !== e)) { i.toArray(s, 0); for (let i = 1, r = 0; i !== e; ++i) (r += n), t[i].toArray(s, r); } return s; } function Hi(t, e) { if (t.length !== e.length) return !1; for (let n = 0, i = t.length; n < i; n++) if (t[n] !== e[n]) return !1; return !0; } function Gi(t, e) { for (let n = 0, i = e.length; n < i; n++) t[n] = e[n]; } function Ui(t, e) { let n = Ni[e]; void 0 === n && ((n = new Int32Array(e)), (Ni[e] = n)); for (let i = 0; i !== e; ++i) n[i] = t.allocateTextureUnit(); return n; } function ki(t, e) { const n = this.cache; n[0] !== e && (t.uniform1f(this.addr, e), (n[0] = e)); } function Vi(t, e) { const n = this.cache; if (void 0 !== e.x) (n[0] === e.x && n[1] === e.y) || (t.uniform2f(this.addr, e.x, e.y), (n[0] = e.x), (n[1] = e.y)); else { if (Hi(n, e)) return; t.uniform2fv(this.addr, e), Gi(n, e); } } function Wi(t, e) { const n = this.cache; if (void 0 !== e.x) (n[0] === e.x && n[1] === e.y && n[2] === e.z) || (t.uniform3f(this.addr, e.x, e.y, e.z), (n[0] = e.x), (n[1] = e.y), (n[2] = e.z)); else if (void 0 !== e.r) (n[0] === e.r && n[1] === e.g && n[2] === e.b) || (t.uniform3f(this.addr, e.r, e.g, e.b), (n[0] = e.r), (n[1] = e.g), (n[2] = e.b)); else { if (Hi(n, e)) return; t.uniform3fv(this.addr, e), Gi(n, e); } } function ji(t, e) { const n = this.cache; if (void 0 !== e.x) (n[0] === e.x && n[1] === e.y && n[2] === e.z && n[3] === e.w) || (t.uniform4f(this.addr, e.x, e.y, e.z, e.w), (n[0] = e.x), (n[1] = e.y), (n[2] = e.z), (n[3] = e.w)); else { if (Hi(n, e)) return; t.uniform4fv(this.addr, e), Gi(n, e); } } function qi(t, e) { const n = this.cache, i = e.elements; if (void 0 === i) { if (Hi(n, e)) return; t.uniformMatrix2fv(this.addr, !1, e), Gi(n, e); } else { if (Hi(n, i)) return; Fi.set(i), t.uniformMatrix2fv(this.addr, !1, Fi), Gi(n, i); } } function Xi(t, e) { const n = this.cache, i = e.elements; if (void 0 === i) { if (Hi(n, e)) return; t.uniformMatrix3fv(this.addr, !1, e), Gi(n, e); } else { if (Hi(n, i)) return; zi.set(i), t.uniformMatrix3fv(this.addr, !1, zi), Gi(n, i); } } function Yi(t, e) { const n = this.cache, i = e.elements; if (void 0 === i) { if (Hi(n, e)) return; t.uniformMatrix4fv(this.addr, !1, e), Gi(n, e); } else { if (Hi(n, i)) return; Bi.set(i), t.uniformMatrix4fv(this.addr, !1, Bi), Gi(n, i); } } function Zi(t, e) { const n = this.cache; n[0] !== e && (t.uniform1i(this.addr, e), (n[0] = e)); } function Ji(t, e) { const n = this.cache; Hi(n, e) || (t.uniform2iv(this.addr, e), Gi(n, e)); } function Qi(t, e) { const n = this.cache; Hi(n, e) || (t.uniform3iv(this.addr, e), Gi(n, e)); } function Ki(t, e) { const n = this.cache; Hi(n, e) || (t.uniform4iv(this.addr, e), Gi(n, e)); } function $i(t, e) { const n = this.cache; n[0] !== e && (t.uniform1ui(this.addr, e), (n[0] = e)); } function tr(t, e) { const n = this.cache; Hi(n, e) || (t.uniform2uiv(this.addr, e), Gi(n, e)); } function er(t, e) { const n = this.cache; Hi(n, e) || (t.uniform3uiv(this.addr, e), Gi(n, e)); } function nr(t, e) { const n = this.cache; Hi(n, e) || (t.uniform4uiv(this.addr, e), Gi(n, e)); } function ir(t, e, n) { const i = this.cache, r = n.allocateTextureUnit(); i[0] !== r && (t.uniform1i(this.addr, r), (i[0] = r)), n.safeSetTexture2D(e || Ri, r); } function rr(t, e, n) { const i = this.cache, r = n.allocateTextureUnit(); i[0] !== r && (t.uniform1i(this.addr, r), (i[0] = r)), n.setTexture3D(e || Pi, r); } function sr(t, e, n) { const i = this.cache, r = n.allocateTextureUnit(); i[0] !== r && (t.uniform1i(this.addr, r), (i[0] = r)), n.safeSetTextureCube(e || Di, r); } function ar(t, e, n) { const i = this.cache, r = n.allocateTextureUnit(); i[0] !== r && (t.uniform1i(this.addr, r), (i[0] = r)), n.setTexture2DArray(e || Ci, r); } function or(t, e) { t.uniform1fv(this.addr, e); } function lr(t, e) { const n = Oi(e, this.size, 2); t.uniform2fv(this.addr, n); } function cr(t, e) { const n = Oi(e, this.size, 3); t.uniform3fv(this.addr, n); } function hr(t, e) { const n = Oi(e, this.size, 4); t.uniform4fv(this.addr, n); } function ur(t, e) { const n = Oi(e, this.size, 4); t.uniformMatrix2fv(this.addr, !1, n); } function dr(t, e) { const n = Oi(e, this.size, 9); t.uniformMatrix3fv(this.addr, !1, n); } function pr(t, e) { const n = Oi(e, this.size, 16); t.uniformMatrix4fv(this.addr, !1, n); } function mr(t, e) { t.uniform1iv(this.addr, e); } function fr(t, e) { t.uniform2iv(this.addr, e); } function gr(t, e) { t.uniform3iv(this.addr, e); } function vr(t, e) { t.uniform4iv(this.addr, e); } function yr(t, e) { t.uniform1uiv(this.addr, e); } function xr(t, e) { t.uniform2uiv(this.addr, e); } function _r(t, e) { t.uniform3uiv(this.addr, e); } function wr(t, e) { t.uniform4uiv(this.addr, e); } function br(t, e, n) { const i = e.length, r = Ui(n, i); t.uniform1iv(this.addr, r); for (let t = 0; t !== i; ++t) n.safeSetTexture2D(e[t] || Ri, r[t]); } function Mr(t, e, n) { const i = e.length, r = Ui(n, i); t.uniform1iv(this.addr, r); for (let t = 0; t !== i; ++t) n.safeSetTextureCube(e[t] || Di, r[t]); } function Sr(t, e, n) { (this.id = t), (this.addr = n), (this.cache = []), (this.setValue = (function (t) { switch (t) { case 5126: return ki; case 35664: return Vi; case 35665: return Wi; case 35666: return ji; case 35674: return qi; case 35675: return Xi; case 35676: return Yi; case 5124: case 35670: return Zi; case 35667: case 35671: return Ji; case 35668: case 35672: return Qi; case 35669: case 35673: return Ki; case 5125: return $i; case 36294: return tr; case 36295: return er; case 36296: return nr; case 35678: case 36198: case 36298: case 36306: case 35682: return ir; case 35679: case 36299: case 36307: return rr; case 35680: case 36300: case 36308: case 36293: return sr; case 36289: case 36303: case 36311: case 36292: return ar; } })(e.type)); } function Tr(t, e, n) { (this.id = t), (this.addr = n), (this.cache = []), (this.size = e.size), (this.setValue = (function (t) { switch (t) { case 5126: return or; case 35664: return lr; case 35665: return cr; case 35666: return hr; case 35674: return ur; case 35675: return dr; case 35676: return pr; case 5124: case 35670: return mr; case 35667: case 35671: return fr; case 35668: case 35672: return gr; case 35669: case 35673: return vr; case 5125: return yr; case 36294: return xr; case 36295: return _r; case 36296: return wr; case 35678: case 36198: case 36298: case 36306: case 35682: return br; case 35680: case 36300: case 36308: case 36293: return Mr; } })(e.type)); } function Er(t) { (this.id = t), (this.seq = []), (this.map = {}); } (Tr.prototype.updateCache = function (t) { const e = this.cache; t instanceof Float32Array && e.length !== t.length && (this.cache = new Float32Array(t.length)), Gi(e, t); }), (Er.prototype.setValue = function (t, e, n) { const i = this.seq; for (let r = 0, s = i.length; r !== s; ++r) { const s = i[r]; s.setValue(t, e[s.id], n); } }); const Ar = /(\w+)(\])?(\[|\.)?/g; function Lr(t, e) { t.seq.push(e), (t.map[e.id] = e); } function Rr(t, e, n) { const i = t.name, r = i.length; for (Ar.lastIndex = 0; ; ) { const s = Ar.exec(i), a = Ar.lastIndex; let o = s[1]; const l = ']' === s[2], c = s[3]; if ((l && (o |= 0), void 0 === c || ('[' === c && a + 2 === r))) { Lr(n, void 0 === c ? new Sr(o, t, e) : new Tr(o, t, e)); break; } { let t = n.map[o]; void 0 === t && ((t = new Er(o)), Lr(n, t)), (n = t); } } } function Cr(t, e) { (this.seq = []), (this.map = {}); const n = t.getProgramParameter(e, 35718); for (let i = 0; i < n; ++i) { const n = t.getActiveUniform(e, i); Rr(n, t.getUniformLocation(e, n.name), this); } } function Pr(t, e, n) { const i = t.createShader(e); return t.shaderSource(i, n), t.compileShader(i), i; } (Cr.prototype.setValue = function (t, e, n, i) { const r = this.map[e]; void 0 !== r && r.setValue(t, n, i); }), (Cr.prototype.setOptional = function (t, e, n) { const i = e[n]; void 0 !== i && this.setValue(t, n, i); }), (Cr.upload = function (t, e, n, i) { for (let r = 0, s = e.length; r !== s; ++r) { const s = e[r], a = n[s.id]; !1 !== a.needsUpdate && s.setValue(t, a.value, i); } }), (Cr.seqWithValue = function (t, e) { const n = []; for (let i = 0, r = t.length; i !== r; ++i) { const r = t[i]; r.id in e && n.push(r); } return n; }); let Dr = 0; function Ir(t) { switch (t) { case X: return ['Linear', '( value )']; case Y: return ['sRGB', '( value )']; case J: return ['RGBE', '( value )']; case Q: return ['RGBM', '( value, 7.0 )']; case K: return ['RGBM', '( value, 16.0 )']; case $: return ['RGBD', '( value, 256.0 )']; case Z: return ['Gamma', '( value, float( GAMMA_FACTOR ) )']; case 3003: return ['LogLuv', '( value )']; default: return ( console.warn('THREE.WebGLProgram: Unsupported encoding:', t), ['Linear', '( value )'] ); } } function Nr(t, e, n) { const i = t.getShaderParameter(e, 35713), r = t.getShaderInfoLog(e).trim(); if (i && '' === r) return ''; return ( 'THREE.WebGLShader: gl.getShaderInfoLog() ' + n + '\n' + r + (function (t) { const e = t.split('\n'); for (let t = 0; t < e.length; t++) e[t] = t + 1 + ': ' + e[t]; return e.join('\n'); })(t.getShaderSource(e)) ); } function Br(t, e) { const n = Ir(e); return ( 'vec4 ' + t + '( vec4 value ) { return ' + n[0] + 'ToLinear' + n[1] + '; }' ); } function zr(t, e) { const n = Ir(e); return ( 'vec4 ' + t + '( vec4 value ) { return LinearTo' + n[0] + n[1] + '; }' ); } function Fr(t, e) { let n; switch (e) { case 1: n = 'Linear'; break; case 2: n = 'Reinhard'; break; case 3: n = 'OptimizedCineon'; break; case 4: n = 'ACESFilmic'; break; case 5: n = 'Custom'; break; default: console.warn('THREE.WebGLProgram: Unsupported toneMapping:', e), (n = 'Linear'); } return ( 'vec3 ' + t + '( vec3 color ) { return ' + n + 'ToneMapping( color ); }' ); } function Or(t) { return '' !== t; } function Hr(t, e) { return t .replace(/NUM_DIR_LIGHTS/g, e.numDirLights) .replace(/NUM_SPOT_LIGHTS/g, e.numSpotLights) .replace(/NUM_RECT_AREA_LIGHTS/g, e.numRectAreaLights) .replace(/NUM_POINT_LIGHTS/g, e.numPointLights) .replace(/NUM_HEMI_LIGHTS/g, e.numHemiLights) .replace(/NUM_DIR_LIGHT_SHADOWS/g, e.numDirLightShadows) .replace(/NUM_SPOT_LIGHT_SHADOWS/g, e.numSpotLightShadows) .replace(/NUM_POINT_LIGHT_SHADOWS/g, e.numPointLightShadows); } function Gr(t, e) { return t .replace(/NUM_CLIPPING_PLANES/g, e.numClippingPlanes) .replace( /UNION_CLIPPING_PLANES/g, e.numClippingPlanes - e.numClipIntersection ); } const Ur = /^[ \t]*#include +<([\w\d./]+)>/gm; function kr(t) { return t.replace(Ur, Vr); } function Vr(t, e) { const n = hi[e]; if (void 0 === n) throw new Error('Can not resolve #include <' + e + '>'); return kr(n); } const Wr = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g, jr = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; function qr(t) { return t.replace(jr, Yr).replace(Wr, Xr); } function Xr(t, e, n, i) { return ( console.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' ), Yr(t, e, n, i) ); } function Yr(t, e, n, i) { let r = ''; for (let t = parseInt(e); t < parseInt(n); t++) r += i .replace(/\[\s*i\s*\]/g, '[ ' + t + ' ]') .replace(/UNROLLED_LOOP_INDEX/g, t); return r; } function Zr(t) { let e = 'precision ' + t.precision + ' float;\nprecision ' + t.precision + ' int;'; return ( 'highp' === t.precision ? (e += '\n#define HIGH_PRECISION') : 'mediump' === t.precision ? (e += '\n#define MEDIUM_PRECISION') : 'lowp' === t.precision && (e += '\n#define LOW_PRECISION'), e ); } function Jr(t, e, n, i) { const a = t.getContext(), o = n.defines; let h = n.vertexShader, u = n.fragmentShader; const d = (function (t) { let e = 'SHADOWMAP_TYPE_BASIC'; return ( 1 === t.shadowMapType ? (e = 'SHADOWMAP_TYPE_PCF') : 2 === t.shadowMapType ? (e = 'SHADOWMAP_TYPE_PCF_SOFT') : 3 === t.shadowMapType && (e = 'SHADOWMAP_TYPE_VSM'), e ); })(n), p = (function (t) { let e = 'ENVMAP_TYPE_CUBE'; if (t.envMap) switch (t.envMapMode) { case r: case s: e = 'ENVMAP_TYPE_CUBE'; break; case l: case c: e = 'ENVMAP_TYPE_CUBE_UV'; } return e; })(n), m = (function (t) { let e = 'ENVMAP_MODE_REFLECTION'; if (t.envMap) switch (t.envMapMode) { case s: case c: e = 'ENVMAP_MODE_REFRACTION'; } return e; })(n), f = (function (t) { let e = 'ENVMAP_BLENDING_NONE'; if (t.envMap) switch (t.combine) { case 0: e = 'ENVMAP_BLENDING_MULTIPLY'; break; case 1: e = 'ENVMAP_BLENDING_MIX'; break; case 2: e = 'ENVMAP_BLENDING_ADD'; } return e; })(n), g = t.gammaFactor > 0 ? t.gammaFactor : 1, v = n.isWebGL2 ? '' : (function (t) { return [ t.extensionDerivatives || t.envMapCubeUV || t.bumpMap || t.tangentSpaceNormalMap || t.clearcoatNormalMap || t.flatShading || 'physical' === t.shaderID ? '#extension GL_OES_standard_derivatives : enable' : '', (t.extensionFragDepth || t.logarithmicDepthBuffer) && t.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '', t.extensionDrawBuffers && t.rendererExtensionDrawBuffers ? '#extension GL_EXT_draw_buffers : require' : '', (t.extensionShaderTextureLOD || t.envMap) && t.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : '', ] .filter(Or) .join('\n'); })(n), y = (function (t) { const e = []; for (const n in t) { const i = t[n]; !1 !== i && e.push('#define ' + n + ' ' + i); } return e.join('\n'); })(o), x = a.createProgram(); let _, w, b = n.glslVersion ? '#version ' + n.glslVersion + '\n' : ''; n.isRawShaderMaterial ? ((_ = [y].filter(Or).join('\n')), _.length > 0 && (_ += '\n'), (w = [v, y].filter(Or).join('\n')), w.length > 0 && (w += '\n')) : ((_ = [ Zr(n), '#define SHADER_NAME ' + n.shaderName, y, n.instancing ? '#define USE_INSTANCING' : '', n.instancingColor ? '#define USE_INSTANCING_COLOR' : '', n.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', '#define GAMMA_FACTOR ' + g, '#define MAX_BONES ' + n.maxBones, n.useFog && n.fog ? '#define USE_FOG' : '', n.useFog && n.fogExp2 ? '#define FOG_EXP2' : '', n.map ? '#define USE_MAP' : '', n.envMap ? '#define USE_ENVMAP' : '', n.envMap ? '#define ' + m : '', n.lightMap ? '#define USE_LIGHTMAP' : '', n.aoMap ? '#define USE_AOMAP' : '', n.emissiveMap ? '#define USE_EMISSIVEMAP' : '', n.bumpMap ? '#define USE_BUMPMAP' : '', n.normalMap ? '#define USE_NORMALMAP' : '', n.normalMap && n.objectSpaceNormalMap ? '#define OBJECTSPACE_NORMALMAP' : '', n.normalMap && n.tangentSpaceNormalMap ? '#define TANGENTSPACE_NORMALMAP' : '', n.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', n.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', n.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', n.displacementMap && n.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', n.specularMap ? '#define USE_SPECULARMAP' : '', n.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', n.metalnessMap ? '#define USE_METALNESSMAP' : '', n.alphaMap ? '#define USE_ALPHAMAP' : '', n.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', n.vertexTangents ? '#define USE_TANGENT' : '', n.vertexColors ? '#define USE_COLOR' : '', n.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', n.vertexUvs ? '#define USE_UV' : '', n.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '', n.flatShading ? '#define FLAT_SHADED' : '', n.skinning ? '#define USE_SKINNING' : '', n.useVertexTexture ? '#define BONE_TEXTURE' : '', n.morphTargets ? '#define USE_MORPHTARGETS' : '', n.morphNormals && !1 === n.flatShading ? '#define USE_MORPHNORMALS' : '', n.doubleSided ? '#define DOUBLE_SIDED' : '', n.flipSided ? '#define FLIP_SIDED' : '', n.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', n.shadowMapEnabled ? '#define ' + d : '', n.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', n.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', n.logarithmicDepthBuffer && n.rendererExtensionFragDepth ? '#define USE_LOGDEPTHBUF_EXT' : '', 'uniform mat4 modelMatrix;', 'uniform mat4 modelViewMatrix;', 'uniform mat4 projectionMatrix;', 'uniform mat4 viewMatrix;', 'uniform mat3 normalMatrix;', 'uniform vec3 cameraPosition;', 'uniform bool isOrthographic;', '#ifdef USE_INSTANCING', '\tattribute mat4 instanceMatrix;', '#endif', '#ifdef USE_INSTANCING_COLOR', '\tattribute vec3 instanceColor;', '#endif', 'attribute vec3 position;', 'attribute vec3 normal;', 'attribute vec2 uv;', '#ifdef USE_TANGENT', '\tattribute vec4 tangent;', '#endif', '#if defined( USE_COLOR_ALPHA )', '\tattribute vec4 color;', '#elif defined( 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(Or) .join('\n')), (w = [ v, Zr(n), '#define SHADER_NAME ' + n.shaderName, y, n.alphaTest ? '#define ALPHATEST ' + n.alphaTest + (n.alphaTest % 1 ? '' : '.0') : '', '#define GAMMA_FACTOR ' + g, n.useFog && n.fog ? '#define USE_FOG' : '', n.useFog && n.fogExp2 ? '#define FOG_EXP2' : '', n.map ? '#define USE_MAP' : '', n.matcap ? '#define USE_MATCAP' : '', n.envMap ? '#define USE_ENVMAP' : '', n.envMap ? '#define ' + p : '', n.envMap ? '#define ' + m : '', n.envMap ? '#define ' + f : '', n.lightMap ? '#define USE_LIGHTMAP' : '', n.aoMap ? '#define USE_AOMAP' : '', n.emissiveMap ? '#define USE_EMISSIVEMAP' : '', n.bumpMap ? '#define USE_BUMPMAP' : '', n.normalMap ? '#define USE_NORMALMAP' : '', n.normalMap && n.objectSpaceNormalMap ? '#define OBJECTSPACE_NORMALMAP' : '', n.normalMap && n.tangentSpaceNormalMap ? '#define TANGENTSPACE_NORMALMAP' : '', n.clearcoatMap ? '#define USE_CLEARCOATMAP' : '', n.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '', n.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '', n.specularMap ? '#define USE_SPECULARMAP' : '', n.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', n.metalnessMap ? '#define USE_METALNESSMAP' : '', n.alphaMap ? '#define USE_ALPHAMAP' : '', n.sheen ? '#define USE_SHEEN' : '', n.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '', n.vertexTangents ? '#define USE_TANGENT' : '', n.vertexColors || n.instancingColor ? '#define USE_COLOR' : '', n.vertexAlphas ? '#define USE_COLOR_ALPHA' : '', n.vertexUvs ? '#define USE_UV' : '', n.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '', n.gradientMap ? '#define USE_GRADIENTMAP' : '', n.flatShading ? '#define FLAT_SHADED' : '', n.doubleSided ? '#define DOUBLE_SIDED' : '', n.flipSided ? '#define FLIP_SIDED' : '', n.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', n.shadowMapEnabled ? '#define ' + d : '', n.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '', n.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '', n.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', n.logarithmicDepthBuffer && n.rendererExtensionFragDepth ? '#define USE_LOGDEPTHBUF_EXT' : '', (n.extensionShaderTextureLOD || n.envMap) && n.rendererExtensionShaderTextureLod ? '#define TEXTURE_LOD_EXT' : '', 'uniform mat4 viewMatrix;', 'uniform vec3 cameraPosition;', 'uniform bool isOrthographic;', 0 !== n.toneMapping ? '#define TONE_MAPPING' : '', 0 !== n.toneMapping ? hi.tonemapping_pars_fragment : '', 0 !== n.toneMapping ? Fr('toneMapping', n.toneMapping) : '', n.dithering ? '#define DITHERING' : '', hi.encodings_pars_fragment, n.map ? Br('mapTexelToLinear', n.mapEncoding) : '', n.matcap ? Br('matcapTexelToLinear', n.matcapEncoding) : '', n.envMap ? Br('envMapTexelToLinear', n.envMapEncoding) : '', n.emissiveMap ? Br('emissiveMapTexelToLinear', n.emissiveMapEncoding) : '', n.lightMap ? Br('lightMapTexelToLinear', n.lightMapEncoding) : '', zr('linearToOutputTexel', n.outputEncoding), n.depthPacking ? '#define DEPTH_PACKING ' + n.depthPacking : '', '\n', ] .filter(Or) .join('\n'))), (h = kr(h)), (h = Hr(h, n)), (h = Gr(h, n)), (u = kr(u)), (u = Hr(u, n)), (u = Gr(u, n)), (h = qr(h)), (u = qr(u)), n.isWebGL2 && !0 !== n.isRawShaderMaterial && ((b = '#version 300 es\n'), (_ = [ '#define attribute in', '#define varying out', '#define texture2D texture', ].join('\n') + '\n' + _), (w = [ '#define varying in', n.glslVersion === it ? '' : 'out highp vec4 pc_fragColor;', n.glslVersion === it ? '' : '#define gl_FragColor pc_fragColor', '#define gl_FragDepthEXT gl_FragDepth', '#define texture2D texture', '#define textureCube texture', '#define texture2DProj textureProj', '#define texture2DLodEXT textureLod', '#define texture2DProjLodEXT textureProjLod', '#define textureCubeLodEXT textureLod', '#define texture2DGradEXT textureGrad', '#define texture2DProjGradEXT textureProjGrad', '#define textureCubeGradEXT textureGrad', ].join('\n') + '\n' + w)); const M = b + w + u, S = Pr(a, 35633, b + _ + h), T = Pr(a, 35632, M); if ( (a.attachShader(x, S), a.attachShader(x, T), void 0 !== n.index0AttributeName ? a.bindAttribLocation(x, 0, n.index0AttributeName) : !0 === n.morphTargets && a.bindAttribLocation(x, 0, 'position'), a.linkProgram(x), t.debug.checkShaderErrors) ) { const t = a.getProgramInfoLog(x).trim(), e = a.getShaderInfoLog(S).trim(), n = a.getShaderInfoLog(T).trim(); let i = !0, r = !0; if (!1 === a.getProgramParameter(x, 35714)) { i = !1; const e = Nr(a, S, 'vertex'), n = Nr(a, T, 'fragment'); console.error( 'THREE.WebGLProgram: shader error: ', a.getError(), '35715', a.getProgramParameter(x, 35715), 'gl.getProgramInfoLog', t, e, n ); } else '' !== t ? console.warn('THREE.WebGLProgram: gl.getProgramInfoLog()', t) : ('' !== e && '' !== n) || (r = !1); r && (this.diagnostics = { runnable: i, programLog: t, vertexShader: { log: e, prefix: _ }, fragmentShader: { log: n, prefix: w }, }); } let E, A; return ( a.deleteShader(S), a.deleteShader(T), (this.getUniforms = function () { return void 0 === E && (E = new Cr(a, x)), E; }), (this.getAttributes = function () { return ( void 0 === A && (A = (function (t, e) { const n = {}, i = t.getProgramParameter(e, 35721); for (let r = 0; r < i; r++) { const i = t.getActiveAttrib(e, r).name; n[i] = t.getAttribLocation(e, i); } return n; })(a, x)), A ); }), (this.destroy = function () { i.releaseStatesOfProgram(this), a.deleteProgram(x), (this.program = void 0); }), (this.name = n.shaderName), (this.id = Dr++), (this.cacheKey = e), (this.usedTimes = 1), (this.program = x), (this.vertexShader = S), (this.fragmentShader = T), this ); } function Qr(t, e, n, i, r, s) { const a = [], o = i.isWebGL2, h = i.logarithmicDepthBuffer, u = i.floatVertexTextures, d = i.maxVertexUniforms, p = i.vertexTextures; let m = i.precision; const f = { MeshDepthMaterial: 'depth', MeshDistanceMaterial: 'distanceRGBA', MeshNormalMaterial: 'normal', MeshBasicMaterial: 'basic', MeshLambertMaterial: 'lambert', MeshPhongMaterial: 'phong', MeshToonMaterial: 'toon', MeshStandardMaterial: 'physical', MeshPhysicalMaterial: 'physical', MeshMatcapMaterial: 'matcap', LineBasicMaterial: 'basic', LineDashedMaterial: 'dashed', PointsMaterial: 'points', ShadowMaterial: 'shadow', SpriteMaterial: 'sprite', }, g = [ 'precision', 'isWebGL2', 'supportsVertexTextures', 'outputEncoding', 'instancing', 'instancingColor', 'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV', 'lightMap', 'lightMapEncoding', 'aoMap', 'emissiveMap', 'emissiveMapEncoding', 'bumpMap', 'normalMap', 'objectSpaceNormalMap', 'tangentSpaceNormalMap', 'clearcoatMap', 'clearcoatRoughnessMap', 'clearcoatNormalMap', 'displacementMap', 'specularMap', 'roughnessMap', 'metalnessMap', 'gradientMap', 'alphaMap', 'combine', 'vertexColors', 'vertexAlphas', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2', 'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning', 'maxBones', 'useVertexTexture', 'morphTargets', 'morphNormals', 'premultipliedAlpha', 'numDirLights', 'numPointLights', 'numSpotLights', 'numHemiLights', 'numRectAreaLights', 'numDirLightShadows', 'numPointLightShadows', 'numSpotLightShadows', 'shadowMapEnabled', 'shadowMapType', 'toneMapping', 'physicallyCorrectLights', 'alphaTest', 'doubleSided', 'flipSided', 'numClippingPlanes', 'numClipIntersection', 'depthPacking', 'dithering', 'sheen', 'transmissionMap', ]; function v(t) { let e; return ( t && t.isTexture ? (e = t.encoding) : t && t.isWebGLRenderTarget ? (console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ), (e = t.texture.encoding)) : (e = X), e ); } return { getParameters: function (r, a, g, y, x) { const _ = y.fog, w = r.isMeshStandardMaterial ? y.environment : null, b = e.get(r.envMap || w), M = f[r.type], S = x.isSkinnedMesh ? (function (t) { const e = t.skeleton.bones; if (u) return 1024; { const t = d, n = Math.floor((t - 20) / 4), i = Math.min(n, e.length); return i < e.length ? (console.warn( 'THREE.WebGLRenderer: Skeleton has ' + e.length + ' bones. This GPU supports ' + i + '.' ), 0) : i; } })(x) : 0; let T, E; if ( (null !== r.precision && ((m = i.getMaxPrecision(r.precision)), m !== r.precision && console.warn( 'THREE.WebGLProgram.getParameters:', r.precision, 'not supported, using', m, 'instead.' )), M) ) { const t = di[M]; (T = t.vertexShader), (E = t.fragmentShader); } else (T = r.vertexShader), (E = r.fragmentShader); const A = t.getRenderTarget(); return { isWebGL2: o, shaderID: M, shaderName: r.type, vertexShader: T, fragmentShader: E, defines: r.defines, isRawShaderMaterial: !0 === r.isRawShaderMaterial, glslVersion: r.glslVersion, precision: m, instancing: !0 === x.isInstancedMesh, instancingColor: !0 === x.isInstancedMesh && null !== x.instanceColor, supportsVertexTextures: p, outputEncoding: null !== A ? v(A.texture) : t.outputEncoding, map: !!r.map, mapEncoding: v(r.map), matcap: !!r.matcap, matcapEncoding: v(r.matcap), envMap: !!b, envMapMode: b && b.mapping, envMapEncoding: v(b), envMapCubeUV: !!b && (b.mapping === l || b.mapping === c), lightMap: !!r.lightMap, lightMapEncoding: v(r.lightMap), aoMap: !!r.aoMap, emissiveMap: !!r.emissiveMap, emissiveMapEncoding: v(r.emissiveMap), bumpMap: !!r.bumpMap, normalMap: !!r.normalMap, objectSpaceNormalMap: 1 === r.normalMapType, tangentSpaceNormalMap: 0 === r.normalMapType, clearcoatMap: !!r.clearcoatMap, clearcoatRoughnessMap: !!r.clearcoatRoughnessMap, clearcoatNormalMap: !!r.clearcoatNormalMap, displacementMap: !!r.displacementMap, roughnessMap: !!r.roughnessMap, metalnessMap: !!r.metalnessMap, specularMap: !!r.specularMap, alphaMap: !!r.alphaMap, gradientMap: !!r.gradientMap, sheen: !!r.sheen, transmissionMap: !!r.transmissionMap, combine: r.combine, vertexTangents: r.normalMap && r.vertexTangents, vertexColors: r.vertexColors, vertexAlphas: !0 === r.vertexColors && x.geometry && x.geometry.attributes.color && 4 === x.geometry.attributes.color.itemSize, vertexUvs: !!( r.map || r.bumpMap || r.normalMap || r.specularMap || r.alphaMap || r.emissiveMap || r.roughnessMap || r.metalnessMap || r.clearcoatMap || r.clearcoatRoughnessMap || r.clearcoatNormalMap || r.displacementMap || r.transmissionMap ), uvsVertexOnly: !( r.map || r.bumpMap || r.normalMap || r.specularMap || r.alphaMap || r.emissiveMap || r.roughnessMap || r.metalnessMap || r.clearcoatNormalMap || r.transmissionMap || !r.displacementMap ), fog: !!_, useFog: r.fog, fogExp2: _ && _.isFogExp2, flatShading: !!r.flatShading, sizeAttenuation: r.sizeAttenuation, logarithmicDepthBuffer: h, skinning: r.skinning && S > 0, maxBones: S, useVertexTexture: u, morphTargets: r.morphTargets, morphNormals: r.morphNormals, numDirLights: a.directional.length, numPointLights: a.point.length, numSpotLights: a.spot.length, numRectAreaLights: a.rectArea.length, numHemiLights: a.hemi.length, numDirLightShadows: a.directionalShadowMap.length, numPointLightShadows: a.pointShadowMap.length, numSpotLightShadows: a.spotShadowMap.length, numClippingPlanes: s.numPlanes, numClipIntersection: s.numIntersection, dithering: r.dithering, shadowMapEnabled: t.shadowMap.enabled && g.length > 0, shadowMapType: t.shadowMap.type, toneMapping: r.toneMapped ? t.toneMapping : 0, physicallyCorrectLights: t.physicallyCorrectLights, premultipliedAlpha: r.premultipliedAlpha, alphaTest: r.alphaTest, doubleSided: 2 === r.side, flipSided: 1 === r.side, depthPacking: void 0 !== r.depthPacking && r.depthPacking, index0AttributeName: r.index0AttributeName, extensionDerivatives: r.extensions && r.extensions.derivatives, extensionFragDepth: r.extensions && r.extensions.fragDepth, extensionDrawBuffers: r.extensions && r.extensions.drawBuffers, extensionShaderTextureLOD: r.extensions && r.extensions.shaderTextureLOD, rendererExtensionFragDepth: o || n.has('EXT_frag_depth'), rendererExtensionDrawBuffers: o || n.has('WEBGL_draw_buffers'), rendererExtensionShaderTextureLod: o || n.has('EXT_shader_texture_lod'), customProgramCacheKey: r.customProgramCacheKey(), }; }, getProgramCacheKey: function (e) { const n = []; if ( (e.shaderID ? n.push(e.shaderID) : (n.push(e.fragmentShader), n.push(e.vertexShader)), void 0 !== e.defines) ) for (const t in e.defines) n.push(t), n.push(e.defines[t]); if (!1 === e.isRawShaderMaterial) { for (let t = 0; t < g.length; t++) n.push(e[g[t]]); n.push(t.outputEncoding), n.push(t.gammaFactor); } return n.push(e.customProgramCacheKey), n.join(); }, getUniforms: function (t) { const e = f[t.type]; let n; if (e) { const t = di[e]; n = Zn.clone(t.uniforms); } else n = t.uniforms; return n; }, acquireProgram: function (e, n) { let i; for (let t = 0, e = a.length; t < e; t++) { const e = a[t]; if (e.cacheKey === n) { (i = e), ++i.usedTimes; break; } } return void 0 === i && ((i = new Jr(t, n, e, r)), a.push(i)), i; }, releaseProgram: function (t) { if (0 == --t.usedTimes) { const e = a.indexOf(t); (a[e] = a[a.length - 1]), a.pop(), t.destroy(); } }, programs: a, }; } function Kr() { let t = new WeakMap(); return { get: function (e) { let n = t.get(e); return void 0 === n && ((n = {}), t.set(e, n)), n; }, remove: function (e) { t.delete(e); }, update: function (e, n, i) { t.get(e)[n] = i; }, dispose: function () { t = new WeakMap(); }, }; } function $r(t, e) { return t.groupOrder !== e.groupOrder ? t.groupOrder - e.groupOrder : t.renderOrder !== e.renderOrder ? t.renderOrder - e.renderOrder : t.program !== e.program ? t.program.id - e.program.id : t.material.id !== e.material.id ? t.material.id - e.material.id : t.z !== e.z ? t.z - e.z : t.id - e.id; } function ts(t, e) { return t.groupOrder !== e.groupOrder ? t.groupOrder - e.groupOrder : t.renderOrder !== e.renderOrder ? t.renderOrder - e.renderOrder : t.z !== e.z ? e.z - t.z : t.id - e.id; } function es(t) { const e = []; let n = 0; const i = [], r = [], s = { id: -1 }; function a(i, r, a, o, l, c) { let h = e[n]; const u = t.get(a); return ( void 0 === h ? ((h = { id: i.id, object: i, geometry: r, material: a, program: u.program || s, groupOrder: o, renderOrder: i.renderOrder, z: l, group: c, }), (e[n] = h)) : ((h.id = i.id), (h.object = i), (h.geometry = r), (h.material = a), (h.program = u.program || s), (h.groupOrder = o), (h.renderOrder = i.renderOrder), (h.z = l), (h.group = c)), n++, h ); } return { opaque: i, transparent: r, init: function () { (n = 0), (i.length = 0), (r.length = 0); }, push: function (t, e, n, s, o, l) { const c = a(t, e, n, s, o, l); (!0 === n.transparent ? r : i).push(c); }, unshift: function (t, e, n, s, o, l) { const c = a(t, e, n, s, o, l); (!0 === n.transparent ? r : i).unshift(c); }, finish: function () { for (let t = n, i = e.length; t < i; t++) { const n = e[t]; if (null === n.id) break; (n.id = null), (n.object = null), (n.geometry = null), (n.material = null), (n.program = null), (n.group = null); } }, sort: function (t, e) { i.length > 1 && i.sort(t || $r), r.length > 1 && r.sort(e || ts); }, }; } function ns(t) { let e = new WeakMap(); return { get: function (n, i) { let r; return ( !1 === e.has(n) ? ((r = new es(t)), e.set(n, [r])) : i >= e.get(n).length ? ((r = new es(t)), e.get(n).push(r)) : (r = e.get(n)[i]), r ); }, dispose: function () { e = new WeakMap(); }, }; } function is() { const t = {}; return { get: function (e) { if (void 0 !== t[e.id]) return t[e.id]; let n; switch (e.type) { case 'DirectionalLight': n = { direction: new Lt(), color: new tn() }; break; case 'SpotLight': n = { position: new Lt(), direction: new Lt(), color: new tn(), distance: 0, coneCos: 0, penumbraCos: 0, decay: 0, }; break; case 'PointLight': n = { position: new Lt(), color: new tn(), distance: 0, decay: 0 }; break; case 'HemisphereLight': n = { direction: new Lt(), skyColor: new tn(), groundColor: new tn(), }; break; case 'RectAreaLight': n = { color: new tn(), position: new Lt(), halfWidth: new Lt(), halfHeight: new Lt(), }; } return (t[e.id] = n), n; }, }; } let rs = 0; function ss(t, e) { return (e.castShadow ? 1 : 0) - (t.castShadow ? 1 : 0); } function as(t, e) { const n = new is(), i = (function () { const t = {}; return { get: function (e) { if (void 0 !== t[e.id]) return t[e.id]; let n; switch (e.type) { case 'DirectionalLight': case 'SpotLight': n = { shadowBias: 0, shadowNormalBias: 0, shadowRadius: 1, shadowMapSize: new vt(), }; break; case 'PointLight': n = { shadowBias: 0, shadowNormalBias: 0, shadowRadius: 1, shadowMapSize: new vt(), shadowCameraNear: 1, shadowCameraFar: 1e3, }; } return (t[e.id] = n), n; }, }; })(), r = { version: 0, hash: { directionalLength: -1, pointLength: -1, spotLength: -1, rectAreaLength: -1, hemiLength: -1, numDirectionalShadows: -1, numPointShadows: -1, numSpotShadows: -1, }, ambient: [0, 0, 0], probe: [], directional: [], directionalShadow: [], directionalShadowMap: [], directionalShadowMatrix: [], spot: [], spotShadow: [], spotShadowMap: [], spotShadowMatrix: [], rectArea: [], rectAreaLTC1: null, rectAreaLTC2: null, point: [], pointShadow: [], pointShadowMap: [], pointShadowMatrix: [], hemi: [], }; for (let t = 0; t < 9; t++) r.probe.push(new Lt()); const s = new Lt(), a = new se(), o = new se(); return { setup: function (s) { let a = 0, o = 0, l = 0; for (let t = 0; t < 9; t++) r.probe[t].set(0, 0, 0); let c = 0, h = 0, u = 0, d = 0, p = 0, m = 0, f = 0, g = 0; s.sort(ss); for (let t = 0, e = s.length; t < e; t++) { const e = s[t], v = e.color, y = e.intensity, x = e.distance, _ = e.shadow && e.shadow.map ? e.shadow.map.texture : null; if (e.isAmbientLight) (a += v.r * y), (o += v.g * y), (l += v.b * y); else if (e.isLightProbe) for (let t = 0; t < 9; t++) r.probe[t].addScaledVector(e.sh.coefficients[t], y); else if (e.isDirectionalLight) { const t = n.get(e); if ( (t.color.copy(e.color).multiplyScalar(e.intensity), e.castShadow) ) { const t = e.shadow, n = i.get(e); (n.shadowBias = t.bias), (n.shadowNormalBias = t.normalBias), (n.shadowRadius = t.radius), (n.shadowMapSize = t.mapSize), (r.directionalShadow[c] = n), (r.directionalShadowMap[c] = _), (r.directionalShadowMatrix[c] = e.shadow.matrix), m++; } (r.directional[c] = t), c++; } else if (e.isSpotLight) { const t = n.get(e); if ( (t.position.setFromMatrixPosition(e.matrixWorld), t.color.copy(v).multiplyScalar(y), (t.distance = x), (t.coneCos = Math.cos(e.angle)), (t.penumbraCos = Math.cos(e.angle * (1 - e.penumbra))), (t.decay = e.decay), e.castShadow) ) { const t = e.shadow, n = i.get(e); (n.shadowBias = t.bias), (n.shadowNormalBias = t.normalBias), (n.shadowRadius = t.radius), (n.shadowMapSize = t.mapSize), (r.spotShadow[u] = n), (r.spotShadowMap[u] = _), (r.spotShadowMatrix[u] = e.shadow.matrix), g++; } (r.spot[u] = t), u++; } else if (e.isRectAreaLight) { const t = n.get(e); t.color.copy(v).multiplyScalar(y), t.halfWidth.set(0.5 * e.width, 0, 0), t.halfHeight.set(0, 0.5 * e.height, 0), (r.rectArea[d] = t), d++; } else if (e.isPointLight) { const t = n.get(e); if ( (t.color.copy(e.color).multiplyScalar(e.intensity), (t.distance = e.distance), (t.decay = e.decay), e.castShadow) ) { const t = e.shadow, n = i.get(e); (n.shadowBias = t.bias), (n.shadowNormalBias = t.normalBias), (n.shadowRadius = t.radius), (n.shadowMapSize = t.mapSize), (n.shadowCameraNear = t.camera.near), (n.shadowCameraFar = t.camera.far), (r.pointShadow[h] = n), (r.pointShadowMap[h] = _), (r.pointShadowMatrix[h] = e.shadow.matrix), f++; } (r.point[h] = t), h++; } else if (e.isHemisphereLight) { const t = n.get(e); t.skyColor.copy(e.color).multiplyScalar(y), t.groundColor.copy(e.groundColor).multiplyScalar(y), (r.hemi[p] = t), p++; } } d > 0 && (e.isWebGL2 || !0 === t.has('OES_texture_float_linear') ? ((r.rectAreaLTC1 = ui.LTC_FLOAT_1), (r.rectAreaLTC2 = ui.LTC_FLOAT_2)) : !0 === t.has('OES_texture_half_float_linear') ? ((r.rectAreaLTC1 = ui.LTC_HALF_1), (r.rectAreaLTC2 = ui.LTC_HALF_2)) : console.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' )), (r.ambient[0] = a), (r.ambient[1] = o), (r.ambient[2] = l); const v = r.hash; (v.directionalLength === c && v.pointLength === h && v.spotLength === u && v.rectAreaLength === d && v.hemiLength === p && v.numDirectionalShadows === m && v.numPointShadows === f && v.numSpotShadows === g) || ((r.directional.length = c), (r.spot.length = u), (r.rectArea.length = d), (r.point.length = h), (r.hemi.length = p), (r.directionalShadow.length = m), (r.directionalShadowMap.length = m), (r.pointShadow.length = f), (r.pointShadowMap.length = f), (r.spotShadow.length = g), (r.spotShadowMap.length = g), (r.directionalShadowMatrix.length = m), (r.pointShadowMatrix.length = f), (r.spotShadowMatrix.length = g), (v.directionalLength = c), (v.pointLength = h), (v.spotLength = u), (v.rectAreaLength = d), (v.hemiLength = p), (v.numDirectionalShadows = m), (v.numPointShadows = f), (v.numSpotShadows = g), (r.version = rs++)); }, setupView: function (t, e) { let n = 0, i = 0, l = 0, c = 0, h = 0; const u = e.matrixWorldInverse; for (let e = 0, d = t.length; e < d; e++) { const d = t[e]; if (d.isDirectionalLight) { const t = r.directional[n]; t.direction.setFromMatrixPosition(d.matrixWorld), s.setFromMatrixPosition(d.target.matrixWorld), t.direction.sub(s), t.direction.transformDirection(u), n++; } else if (d.isSpotLight) { const t = r.spot[l]; t.position.setFromMatrixPosition(d.matrixWorld), t.position.applyMatrix4(u), t.direction.setFromMatrixPosition(d.matrixWorld), s.setFromMatrixPosition(d.target.matrixWorld), t.direction.sub(s), t.direction.transformDirection(u), l++; } else if (d.isRectAreaLight) { const t = r.rectArea[c]; t.position.setFromMatrixPosition(d.matrixWorld), t.position.applyMatrix4(u), o.identity(), a.copy(d.matrixWorld), a.premultiply(u), o.extractRotation(a), t.halfWidth.set(0.5 * d.width, 0, 0), t.halfHeight.set(0, 0.5 * d.height, 0), t.halfWidth.applyMatrix4(o), t.halfHeight.applyMatrix4(o), c++; } else if (d.isPointLight) { const t = r.point[i]; t.position.setFromMatrixPosition(d.matrixWorld), t.position.applyMatrix4(u), i++; } else if (d.isHemisphereLight) { const t = r.hemi[h]; t.direction.setFromMatrixPosition(d.matrixWorld), t.direction.transformDirection(u), t.direction.normalize(), h++; } } }, state: r, }; } function os(t, e) { const n = new as(t, e), i = [], r = []; return { init: function () { (i.length = 0), (r.length = 0); }, state: { lightsArray: i, shadowsArray: r, lights: n }, setupLights: function () { n.setup(i); }, setupLightsView: function (t) { n.setupView(i, t); }, pushLight: function (t) { i.push(t); }, pushShadow: function (t) { r.push(t); }, }; } function ls(t, e) { let n = new WeakMap(); return { get: function (i, r = 0) { let s; return ( !1 === n.has(i) ? ((s = new os(t, e)), n.set(i, [s])) : r >= n.get(i).length ? ((s = new os(t, e)), n.get(i).push(s)) : (s = n.get(i)[r]), s ); }, dispose: function () { n = new WeakMap(); }, }; } class cs extends Xe { constructor(t) { super(), (this.type = 'MeshDepthMaterial'), (this.depthPacking = 3200), (this.skinning = !1), (this.morphTargets = !1), (this.map = null), (this.alphaMap = null), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.fog = !1), this.setValues(t); } copy(t) { return ( super.copy(t), (this.depthPacking = t.depthPacking), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.map = t.map), (this.alphaMap = t.alphaMap), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), this ); } } cs.prototype.isMeshDepthMaterial = !0; class hs extends Xe { constructor(t) { super(), (this.type = 'MeshDistanceMaterial'), (this.referencePosition = new Lt()), (this.nearDistance = 1), (this.farDistance = 1e3), (this.skinning = !1), (this.morphTargets = !1), (this.map = null), (this.alphaMap = null), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.fog = !1), this.setValues(t); } copy(t) { return ( super.copy(t), this.referencePosition.copy(t.referencePosition), (this.nearDistance = t.nearDistance), (this.farDistance = t.farDistance), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.map = t.map), (this.alphaMap = t.alphaMap), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), this ); } } hs.prototype.isMeshDistanceMaterial = !0; function us(t, e, n) { let i = new ai(); const r = new vt(), s = new vt(), a = new St(), o = [], l = [], c = {}, h = n.maxTextureSize, u = { 0: 1, 1: 0, 2: 2 }, d = new Jn({ defines: { SAMPLE_RATE: 2 / 8, HALF_SAMPLE_RATE: 1 / 8 }, uniforms: { shadow_pass: { value: null }, resolution: { value: new vt() }, radius: { value: 4 }, }, vertexShader: 'void main() {\n\tgl_Position = vec4( position, 1.0 );\n}', fragmentShader: 'uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}', }), m = d.clone(); m.defines.HORIZONTAL_PASS = 1; const f = new En(); f.setAttribute( 'position', new sn(new Float32Array([-1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5]), 3) ); const v = new Wn(f, d), y = this; function x(n, i) { const r = e.update(v); (d.uniforms.shadow_pass.value = n.map.texture), (d.uniforms.resolution.value = n.mapSize), (d.uniforms.radius.value = n.radius), t.setRenderTarget(n.mapPass), t.clear(), t.renderBufferDirect(i, null, r, d, v, null), (m.uniforms.shadow_pass.value = n.mapPass.texture), (m.uniforms.resolution.value = n.mapSize), (m.uniforms.radius.value = n.radius), t.setRenderTarget(n.map), t.clear(), t.renderBufferDirect(i, null, r, m, v, null); } function _(t, e, n) { const i = (t << 0) | (e << 1) | (n << 2); let r = o[i]; return ( void 0 === r && ((r = new cs({ depthPacking: 3201, morphTargets: t, skinning: e })), (o[i] = r)), r ); } function w(t, e, n) { const i = (t << 0) | (e << 1) | (n << 2); let r = l[i]; return ( void 0 === r && ((r = new hs({ morphTargets: t, skinning: e })), (l[i] = r)), r ); } function b(e, n, i, r, s, a, o) { let l = null, h = _, d = e.customDepthMaterial; if ( (!0 === r.isPointLight && ((h = w), (d = e.customDistanceMaterial)), void 0 === d) ) { let t = !1; !0 === i.morphTargets && (t = n.morphAttributes && n.morphAttributes.position && n.morphAttributes.position.length > 0); let r = !1; !0 === e.isSkinnedMesh && (!0 === i.skinning ? (r = !0) : console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', e )); l = h(t, r, !0 === e.isInstancedMesh); } else l = d; if ( t.localClippingEnabled && !0 === i.clipShadows && 0 !== i.clippingPlanes.length ) { const t = l.uuid, e = i.uuid; let n = c[t]; void 0 === n && ((n = {}), (c[t] = n)); let r = n[e]; void 0 === r && ((r = l.clone()), (n[e] = r)), (l = r); } return ( (l.visible = i.visible), (l.wireframe = i.wireframe), (l.side = 3 === o ? null !== i.shadowSide ? i.shadowSide : i.side : null !== i.shadowSide ? i.shadowSide : u[i.side]), (l.clipShadows = i.clipShadows), (l.clippingPlanes = i.clippingPlanes), (l.clipIntersection = i.clipIntersection), (l.wireframeLinewidth = i.wireframeLinewidth), (l.linewidth = i.linewidth), !0 === r.isPointLight && !0 === l.isMeshDistanceMaterial && (l.referencePosition.setFromMatrixPosition(r.matrixWorld), (l.nearDistance = s), (l.farDistance = a)), l ); } function M(n, r, s, a, o) { if (!1 === n.visible) return; if ( n.layers.test(r.layers) && (n.isMesh || n.isLine || n.isPoints) && (n.castShadow || (n.receiveShadow && 3 === o)) && (!n.frustumCulled || i.intersectsObject(n)) ) { n.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse, n.matrixWorld); const i = e.update(n), r = n.material; if (Array.isArray(r)) { const e = i.groups; for (let l = 0, c = e.length; l < c; l++) { const c = e[l], h = r[c.materialIndex]; if (h && h.visible) { const e = b(n, i, h, a, s.near, s.far, o); t.renderBufferDirect(s, null, i, e, n, c); } } } else if (r.visible) { const e = b(n, i, r, a, s.near, s.far, o); t.renderBufferDirect(s, null, i, e, n, null); } } const l = n.children; for (let t = 0, e = l.length; t < e; t++) M(l[t], r, s, a, o); } (this.enabled = !1), (this.autoUpdate = !0), (this.needsUpdate = !1), (this.type = 1), (this.render = function (e, n, o) { if (!1 === y.enabled) return; if (!1 === y.autoUpdate && !1 === y.needsUpdate) return; if (0 === e.length) return; const l = t.getRenderTarget(), c = t.getActiveCubeFace(), u = t.getActiveMipmapLevel(), d = t.state; d.setBlending(0), d.buffers.color.setClear(1, 1, 1, 1), d.buffers.depth.setTest(!0), d.setScissorTest(!1); for (let l = 0, c = e.length; l < c; l++) { const c = e[l], u = c.shadow; if (void 0 === u) { console.warn('THREE.WebGLShadowMap:', c, 'has no shadow.'); continue; } if (!1 === u.autoUpdate && !1 === u.needsUpdate) continue; r.copy(u.mapSize); const m = u.getFrameExtents(); if ( (r.multiply(m), s.copy(u.mapSize), (r.x > h || r.y > h) && (r.x > h && ((s.x = Math.floor(h / m.x)), (r.x = s.x * m.x), (u.mapSize.x = s.x)), r.y > h && ((s.y = Math.floor(h / m.y)), (r.y = s.y * m.y), (u.mapSize.y = s.y))), null === u.map && !u.isPointLightShadow && 3 === this.type) ) { const t = { minFilter: g, magFilter: g, format: E }; (u.map = new Tt(r.x, r.y, t)), (u.map.texture.name = c.name + '.shadowMap'), (u.mapPass = new Tt(r.x, r.y, t)), u.camera.updateProjectionMatrix(); } if (null === u.map) { const t = { minFilter: p, magFilter: p, format: E }; (u.map = new Tt(r.x, r.y, t)), (u.map.texture.name = c.name + '.shadowMap'), u.camera.updateProjectionMatrix(); } t.setRenderTarget(u.map), t.clear(); const f = u.getViewportCount(); for (let t = 0; t < f; t++) { const e = u.getViewport(t); a.set(s.x * e.x, s.y * e.y, s.x * e.z, s.y * e.w), d.viewport(a), u.updateMatrices(c, t), (i = u.getFrustum()), M(n, o, u.camera, c, this.type); } u.isPointLightShadow || 3 !== this.type || x(u, o), (u.needsUpdate = !1); } (y.needsUpdate = !1), t.setRenderTarget(l, c, u); }); } function ds(t, e, i) { const r = i.isWebGL2; const s = new (function () { let e = !1; const n = new St(); let i = null; const r = new St(0, 0, 0, 0); return { setMask: function (n) { i === n || e || (t.colorMask(n, n, n, n), (i = n)); }, setLocked: function (t) { e = t; }, setClear: function (e, i, s, a, o) { !0 === o && ((e *= a), (i *= a), (s *= a)), n.set(e, i, s, a), !1 === r.equals(n) && (t.clearColor(e, i, s, a), r.copy(n)); }, reset: function () { (e = !1), (i = null), r.set(-1, 0, 0, 0); }, }; })(), a = new (function () { let e = !1, n = null, i = null, r = null; return { setTest: function (t) { t ? z(2929) : F(2929); }, setMask: function (i) { n === i || e || (t.depthMask(i), (n = i)); }, setFunc: function (e) { if (i !== e) { if (e) switch (e) { case 0: t.depthFunc(512); break; case 1: t.depthFunc(519); break; case 2: t.depthFunc(513); break; case 3: t.depthFunc(515); break; case 4: t.depthFunc(514); break; case 5: t.depthFunc(518); break; case 6: t.depthFunc(516); break; case 7: t.depthFunc(517); break; default: t.depthFunc(515); } else t.depthFunc(515); i = e; } }, setLocked: function (t) { e = t; }, setClear: function (e) { r !== e && (t.clearDepth(e), (r = e)); }, reset: function () { (e = !1), (n = null), (i = null), (r = null); }, }; })(), o = new (function () { let e = !1, n = null, i = null, r = null, s = null, a = null, o = null, l = null, c = null; return { setTest: function (t) { e || (t ? z(2960) : F(2960)); }, setMask: function (i) { n === i || e || (t.stencilMask(i), (n = i)); }, setFunc: function (e, n, a) { (i === e && r === n && s === a) || (t.stencilFunc(e, n, a), (i = e), (r = n), (s = a)); }, setOp: function (e, n, i) { (a === e && o === n && l === i) || (t.stencilOp(e, n, i), (a = e), (o = n), (l = i)); }, setLocked: function (t) { e = t; }, setClear: function (e) { c !== e && (t.clearStencil(e), (c = e)); }, reset: function () { (e = !1), (n = null), (i = null), (r = null), (s = null), (a = null), (o = null), (l = null), (c = null); }, }; })(); let l = {}, c = null, h = {}, u = null, d = !1, p = null, m = null, f = null, g = null, v = null, y = null, x = null, _ = !1, w = null, b = null, M = null, S = null, T = null; const E = t.getParameter(35661); let A = !1, L = 0; const R = t.getParameter(7938); -1 !== R.indexOf('WebGL') ? ((L = parseFloat(/^WebGL (\d)/.exec(R)[1])), (A = L >= 1)) : -1 !== R.indexOf('OpenGL ES') && ((L = parseFloat(/^OpenGL ES (\d)/.exec(R)[1])), (A = L >= 2)); let C = null, P = {}; const D = new St(0, 0, t.canvas.width, t.canvas.height), I = new St(0, 0, t.canvas.width, t.canvas.height); function N(e, n, i) { const r = new Uint8Array(4), s = t.createTexture(); t.bindTexture(e, s), t.texParameteri(e, 10241, 9728), t.texParameteri(e, 10240, 9728); for (let e = 0; e < i; e++) t.texImage2D(n + e, 0, 6408, 1, 1, 0, 6408, 5121, r); return s; } const B = {}; function z(e) { !0 !== l[e] && (t.enable(e), (l[e] = !0)); } function F(e) { !1 !== l[e] && (t.disable(e), (l[e] = !1)); } (B[3553] = N(3553, 3553, 1)), (B[34067] = N(34067, 34069, 6)), s.setClear(0, 0, 0, 1), a.setClear(1), o.setClear(0), z(2929), a.setFunc(3), U(!1), k(1), z(2884), G(0); const O = { [n]: 32774, 101: 32778, 102: 32779 }; if (r) (O[103] = 32775), (O[104] = 32776); else { const t = e.get('EXT_blend_minmax'); null !== t && ((O[103] = t.MIN_EXT), (O[104] = t.MAX_EXT)); } const H = { 200: 0, 201: 1, 202: 768, 204: 770, 210: 776, 208: 774, 206: 772, 203: 769, 205: 771, 209: 775, 207: 773, }; function G(e, i, r, s, a, o, l, c) { if (0 !== e) { if ((!1 === d && (z(3042), (d = !0)), 5 === e)) (a = a || i), (o = o || r), (l = l || s), (i === m && a === v) || (t.blendEquationSeparate(O[i], O[a]), (m = i), (v = a)), (r === f && s === g && o === y && l === x) || (t.blendFuncSeparate(H[r], H[s], H[o], H[l]), (f = r), (g = s), (y = o), (x = l)), (p = e), (_ = null); else if (e !== p || c !== _) { if ( ((m === n && v === n) || (t.blendEquation(32774), (m = n), (v = n)), c) ) switch (e) { case 1: t.blendFuncSeparate(1, 771, 1, 771); break; case 2: t.blendFunc(1, 1); break; case 3: t.blendFuncSeparate(0, 0, 769, 771); break; case 4: t.blendFuncSeparate(0, 768, 0, 770); break; default: console.error('THREE.WebGLState: Invalid blending: ', e); } else switch (e) { case 1: t.blendFuncSeparate(770, 771, 1, 771); break; case 2: t.blendFunc(770, 1); break; case 3: t.blendFunc(0, 769); break; case 4: t.blendFunc(0, 768); break; default: console.error('THREE.WebGLState: Invalid blending: ', e); } (f = null), (g = null), (y = null), (x = null), (p = e), (_ = c); } } else !0 === d && (F(3042), (d = !1)); } function U(e) { w !== e && (e ? t.frontFace(2304) : t.frontFace(2305), (w = e)); } function k(e) { 0 !== e ? (z(2884), e !== b && (1 === e ? t.cullFace(1029) : 2 === e ? t.cullFace(1028) : t.cullFace(1032))) : F(2884), (b = e); } function V(e, n, i) { e ? (z(32823), (S === n && T === i) || (t.polygonOffset(n, i), (S = n), (T = i))) : F(32823); } function W(e) { void 0 === e && (e = 33984 + E - 1), C !== e && (t.activeTexture(e), (C = e)); } return { buffers: { color: s, depth: a, stencil: o }, enable: z, disable: F, bindFramebuffer: function (e, n) { null === n && null !== c && (n = c), h[e] !== n && (t.bindFramebuffer(e, n), (h[e] = n), r && (36009 === e && (h[36160] = n), 36160 === e && (h[36009] = n))); }, bindXRFramebuffer: function (e) { e !== c && (t.bindFramebuffer(36160, e), (c = e)); }, useProgram: function (e) { return u !== e && (t.useProgram(e), (u = e), !0); }, setBlending: G, setMaterial: function (t, e) { 2 === t.side ? F(2884) : z(2884); let n = 1 === t.side; e && (n = !n), U(n), 1 === t.blending && !1 === t.transparent ? G(0) : G( t.blending, t.blendEquation, t.blendSrc, t.blendDst, t.blendEquationAlpha, t.blendSrcAlpha, t.blendDstAlpha, t.premultipliedAlpha ), a.setFunc(t.depthFunc), a.setTest(t.depthTest), a.setMask(t.depthWrite), s.setMask(t.colorWrite); const i = t.stencilWrite; o.setTest(i), i && (o.setMask(t.stencilWriteMask), o.setFunc(t.stencilFunc, t.stencilRef, t.stencilFuncMask), o.setOp(t.stencilFail, t.stencilZFail, t.stencilZPass)), V(t.polygonOffset, t.polygonOffsetFactor, t.polygonOffsetUnits), !0 === t.alphaToCoverage ? z(32926) : F(32926); }, setFlipSided: U, setCullFace: k, setLineWidth: function (e) { e !== M && (A && t.lineWidth(e), (M = e)); }, setPolygonOffset: V, setScissorTest: function (t) { t ? z(3089) : F(3089); }, activeTexture: W, bindTexture: function (e, n) { null === C && W(); let i = P[C]; void 0 === i && ((i = { type: void 0, texture: void 0 }), (P[C] = i)), (i.type === e && i.texture === n) || (t.bindTexture(e, n || B[e]), (i.type = e), (i.texture = n)); }, unbindTexture: function () { const e = P[C]; void 0 !== e && void 0 !== e.type && (t.bindTexture(e.type, null), (e.type = void 0), (e.texture = void 0)); }, compressedTexImage2D: function () { try { t.compressedTexImage2D.apply(t, arguments); } catch (t) { console.error('THREE.WebGLState:', t); } }, texImage2D: function () { try { t.texImage2D.apply(t, arguments); } catch (t) { console.error('THREE.WebGLState:', t); } }, texImage3D: function () { try { t.texImage3D.apply(t, arguments); } catch (t) { console.error('THREE.WebGLState:', t); } }, scissor: function (e) { !1 === D.equals(e) && (t.scissor(e.x, e.y, e.z, e.w), D.copy(e)); }, viewport: function (e) { !1 === I.equals(e) && (t.viewport(e.x, e.y, e.z, e.w), I.copy(e)); }, reset: function () { t.disable(3042), t.disable(2884), t.disable(2929), t.disable(32823), t.disable(3089), t.disable(2960), t.disable(32926), t.blendEquation(32774), t.blendFunc(1, 0), t.blendFuncSeparate(1, 0, 1, 0), t.colorMask(!0, !0, !0, !0), t.clearColor(0, 0, 0, 0), t.depthMask(!0), t.depthFunc(513), t.clearDepth(1), t.stencilMask(4294967295), t.stencilFunc(519, 0, 4294967295), t.stencilOp(7680, 7680, 7680), t.clearStencil(0), t.cullFace(1029), t.frontFace(2305), t.polygonOffset(0, 0), t.activeTexture(33984), t.bindFramebuffer(36160, null), !0 === r && (t.bindFramebuffer(36009, null), t.bindFramebuffer(36008, null)), t.useProgram(null), t.lineWidth(1), t.scissor(0, 0, t.canvas.width, t.canvas.height), t.viewport(0, 0, t.canvas.width, t.canvas.height), (l = {}), (C = null), (P = {}), (c = null), (h = {}), (u = null), (d = !1), (p = null), (m = null), (f = null), (g = null), (v = null), (y = null), (x = null), (_ = !1), (w = null), (b = null), (M = null), (S = null), (T = null), D.set(0, 0, t.canvas.width, t.canvas.height), I.set(0, 0, t.canvas.width, t.canvas.height), s.reset(), a.reset(), o.reset(); }, }; } function ps(t, e, n, i, r, s, a) { const o = r.isWebGL2, l = r.maxTextures, c = r.maxCubemapSize, x = r.maxTextureSize, R = r.maxSamples, C = new WeakMap(); let P, D = !1; try { D = 'undefined' != typeof OffscreenCanvas && null !== new OffscreenCanvas(1, 1).getContext('2d'); } catch (t) {} function I(t, e) { return D ? new OffscreenCanvas(t, e) : document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); } function N(t, e, n, i) { let r = 1; if ( ((t.width > i || t.height > i) && (r = i / Math.max(t.width, t.height)), r < 1 || !0 === e) ) { if ( ('undefined' != typeof HTMLImageElement && t instanceof HTMLImageElement) || ('undefined' != typeof HTMLCanvasElement && t instanceof HTMLCanvasElement) || ('undefined' != typeof ImageBitmap && t instanceof ImageBitmap) ) { const i = e ? ft : Math.floor, s = i(r * t.width), a = i(r * t.height); void 0 === P && (P = I(s, a)); const o = n ? I(s, a) : P; (o.width = s), (o.height = a); return ( o.getContext('2d').drawImage(t, 0, 0, s, a), console.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + t.width + 'x' + t.height + ') to (' + s + 'x' + a + ').' ), o ); } return ( 'data' in t && console.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + t.width + 'x' + t.height + ').' ), t ); } return t; } function B(t) { return pt(t.width) && pt(t.height); } function z(t, e) { return t.generateMipmaps && e && t.minFilter !== p && t.minFilter !== g; } function F(e, n, r, s) { t.generateMipmap(e); i.get(n).__maxMipLevel = Math.log2(Math.max(r, s)); } function O(n, i, r) { if (!1 === o) return i; if (null !== n) { if (void 0 !== t[n]) return t[n]; console.warn( "THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '" + n + "'" ); } let s = i; return ( 6403 === i && (5126 === r && (s = 33326), 5131 === r && (s = 33325), 5121 === r && (s = 33321)), 6407 === i && (5126 === r && (s = 34837), 5131 === r && (s = 34843), 5121 === r && (s = 32849)), 6408 === i && (5126 === r && (s = 34836), 5131 === r && (s = 34842), 5121 === r && (s = 32856)), (33325 !== s && 33326 !== s && 34842 !== s && 34836 !== s) || e.get('EXT_color_buffer_float'), s ); } function H(t) { return t === p || t === m || t === f ? 9728 : 9729; } function G(e) { const n = e.target; n.removeEventListener('dispose', G), (function (e) { const n = i.get(e); if (void 0 === n.__webglInit) return; t.deleteTexture(n.__webglTexture), i.remove(e); })(n), n.isVideoTexture && C.delete(n), a.memory.textures--; } function U(e) { const n = e.target; n.removeEventListener('dispose', U), (function (e) { const n = e.texture, r = i.get(e), s = i.get(n); if (!e) return; void 0 !== s.__webglTexture && t.deleteTexture(s.__webglTexture); e.depthTexture && e.depthTexture.dispose(); if (e.isWebGLCubeRenderTarget) for (let e = 0; e < 6; e++) t.deleteFramebuffer(r.__webglFramebuffer[e]), r.__webglDepthbuffer && t.deleteRenderbuffer(r.__webglDepthbuffer[e]); else t.deleteFramebuffer(r.__webglFramebuffer), r.__webglDepthbuffer && t.deleteRenderbuffer(r.__webglDepthbuffer), r.__webglMultisampledFramebuffer && t.deleteFramebuffer(r.__webglMultisampledFramebuffer), r.__webglColorRenderbuffer && t.deleteRenderbuffer(r.__webglColorRenderbuffer), r.__webglDepthRenderbuffer && t.deleteRenderbuffer(r.__webglDepthRenderbuffer); i.remove(n), i.remove(e); })(n), a.memory.textures--; } let k = 0; function V(t, e) { const r = i.get(t); if ( (t.isVideoTexture && (function (t) { const e = a.render.frame; C.get(t) !== e && (C.set(t, e), t.update()); })(t), t.version > 0 && r.__version !== t.version) ) { const n = t.image; if (void 0 === n) console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' ); else { if (!1 !== n.complete) return void Z(r, t, e); console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' ); } } n.activeTexture(33984 + e), n.bindTexture(3553, r.__webglTexture); } function W(e, r) { const a = i.get(e); e.version > 0 && a.__version !== e.version ? (function (e, i, r) { if (6 !== i.image.length) return; Y(e, i), n.activeTexture(33984 + r), n.bindTexture(34067, e.__webglTexture), t.pixelStorei(37440, i.flipY), t.pixelStorei(37441, i.premultiplyAlpha), t.pixelStorei(3317, i.unpackAlignment), t.pixelStorei(37443, 0); const a = i && (i.isCompressedTexture || i.image[0].isCompressedTexture), l = i.image[0] && i.image[0].isDataTexture, h = []; for (let t = 0; t < 6; t++) h[t] = a || l ? l ? i.image[t].image : i.image[t] : N(i.image[t], !1, !0, c); const u = h[0], d = B(u) || o, p = s.convert(i.format), m = s.convert(i.type), f = O(i.internalFormat, p, m); let g; if ((X(34067, i, d), a)) { for (let t = 0; t < 6; t++) { g = h[t].mipmaps; for (let e = 0; e < g.length; e++) { const r = g[e]; i.format !== E && i.format !== T ? null !== p ? n.compressedTexImage2D( 34069 + t, e, f, r.width, r.height, 0, r.data ) : console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' ) : n.texImage2D( 34069 + t, e, f, r.width, r.height, 0, p, m, r.data ); } } e.__maxMipLevel = g.length - 1; } else { g = i.mipmaps; for (let t = 0; t < 6; t++) if (l) { n.texImage2D( 34069 + t, 0, f, h[t].width, h[t].height, 0, p, m, h[t].data ); for (let e = 0; e < g.length; e++) { const i = g[e].image[t].image; n.texImage2D( 34069 + t, e + 1, f, i.width, i.height, 0, p, m, i.data ); } } else { n.texImage2D(34069 + t, 0, f, p, m, h[t]); for (let e = 0; e < g.length; e++) { const i = g[e]; n.texImage2D(34069 + t, e + 1, f, p, m, i.image[t]); } } e.__maxMipLevel = g.length; } z(i, d) && F(34067, i, u.width, u.height); (e.__version = i.version), i.onUpdate && i.onUpdate(i); })(a, e, r) : (n.activeTexture(33984 + r), n.bindTexture(34067, a.__webglTexture)); } const j = { [h]: 10497, [u]: 33071, [d]: 33648 }, q = { [p]: 9728, [m]: 9984, [f]: 9986, [g]: 9729, [v]: 9985, [y]: 9987 }; function X(n, s, a) { if ( (a ? (t.texParameteri(n, 10242, j[s.wrapS]), t.texParameteri(n, 10243, j[s.wrapT]), (32879 !== n && 35866 !== n) || t.texParameteri(n, 32882, j[s.wrapR]), t.texParameteri(n, 10240, q[s.magFilter]), t.texParameteri(n, 10241, q[s.minFilter])) : (t.texParameteri(n, 10242, 33071), t.texParameteri(n, 10243, 33071), (32879 !== n && 35866 !== n) || t.texParameteri(n, 32882, 33071), (s.wrapS === u && s.wrapT === u) || console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' ), t.texParameteri(n, 10240, H(s.magFilter)), t.texParameteri(n, 10241, H(s.minFilter)), s.minFilter !== p && s.minFilter !== g && console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' )), !0 === e.has('EXT_texture_filter_anisotropic')) ) { const a = e.get('EXT_texture_filter_anisotropic'); if (s.type === b && !1 === e.has('OES_texture_float_linear')) return; if ( !1 === o && s.type === M && !1 === e.has('OES_texture_half_float_linear') ) return; (s.anisotropy > 1 || i.get(s).__currentAnisotropy) && (t.texParameterf( n, a.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(s.anisotropy, r.getMaxAnisotropy()) ), (i.get(s).__currentAnisotropy = s.anisotropy)); } } function Y(e, n) { void 0 === e.__webglInit && ((e.__webglInit = !0), n.addEventListener('dispose', G), (e.__webglTexture = t.createTexture()), a.memory.textures++); } function Z(e, i, r) { let a = 3553; i.isDataTexture2DArray && (a = 35866), i.isDataTexture3D && (a = 32879), Y(e, i), n.activeTexture(33984 + r), n.bindTexture(a, e.__webglTexture), t.pixelStorei(37440, i.flipY), t.pixelStorei(37441, i.premultiplyAlpha), t.pixelStorei(3317, i.unpackAlignment), t.pixelStorei(37443, 0); const l = (function (t) { return ( !o && (t.wrapS !== u || t.wrapT !== u || (t.minFilter !== p && t.minFilter !== g)) ); })(i) && !1 === B(i.image), c = N(i.image, l, !1, x), h = B(c) || o, d = s.convert(i.format); let m, f = s.convert(i.type), v = O(i.internalFormat, d, f); X(a, i, h); const y = i.mipmaps; if (i.isDepthTexture) (v = 6402), o ? (v = i.type === b ? 36012 : i.type === w ? 33190 : i.type === S ? 35056 : 33189) : i.type === b && console.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' ), i.format === A && 6402 === v && i.type !== _ && i.type !== w && (console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ), (i.type = _), (f = s.convert(i.type))), i.format === L && 6402 === v && ((v = 34041), i.type !== S && (console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ), (i.type = S), (f = s.convert(i.type)))), n.texImage2D(3553, 0, v, c.width, c.height, 0, d, f, null); else if (i.isDataTexture) if (y.length > 0 && h) { for (let t = 0, e = y.length; t < e; t++) (m = y[t]), n.texImage2D(3553, t, v, m.width, m.height, 0, d, f, m.data); (i.generateMipmaps = !1), (e.__maxMipLevel = y.length - 1); } else n.texImage2D(3553, 0, v, c.width, c.height, 0, d, f, c.data), (e.__maxMipLevel = 0); else if (i.isCompressedTexture) { for (let t = 0, e = y.length; t < e; t++) (m = y[t]), i.format !== E && i.format !== T ? null !== d ? n.compressedTexImage2D( 3553, t, v, m.width, m.height, 0, m.data ) : console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' ) : n.texImage2D(3553, t, v, m.width, m.height, 0, d, f, m.data); e.__maxMipLevel = y.length - 1; } else if (i.isDataTexture2DArray) n.texImage3D(35866, 0, v, c.width, c.height, c.depth, 0, d, f, c.data), (e.__maxMipLevel = 0); else if (i.isDataTexture3D) n.texImage3D(32879, 0, v, c.width, c.height, c.depth, 0, d, f, c.data), (e.__maxMipLevel = 0); else if (y.length > 0 && h) { for (let t = 0, e = y.length; t < e; t++) (m = y[t]), n.texImage2D(3553, t, v, d, f, m); (i.generateMipmaps = !1), (e.__maxMipLevel = y.length - 1); } else n.texImage2D(3553, 0, v, d, f, c), (e.__maxMipLevel = 0); z(i, h) && F(a, i, c.width, c.height), (e.__version = i.version), i.onUpdate && i.onUpdate(i); } function J(e, r, a, o) { const l = r.texture, c = s.convert(l.format), h = s.convert(l.type), u = O(l.internalFormat, c, h); 32879 === o || 35866 === o ? n.texImage3D(o, 0, u, r.width, r.height, r.depth, 0, c, h, null) : n.texImage2D(o, 0, u, r.width, r.height, 0, c, h, null), n.bindFramebuffer(36160, e), t.framebufferTexture2D(36160, a, o, i.get(l).__webglTexture, 0), n.bindFramebuffer(36160, null); } function Q(e, n, i) { if ((t.bindRenderbuffer(36161, e), n.depthBuffer && !n.stencilBuffer)) { let r = 33189; if (i) { const e = n.depthTexture; e && e.isDepthTexture && (e.type === b ? (r = 36012) : e.type === w && (r = 33190)); const i = $(n); t.renderbufferStorageMultisample(36161, i, r, n.width, n.height); } else t.renderbufferStorage(36161, r, n.width, n.height); t.framebufferRenderbuffer(36160, 36096, 36161, e); } else if (n.depthBuffer && n.stencilBuffer) { if (i) { const e = $(n); t.renderbufferStorageMultisample(36161, e, 35056, n.width, n.height); } else t.renderbufferStorage(36161, 34041, n.width, n.height); t.framebufferRenderbuffer(36160, 33306, 36161, e); } else { const e = n.texture, r = s.convert(e.format), a = s.convert(e.type), o = O(e.internalFormat, r, a); if (i) { const e = $(n); t.renderbufferStorageMultisample(36161, e, o, n.width, n.height); } else t.renderbufferStorage(36161, o, n.width, n.height); } t.bindRenderbuffer(36161, null); } function K(e) { const r = i.get(e), s = !0 === e.isWebGLCubeRenderTarget; if (e.depthTexture) { if (s) throw new Error( 'target.depthTexture not supported in Cube render targets' ); !(function (e, r) { if (r && r.isWebGLCubeRenderTarget) throw new Error( 'Depth Texture with cube render targets is not supported' ); if ( (n.bindFramebuffer(36160, e), !r.depthTexture || !r.depthTexture.isDepthTexture) ) throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' ); (i.get(r.depthTexture).__webglTexture && r.depthTexture.image.width === r.width && r.depthTexture.image.height === r.height) || ((r.depthTexture.image.width = r.width), (r.depthTexture.image.height = r.height), (r.depthTexture.needsUpdate = !0)), V(r.depthTexture, 0); const s = i.get(r.depthTexture).__webglTexture; if (r.depthTexture.format === A) t.framebufferTexture2D(36160, 36096, 3553, s, 0); else { if (r.depthTexture.format !== L) throw new Error('Unknown depthTexture format'); t.framebufferTexture2D(36160, 33306, 3553, s, 0); } })(r.__webglFramebuffer, e); } else if (s) { r.__webglDepthbuffer = []; for (let i = 0; i < 6; i++) n.bindFramebuffer(36160, r.__webglFramebuffer[i]), (r.__webglDepthbuffer[i] = t.createRenderbuffer()), Q(r.__webglDepthbuffer[i], e, !1); } else n.bindFramebuffer(36160, r.__webglFramebuffer), (r.__webglDepthbuffer = t.createRenderbuffer()), Q(r.__webglDepthbuffer, e, !1); n.bindFramebuffer(36160, null); } function $(t) { return o && t.isWebGLMultisampleRenderTarget ? Math.min(R, t.samples) : 0; } let tt = !1, et = !1; (this.allocateTextureUnit = function () { const t = k; return ( t >= l && console.warn( 'THREE.WebGLTextures: Trying to use ' + t + ' texture units while this GPU supports only ' + l ), (k += 1), t ); }), (this.resetTextureUnits = function () { k = 0; }), (this.setTexture2D = V), (this.setTexture2DArray = function (t, e) { const r = i.get(t); t.version > 0 && r.__version !== t.version ? Z(r, t, e) : (n.activeTexture(33984 + e), n.bindTexture(35866, r.__webglTexture)); }), (this.setTexture3D = function (t, e) { const r = i.get(t); t.version > 0 && r.__version !== t.version ? Z(r, t, e) : (n.activeTexture(33984 + e), n.bindTexture(32879, r.__webglTexture)); }), (this.setTextureCube = W), (this.setupRenderTarget = function (e) { const r = e.texture, l = i.get(e), c = i.get(r); e.addEventListener('dispose', U), (c.__webglTexture = t.createTexture()), (c.__version = r.version), a.memory.textures++; const h = !0 === e.isWebGLCubeRenderTarget, u = !0 === e.isWebGLMultisampleRenderTarget, d = r.isDataTexture3D || r.isDataTexture2DArray, p = B(e) || o; if ( (!o || r.format !== T || (r.type !== b && r.type !== M) || ((r.format = E), console.warn( 'THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.' )), h) ) { l.__webglFramebuffer = []; for (let e = 0; e < 6; e++) l.__webglFramebuffer[e] = t.createFramebuffer(); } else if (((l.__webglFramebuffer = t.createFramebuffer()), u)) if (o) { (l.__webglMultisampledFramebuffer = t.createFramebuffer()), (l.__webglColorRenderbuffer = t.createRenderbuffer()), t.bindRenderbuffer(36161, l.__webglColorRenderbuffer); const i = s.convert(r.format), a = s.convert(r.type), o = O(r.internalFormat, i, a), c = $(e); t.renderbufferStorageMultisample(36161, c, o, e.width, e.height), n.bindFramebuffer(36160, l.__webglMultisampledFramebuffer), t.framebufferRenderbuffer( 36160, 36064, 36161, l.__webglColorRenderbuffer ), t.bindRenderbuffer(36161, null), e.depthBuffer && ((l.__webglDepthRenderbuffer = t.createRenderbuffer()), Q(l.__webglDepthRenderbuffer, e, !0)), n.bindFramebuffer(36160, null); } else console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' ); if (h) { n.bindTexture(34067, c.__webglTexture), X(34067, r, p); for (let t = 0; t < 6; t++) J(l.__webglFramebuffer[t], e, 36064, 34069 + t); z(r, p) && F(34067, r, e.width, e.height), n.bindTexture(34067, null); } else { let t = 3553; if (d) if (o) { t = r.isDataTexture3D ? 32879 : 35866; } else console.warn( 'THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.' ); n.bindTexture(t, c.__webglTexture), X(t, r, p), J(l.__webglFramebuffer, e, 36064, t), z(r, p) && F(3553, r, e.width, e.height), n.bindTexture(3553, null); } e.depthBuffer && K(e); }), (this.updateRenderTargetMipmap = function (t) { const e = t.texture; if (z(e, B(t) || o)) { const r = t.isWebGLCubeRenderTarget ? 34067 : 3553, s = i.get(e).__webglTexture; n.bindTexture(r, s), F(r, e, t.width, t.height), n.bindTexture(r, null); } }), (this.updateMultisampleRenderTarget = function (e) { if (e.isWebGLMultisampleRenderTarget) if (o) { const r = e.width, s = e.height; let a = 16384; e.depthBuffer && (a |= 256), e.stencilBuffer && (a |= 1024); const o = i.get(e); n.bindFramebuffer(36008, o.__webglMultisampledFramebuffer), n.bindFramebuffer(36009, o.__webglFramebuffer), t.blitFramebuffer(0, 0, r, s, 0, 0, r, s, a, 9728), n.bindFramebuffer(36008, null), n.bindFramebuffer(36009, o.__webglMultisampledFramebuffer); } else console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' ); }), (this.safeSetTexture2D = function (t, e) { t && t.isWebGLRenderTarget && (!1 === tt && (console.warn( "THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead." ), (tt = !0)), (t = t.texture)), V(t, e); }), (this.safeSetTextureCube = function (t, e) { t && t.isWebGLCubeRenderTarget && (!1 === et && (console.warn( "THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead." ), (et = !0)), (t = t.texture)), W(t, e); }); } function ms(t, e, n) { const i = n.isWebGL2; return { convert: function (t) { let n; if (t === x) return 5121; if (1017 === t) return 32819; if (1018 === t) return 32820; if (1019 === t) return 33635; if (1010 === t) return 5120; if (1011 === t) return 5122; if (t === _) return 5123; if (1013 === t) return 5124; if (t === w) return 5125; if (t === b) return 5126; if (t === M) return i ? 5131 : ((n = e.get('OES_texture_half_float')), null !== n ? n.HALF_FLOAT_OES : null); if (1021 === t) return 6406; if (t === T) return 6407; if (t === E) return 6408; if (1024 === t) return 6409; if (1025 === t) return 6410; if (t === A) return 6402; if (t === L) return 34041; if (1028 === t) return 6403; if (1029 === t) return 36244; if (1030 === t) return 33319; if (1031 === t) return 33320; if (1032 === t) return 36248; if (1033 === t) return 36249; if (t === R || t === C || t === P || t === D) { if (((n = e.get('WEBGL_compressed_texture_s3tc')), null === n)) return null; if (t === R) return n.COMPRESSED_RGB_S3TC_DXT1_EXT; if (t === C) return n.COMPRESSED_RGBA_S3TC_DXT1_EXT; if (t === P) return n.COMPRESSED_RGBA_S3TC_DXT3_EXT; if (t === D) return n.COMPRESSED_RGBA_S3TC_DXT5_EXT; } if (t === I || t === N || t === B || t === z) { if (((n = e.get('WEBGL_compressed_texture_pvrtc')), null === n)) return null; if (t === I) return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if (t === N) return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if (t === B) return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if (t === z) return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; } if (36196 === t) return ( (n = e.get('WEBGL_compressed_texture_etc1')), null !== n ? n.COMPRESSED_RGB_ETC1_WEBGL : null ); if ( (t === F || t === O) && ((n = e.get('WEBGL_compressed_texture_etc')), null !== n) ) { if (t === F) return n.COMPRESSED_RGB8_ETC2; if (t === O) return n.COMPRESSED_RGBA8_ETC2_EAC; } return 37808 === t || 37809 === t || 37810 === t || 37811 === t || 37812 === t || 37813 === t || 37814 === t || 37815 === t || 37816 === t || 37817 === t || 37818 === t || 37819 === t || 37820 === t || 37821 === t || 37840 === t || 37841 === t || 37842 === t || 37843 === t || 37844 === t || 37845 === t || 37846 === t || 37847 === t || 37848 === t || 37849 === t || 37850 === t || 37851 === t || 37852 === t || 37853 === t ? ((n = e.get('WEBGL_compressed_texture_astc')), null !== n ? t : null) : 36492 === t ? ((n = e.get('EXT_texture_compression_bptc')), null !== n ? t : null) : t === S ? i ? 34042 : ((n = e.get('WEBGL_depth_texture')), null !== n ? n.UNSIGNED_INT_24_8_WEBGL : null) : void 0; }, }; } class fs extends Kn { constructor(t = []) { super(), (this.cameras = t); } } fs.prototype.isArrayCamera = !0; class gs extends Ce { constructor() { super(), (this.type = 'Group'); } } gs.prototype.isGroup = !0; const vs = { type: 'move' }; class ys { constructor() { (this._targetRay = null), (this._grip = null), (this._hand = null); } getHandSpace() { return ( null === this._hand && ((this._hand = new gs()), (this._hand.matrixAutoUpdate = !1), (this._hand.visible = !1), (this._hand.joints = {}), (this._hand.inputState = { pinching: !1 })), this._hand ); } getTargetRaySpace() { return ( null === this._targetRay && ((this._targetRay = new gs()), (this._targetRay.matrixAutoUpdate = !1), (this._targetRay.visible = !1), (this._targetRay.hasLinearVelocity = !1), (this._targetRay.linearVelocity = new Lt()), (this._targetRay.hasAngularVelocity = !1), (this._targetRay.angularVelocity = new Lt())), this._targetRay ); } getGripSpace() { return ( null === this._grip && ((this._grip = new gs()), (this._grip.matrixAutoUpdate = !1), (this._grip.visible = !1), (this._grip.hasLinearVelocity = !1), (this._grip.linearVelocity = new Lt()), (this._grip.hasAngularVelocity = !1), (this._grip.angularVelocity = new Lt())), this._grip ); } dispatchEvent(t) { return ( null !== this._targetRay && this._targetRay.dispatchEvent(t), null !== this._grip && this._grip.dispatchEvent(t), null !== this._hand && this._hand.dispatchEvent(t), this ); } disconnect(t) { return ( this.dispatchEvent({ type: 'disconnected', data: t }), null !== this._targetRay && (this._targetRay.visible = !1), null !== this._grip && (this._grip.visible = !1), null !== this._hand && (this._hand.visible = !1), this ); } update(t, e, n) { let i = null, r = null, s = null; const a = this._targetRay, o = this._grip, l = this._hand; if (t && 'visible-blurred' !== e.session.visibilityState) if ( (null !== a && ((i = e.getPose(t.targetRaySpace, n)), null !== i && (a.matrix.fromArray(i.transform.matrix), a.matrix.decompose(a.position, a.rotation, a.scale), i.linearVelocity ? ((a.hasLinearVelocity = !0), a.linearVelocity.copy(i.linearVelocity)) : (a.hasLinearVelocity = !1), i.angularVelocity ? ((a.hasAngularVelocity = !0), a.angularVelocity.copy(i.angularVelocity)) : (a.hasAngularVelocity = !1), this.dispatchEvent(vs))), l && t.hand) ) { s = !0; for (const i of t.hand.values()) { const t = e.getJointPose(i, n); if (void 0 === l.joints[i.jointName]) { const t = new gs(); (t.matrixAutoUpdate = !1), (t.visible = !1), (l.joints[i.jointName] = t), l.add(t); } const r = l.joints[i.jointName]; null !== t && (r.matrix.fromArray(t.transform.matrix), r.matrix.decompose(r.position, r.rotation, r.scale), (r.jointRadius = t.radius)), (r.visible = null !== t); } const i = l.joints['index-finger-tip'], r = l.joints['thumb-tip'], a = i.position.distanceTo(r.position), o = 0.02, c = 0.005; l.inputState.pinching && a > o + c ? ((l.inputState.pinching = !1), this.dispatchEvent({ type: 'pinchend', handedness: t.handedness, target: this, })) : !l.inputState.pinching && a <= o - c && ((l.inputState.pinching = !0), this.dispatchEvent({ type: 'pinchstart', handedness: t.handedness, target: this, })); } else null !== o && t.gripSpace && ((r = e.getPose(t.gripSpace, n)), null !== r && (o.matrix.fromArray(r.transform.matrix), o.matrix.decompose(o.position, o.rotation, o.scale), r.linearVelocity ? ((o.hasLinearVelocity = !0), o.linearVelocity.copy(r.linearVelocity)) : (o.hasLinearVelocity = !1), r.angularVelocity ? ((o.hasAngularVelocity = !0), o.angularVelocity.copy(r.angularVelocity)) : (o.hasAngularVelocity = !1))); return ( null !== a && (a.visible = null !== i), null !== o && (o.visible = null !== r), null !== l && (l.visible = null !== s), this ); } } class xs extends rt { constructor(t, e) { super(); const n = this, i = t.state; let r = null, s = 1, a = null, o = 'local-floor', l = null; const c = [], h = new Map(), u = new Kn(); u.layers.enable(1), (u.viewport = new St()); const d = new Kn(); d.layers.enable(2), (d.viewport = new St()); const p = [u, d], m = new fs(); m.layers.enable(1), m.layers.enable(2); let f = null, g = null; function v(t) { const e = h.get(t.inputSource); e && e.dispatchEvent({ type: t.type, data: t.inputSource }); } function y() { h.forEach(function (t, e) { t.disconnect(e); }), h.clear(), (f = null), (g = null), i.bindXRFramebuffer(null), t.setRenderTarget(t.getRenderTarget()), S.stop(), (n.isPresenting = !1), n.dispatchEvent({ type: 'sessionend' }); } function x(t) { const e = r.inputSources; for (let t = 0; t < c.length; t++) h.set(e[t], c[t]); for (let e = 0; e < t.removed.length; e++) { const n = t.removed[e], i = h.get(n); i && (i.dispatchEvent({ type: 'disconnected', data: n }), h.delete(n)); } for (let e = 0; e < t.added.length; e++) { const n = t.added[e], i = h.get(n); i && i.dispatchEvent({ type: 'connected', data: n }); } } (this.enabled = !1), (this.isPresenting = !1), (this.getController = function (t) { let e = c[t]; return ( void 0 === e && ((e = new ys()), (c[t] = e)), e.getTargetRaySpace() ); }), (this.getControllerGrip = function (t) { let e = c[t]; return void 0 === e && ((e = new ys()), (c[t] = e)), e.getGripSpace(); }), (this.getHand = function (t) { let e = c[t]; return void 0 === e && ((e = new ys()), (c[t] = e)), e.getHandSpace(); }), (this.setFramebufferScaleFactor = function (t) { (s = t), !0 === n.isPresenting && console.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' ); }), (this.setReferenceSpaceType = function (t) { (o = t), !0 === n.isPresenting && console.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' ); }), (this.getReferenceSpace = function () { return a; }), (this.getSession = function () { return r; }), (this.setSession = async function (t) { if (((r = t), null !== r)) { r.addEventListener('select', v), r.addEventListener('selectstart', v), r.addEventListener('selectend', v), r.addEventListener('squeeze', v), r.addEventListener('squeezestart', v), r.addEventListener('squeezeend', v), r.addEventListener('end', y), r.addEventListener('inputsourceschange', x); const t = e.getContextAttributes(); !0 !== t.xrCompatible && (await e.makeXRCompatible()); const i = { antialias: t.antialias, alpha: t.alpha, depth: t.depth, stencil: t.stencil, framebufferScaleFactor: s, }, l = new XRWebGLLayer(r, e, i); r.updateRenderState({ baseLayer: l }), (a = await r.requestReferenceSpace(o)), S.setContext(r), S.start(), (n.isPresenting = !0), n.dispatchEvent({ type: 'sessionstart' }); } }); const _ = new Lt(), w = new Lt(); function b(t, e) { null === e ? t.matrixWorld.copy(t.matrix) : t.matrixWorld.multiplyMatrices(e.matrixWorld, t.matrix), t.matrixWorldInverse.copy(t.matrixWorld).invert(); } this.getCamera = function (t) { (m.near = d.near = u.near = t.near), (m.far = d.far = u.far = t.far), (f === m.near && g === m.far) || (r.updateRenderState({ depthNear: m.near, depthFar: m.far }), (f = m.near), (g = m.far)); const e = t.parent, n = m.cameras; b(m, e); for (let t = 0; t < n.length; t++) b(n[t], e); t.matrixWorld.copy(m.matrixWorld), t.matrix.copy(m.matrix), t.matrix.decompose(t.position, t.quaternion, t.scale); const i = t.children; for (let t = 0, e = i.length; t < e; t++) i[t].updateMatrixWorld(!0); return ( 2 === n.length ? (function (t, e, n) { _.setFromMatrixPosition(e.matrixWorld), w.setFromMatrixPosition(n.matrixWorld); const i = _.distanceTo(w), r = e.projectionMatrix.elements, s = n.projectionMatrix.elements, a = r[14] / (r[10] - 1), o = r[14] / (r[10] + 1), l = (r[9] + 1) / r[5], c = (r[9] - 1) / r[5], h = (r[8] - 1) / r[0], u = (s[8] + 1) / s[0], d = a * h, p = a * u, m = i / (-h + u), f = m * -h; e.matrixWorld.decompose(t.position, t.quaternion, t.scale), t.translateX(f), t.translateZ(m), t.matrixWorld.compose(t.position, t.quaternion, t.scale), t.matrixWorldInverse.copy(t.matrixWorld).invert(); const g = a + m, v = o + m, y = d - f, x = p + (i - f), b = ((l * o) / v) * g, M = ((c * o) / v) * g; t.projectionMatrix.makePerspective(y, x, b, M, g, v); })(m, u, d) : m.projectionMatrix.copy(u.projectionMatrix), m ); }; let M = null; const S = new oi(); S.setAnimationLoop(function (t, e) { if (((l = e.getViewerPose(a)), null !== l)) { const t = l.views, e = r.renderState.baseLayer; i.bindXRFramebuffer(e.framebuffer); let n = !1; t.length !== m.cameras.length && ((m.cameras.length = 0), (n = !0)); for (let i = 0; i < t.length; i++) { const r = t[i], s = e.getViewport(r), a = p[i]; a.matrix.fromArray(r.transform.matrix), a.projectionMatrix.fromArray(r.projectionMatrix), a.viewport.set(s.x, s.y, s.width, s.height), 0 === i && m.matrix.copy(a.matrix), !0 === n && m.cameras.push(a); } } const n = r.inputSources; for (let t = 0; t < c.length; t++) { const i = c[t], r = n[t]; i.update(r, e, a); } M && M(t, e); }), (this.setAnimationLoop = function (t) { M = t; }), (this.dispose = function () {}); } } function _s(t) { function e(e, n) { (e.opacity.value = n.opacity), n.color && e.diffuse.value.copy(n.color), n.emissive && e.emissive.value.copy(n.emissive).multiplyScalar(n.emissiveIntensity), n.map && (e.map.value = n.map), n.alphaMap && (e.alphaMap.value = n.alphaMap), n.specularMap && (e.specularMap.value = n.specularMap); const i = t.get(n).envMap; if (i) { (e.envMap.value = i), (e.flipEnvMap.value = i.isCubeTexture && i._needsFlipEnvMap ? -1 : 1), (e.reflectivity.value = n.reflectivity), (e.refractionRatio.value = n.refractionRatio); const r = t.get(i).__maxMipLevel; void 0 !== r && (e.maxMipLevel.value = r); } let r, s; n.lightMap && ((e.lightMap.value = n.lightMap), (e.lightMapIntensity.value = n.lightMapIntensity)), n.aoMap && ((e.aoMap.value = n.aoMap), (e.aoMapIntensity.value = n.aoMapIntensity)), n.map ? (r = n.map) : n.specularMap ? (r = n.specularMap) : n.displacementMap ? (r = n.displacementMap) : n.normalMap ? (r = n.normalMap) : n.bumpMap ? (r = n.bumpMap) : n.roughnessMap ? (r = n.roughnessMap) : n.metalnessMap ? (r = n.metalnessMap) : n.alphaMap ? (r = n.alphaMap) : n.emissiveMap ? (r = n.emissiveMap) : n.clearcoatMap ? (r = n.clearcoatMap) : n.clearcoatNormalMap ? (r = n.clearcoatNormalMap) : n.clearcoatRoughnessMap && (r = n.clearcoatRoughnessMap), void 0 !== r && (r.isWebGLRenderTarget && (r = r.texture), !0 === r.matrixAutoUpdate && r.updateMatrix(), e.uvTransform.value.copy(r.matrix)), n.aoMap ? (s = n.aoMap) : n.lightMap && (s = n.lightMap), void 0 !== s && (s.isWebGLRenderTarget && (s = s.texture), !0 === s.matrixAutoUpdate && s.updateMatrix(), e.uv2Transform.value.copy(s.matrix)); } function n(e, n) { (e.roughness.value = n.roughness), (e.metalness.value = n.metalness), n.roughnessMap && (e.roughnessMap.value = n.roughnessMap), n.metalnessMap && (e.metalnessMap.value = n.metalnessMap), n.emissiveMap && (e.emissiveMap.value = n.emissiveMap), n.bumpMap && ((e.bumpMap.value = n.bumpMap), (e.bumpScale.value = n.bumpScale), 1 === n.side && (e.bumpScale.value *= -1)), n.normalMap && ((e.normalMap.value = n.normalMap), e.normalScale.value.copy(n.normalScale), 1 === n.side && e.normalScale.value.negate()), n.displacementMap && ((e.displacementMap.value = n.displacementMap), (e.displacementScale.value = n.displacementScale), (e.displacementBias.value = n.displacementBias)); t.get(n).envMap && (e.envMapIntensity.value = n.envMapIntensity); } return { refreshFogUniforms: function (t, e) { t.fogColor.value.copy(e.color), e.isFog ? ((t.fogNear.value = e.near), (t.fogFar.value = e.far)) : e.isFogExp2 && (t.fogDensity.value = e.density); }, refreshMaterialUniforms: function (t, i, r, s) { i.isMeshBasicMaterial ? e(t, i) : i.isMeshLambertMaterial ? (e(t, i), (function (t, e) { e.emissiveMap && (t.emissiveMap.value = e.emissiveMap); })(t, i)) : i.isMeshToonMaterial ? (e(t, i), (function (t, e) { e.gradientMap && (t.gradientMap.value = e.gradientMap); e.emissiveMap && (t.emissiveMap.value = e.emissiveMap); e.bumpMap && ((t.bumpMap.value = e.bumpMap), (t.bumpScale.value = e.bumpScale), 1 === e.side && (t.bumpScale.value *= -1)); e.normalMap && ((t.normalMap.value = e.normalMap), t.normalScale.value.copy(e.normalScale), 1 === e.side && t.normalScale.value.negate()); e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias)); })(t, i)) : i.isMeshPhongMaterial ? (e(t, i), (function (t, e) { t.specular.value.copy(e.specular), (t.shininess.value = Math.max(e.shininess, 1e-4)), e.emissiveMap && (t.emissiveMap.value = e.emissiveMap); e.bumpMap && ((t.bumpMap.value = e.bumpMap), (t.bumpScale.value = e.bumpScale), 1 === e.side && (t.bumpScale.value *= -1)); e.normalMap && ((t.normalMap.value = e.normalMap), t.normalScale.value.copy(e.normalScale), 1 === e.side && t.normalScale.value.negate()); e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias)); })(t, i)) : i.isMeshStandardMaterial ? (e(t, i), i.isMeshPhysicalMaterial ? (function (t, e) { n(t, e), (t.reflectivity.value = e.reflectivity), (t.clearcoat.value = e.clearcoat), (t.clearcoatRoughness.value = e.clearcoatRoughness), e.sheen && t.sheen.value.copy(e.sheen); e.clearcoatMap && (t.clearcoatMap.value = e.clearcoatMap); e.clearcoatRoughnessMap && (t.clearcoatRoughnessMap.value = e.clearcoatRoughnessMap); e.clearcoatNormalMap && (t.clearcoatNormalScale.value.copy( e.clearcoatNormalScale ), (t.clearcoatNormalMap.value = e.clearcoatNormalMap), 1 === e.side && t.clearcoatNormalScale.value.negate()); (t.transmission.value = e.transmission), e.transmissionMap && (t.transmissionMap.value = e.transmissionMap); })(t, i) : n(t, i)) : i.isMeshMatcapMaterial ? (e(t, i), (function (t, e) { e.matcap && (t.matcap.value = e.matcap); e.bumpMap && ((t.bumpMap.value = e.bumpMap), (t.bumpScale.value = e.bumpScale), 1 === e.side && (t.bumpScale.value *= -1)); e.normalMap && ((t.normalMap.value = e.normalMap), t.normalScale.value.copy(e.normalScale), 1 === e.side && t.normalScale.value.negate()); e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias)); })(t, i)) : i.isMeshDepthMaterial ? (e(t, i), (function (t, e) { e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias)); })(t, i)) : i.isMeshDistanceMaterial ? (e(t, i), (function (t, e) { e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias)); t.referencePosition.value.copy(e.referencePosition), (t.nearDistance.value = e.nearDistance), (t.farDistance.value = e.farDistance); })(t, i)) : i.isMeshNormalMaterial ? (e(t, i), (function (t, e) { e.bumpMap && ((t.bumpMap.value = e.bumpMap), (t.bumpScale.value = e.bumpScale), 1 === e.side && (t.bumpScale.value *= -1)); e.normalMap && ((t.normalMap.value = e.normalMap), t.normalScale.value.copy(e.normalScale), 1 === e.side && t.normalScale.value.negate()); e.displacementMap && ((t.displacementMap.value = e.displacementMap), (t.displacementScale.value = e.displacementScale), (t.displacementBias.value = e.displacementBias)); })(t, i)) : i.isLineBasicMaterial ? ((function (t, e) { t.diffuse.value.copy(e.color), (t.opacity.value = e.opacity); })(t, i), i.isLineDashedMaterial && (function (t, e) { (t.dashSize.value = e.dashSize), (t.totalSize.value = e.dashSize + e.gapSize), (t.scale.value = e.scale); })(t, i)) : i.isPointsMaterial ? (function (t, e, n, i) { t.diffuse.value.copy(e.color), (t.opacity.value = e.opacity), (t.size.value = e.size * n), (t.scale.value = 0.5 * i), e.map && (t.map.value = e.map); e.alphaMap && (t.alphaMap.value = e.alphaMap); let r; e.map ? (r = e.map) : e.alphaMap && (r = e.alphaMap); void 0 !== r && (!0 === r.matrixAutoUpdate && r.updateMatrix(), t.uvTransform.value.copy(r.matrix)); })(t, i, r, s) : i.isSpriteMaterial ? (function (t, e) { t.diffuse.value.copy(e.color), (t.opacity.value = e.opacity), (t.rotation.value = e.rotation), e.map && (t.map.value = e.map); e.alphaMap && (t.alphaMap.value = e.alphaMap); let n; e.map ? (n = e.map) : e.alphaMap && (n = e.alphaMap); void 0 !== n && (!0 === n.matrixAutoUpdate && n.updateMatrix(), t.uvTransform.value.copy(n.matrix)); })(t, i) : i.isShadowMaterial ? (t.color.value.copy(i.color), (t.opacity.value = i.opacity)) : i.isShaderMaterial && (i.uniformsNeedUpdate = !1); }, }; } function ws(t) { const e = void 0 !== (t = t || {}).canvas ? t.canvas : (function () { const t = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); return (t.style.display = 'block'), t; })(), n = void 0 !== t.context ? t.context : null, i = void 0 !== t.alpha && t.alpha, r = void 0 === t.depth || t.depth, s = void 0 === t.stencil || t.stencil, a = void 0 !== t.antialias && t.antialias, o = void 0 === t.premultipliedAlpha || t.premultipliedAlpha, l = void 0 !== t.preserveDrawingBuffer && t.preserveDrawingBuffer, c = void 0 !== t.powerPreference ? t.powerPreference : 'default', h = void 0 !== t.failIfMajorPerformanceCaveat && t.failIfMajorPerformanceCaveat; let u = null, d = null; const p = [], m = []; (this.domElement = e), (this.debug = { checkShaderErrors: !0 }), (this.autoClear = !0), (this.autoClearColor = !0), (this.autoClearDepth = !0), (this.autoClearStencil = !0), (this.sortObjects = !0), (this.clippingPlanes = []), (this.localClippingEnabled = !1), (this.gammaFactor = 2), (this.outputEncoding = X), (this.physicallyCorrectLights = !1), (this.toneMapping = 0), (this.toneMappingExposure = 1); const f = this; let g = !1, v = 0, y = 0, _ = null, w = -1, S = null; const T = new St(), A = new St(); let L = null, R = e.width, C = e.height, P = 1, D = null, I = null; const N = new St(0, 0, R, C), B = new St(0, 0, R, C); let z = !1; const F = new ai(); let O = !1, H = !1; const G = new se(), U = new Lt(), k = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: !0, }; function V() { return null === _ ? P : 1; } let W, j, q, Y, Z, J, Q, K, $, tt, et, nt, it, rt, st, at, ot, lt, ct, ht, ut, dt, pt = n; function ft(t, n) { for (let i = 0; i < t.length; i++) { const r = t[i], s = e.getContext(r, n); if (null !== s) return s; } return null; } try { const t = { alpha: i, depth: r, stencil: s, antialias: a, premultipliedAlpha: o, preserveDrawingBuffer: l, powerPreference: c, failIfMajorPerformanceCaveat: h, }; if ( (e.addEventListener('webglcontextlost', xt, !1), e.addEventListener('webglcontextrestored', _t, !1), null === pt) ) { const e = ['webgl2', 'webgl', 'experimental-webgl']; if ( (!0 === f.isWebGL1Renderer && e.shift(), (pt = ft(e, t)), null === pt) ) throw ft(e) ? new Error( 'Error creating WebGL context with your selected attributes.' ) : new Error('Error creating WebGL context.'); } void 0 === pt.getShaderPrecisionFormat && (pt.getShaderPrecisionFormat = function () { return { rangeMin: 1, rangeMax: 1, precision: 1 }; }); } catch (t) { throw (console.error('THREE.WebGLRenderer: ' + t.message), t); } function gt() { (W = new xi(pt)), (j = new gi(pt, W, t)), W.init(j), (ut = new ms(pt, W, j)), (q = new ds(pt, W, j)), (Y = new bi(pt)), (Z = new Kr()), (J = new ps(pt, W, q, Z, j, ut, Y)), (Q = new yi(f)), (K = new li(pt, j)), (dt = new mi(pt, W, K, j)), ($ = new _i(pt, K, Y, dt)), (tt = new Ei(pt, $, K, Y)), (lt = new Ti(pt)), (st = new vi(Z)), (et = new Qr(f, Q, W, j, dt, st)), (nt = new _s(Z)), (it = new ns(Z)), (rt = new ls(W, j)), (ot = new pi(f, Q, q, tt, o)), (at = new us(f, tt, j)), (ct = new fi(pt, W, Y, j)), (ht = new wi(pt, W, Y, j)), (Y.programs = et.programs), (f.capabilities = j), (f.extensions = W), (f.properties = Z), (f.renderLists = it), (f.shadowMap = at), (f.state = q), (f.info = Y); } gt(); const yt = new xs(f, pt); function xt(t) { t.preventDefault(), console.log('THREE.WebGLRenderer: Context Lost.'), (g = !0); } function _t() { console.log('THREE.WebGLRenderer: Context Restored.'), (g = !1); const t = Y.autoReset, e = at.enabled, n = at.autoUpdate, i = at.needsUpdate, r = at.type; gt(), (Y.autoReset = t), (at.enabled = e), (at.autoUpdate = n), (at.needsUpdate = i), (at.type = r); } function wt(t) { const e = t.target; e.removeEventListener('dispose', wt), (function (t) { (function (t) { const e = Z.get(t).programs; void 0 !== e && e.forEach(function (t) { et.releaseProgram(t); }); })(t), Z.remove(t); })(e); } (this.xr = yt), (this.getContext = function () { return pt; }), (this.getContextAttributes = function () { return pt.getContextAttributes(); }), (this.forceContextLoss = function () { const t = W.get('WEBGL_lose_context'); t && t.loseContext(); }), (this.forceContextRestore = function () { const t = W.get('WEBGL_lose_context'); t && t.restoreContext(); }), (this.getPixelRatio = function () { return P; }), (this.setPixelRatio = function (t) { void 0 !== t && ((P = t), this.setSize(R, C, !1)); }), (this.getSize = function (t) { return ( void 0 === t && (console.warn( 'WebGLRenderer: .getsize() now requires a Vector2 as an argument' ), (t = new vt())), t.set(R, C) ); }), (this.setSize = function (t, n, i) { yt.isPresenting ? console.warn( "THREE.WebGLRenderer: Can't change size while VR device is presenting." ) : ((R = t), (C = n), (e.width = Math.floor(t * P)), (e.height = Math.floor(n * P)), !1 !== i && ((e.style.width = t + 'px'), (e.style.height = n + 'px')), this.setViewport(0, 0, t, n)); }), (this.getDrawingBufferSize = function (t) { return ( void 0 === t && (console.warn( 'WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument' ), (t = new vt())), t.set(R * P, C * P).floor() ); }), (this.setDrawingBufferSize = function (t, n, i) { (R = t), (C = n), (P = i), (e.width = Math.floor(t * i)), (e.height = Math.floor(n * i)), this.setViewport(0, 0, t, n); }), (this.getCurrentViewport = function (t) { return ( void 0 === t && (console.warn( 'WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument' ), (t = new St())), t.copy(T) ); }), (this.getViewport = function (t) { return t.copy(N); }), (this.setViewport = function (t, e, n, i) { t.isVector4 ? N.set(t.x, t.y, t.z, t.w) : N.set(t, e, n, i), q.viewport(T.copy(N).multiplyScalar(P).floor()); }), (this.getScissor = function (t) { return t.copy(B); }), (this.setScissor = function (t, e, n, i) { t.isVector4 ? B.set(t.x, t.y, t.z, t.w) : B.set(t, e, n, i), q.scissor(A.copy(B).multiplyScalar(P).floor()); }), (this.getScissorTest = function () { return z; }), (this.setScissorTest = function (t) { q.setScissorTest((z = t)); }), (this.setOpaqueSort = function (t) { D = t; }), (this.setTransparentSort = function (t) { I = t; }), (this.getClearColor = function (t) { return ( void 0 === t && (console.warn( 'WebGLRenderer: .getClearColor() now requires a Color as an argument' ), (t = new tn())), t.copy(ot.getClearColor()) ); }), (this.setClearColor = function () { ot.setClearColor.apply(ot, arguments); }), (this.getClearAlpha = function () { return ot.getClearAlpha(); }), (this.setClearAlpha = function () { ot.setClearAlpha.apply(ot, arguments); }), (this.clear = function (t, e, n) { let i = 0; (void 0 === t || t) && (i |= 16384), (void 0 === e || e) && (i |= 256), (void 0 === n || n) && (i |= 1024), pt.clear(i); }), (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.dispose = function () { e.removeEventListener('webglcontextlost', xt, !1), e.removeEventListener('webglcontextrestored', _t, !1), it.dispose(), rt.dispose(), Z.dispose(), Q.dispose(), tt.dispose(), dt.dispose(), yt.dispose(), yt.removeEventListener('sessionstart', Mt), yt.removeEventListener('sessionend', Tt), Et.stop(); }), (this.renderBufferImmediate = function (t, e) { dt.initAttributes(); const n = Z.get(t); t.hasPositions && !n.position && (n.position = pt.createBuffer()), t.hasNormals && !n.normal && (n.normal = pt.createBuffer()), t.hasUvs && !n.uv && (n.uv = pt.createBuffer()), t.hasColors && !n.color && (n.color = pt.createBuffer()); const i = e.getAttributes(); t.hasPositions && (pt.bindBuffer(34962, n.position), pt.bufferData(34962, t.positionArray, 35048), dt.enableAttribute(i.position), pt.vertexAttribPointer(i.position, 3, 5126, !1, 0, 0)), t.hasNormals && (pt.bindBuffer(34962, n.normal), pt.bufferData(34962, t.normalArray, 35048), dt.enableAttribute(i.normal), pt.vertexAttribPointer(i.normal, 3, 5126, !1, 0, 0)), t.hasUvs && (pt.bindBuffer(34962, n.uv), pt.bufferData(34962, t.uvArray, 35048), dt.enableAttribute(i.uv), pt.vertexAttribPointer(i.uv, 2, 5126, !1, 0, 0)), t.hasColors && (pt.bindBuffer(34962, n.color), pt.bufferData(34962, t.colorArray, 35048), dt.enableAttribute(i.color), pt.vertexAttribPointer(i.color, 3, 5126, !1, 0, 0)), dt.disableUnusedAttributes(), pt.drawArrays(4, 0, t.count), (t.count = 0); }), (this.renderBufferDirect = function (t, e, n, i, r, s) { null === e && (e = k); const a = r.isMesh && r.matrixWorld.determinant() < 0, o = It(t, e, i, r); q.setMaterial(i, a); let l = n.index; const c = n.attributes.position; if (null === l) { if (void 0 === c || 0 === c.count) return; } else if (0 === l.count) return; let h, u = 1; !0 === i.wireframe && ((l = $.getWireframeAttribute(n)), (u = 2)), (i.morphTargets || i.morphNormals) && lt.update(r, n, i, o), dt.setup(r, i, o, n, l); let d = ct; null !== l && ((h = K.get(l)), (d = ht), d.setIndex(h)); const p = null !== l ? l.count : c.count, m = n.drawRange.start * u, f = n.drawRange.count * u, g = null !== s ? s.start * u : 0, v = null !== s ? s.count * u : 1 / 0, y = Math.max(m, g), x = Math.min(p, m + f, g + v) - 1, _ = Math.max(0, x - y + 1); if (0 !== _) { if (r.isMesh) !0 === i.wireframe ? (q.setLineWidth(i.wireframeLinewidth * V()), d.setMode(1)) : d.setMode(4); else if (r.isLine) { let t = i.linewidth; void 0 === t && (t = 1), q.setLineWidth(t * V()), r.isLineSegments ? d.setMode(1) : r.isLineLoop ? d.setMode(2) : d.setMode(3); } else r.isPoints ? d.setMode(0) : r.isSprite && d.setMode(4); if (r.isInstancedMesh) d.renderInstances(y, _, r.count); else if (n.isInstancedBufferGeometry) { const t = Math.min(n.instanceCount, n._maxInstanceCount); d.renderInstances(y, _, t); } else d.render(y, _); } }), (this.compile = function (t, e) { (d = rt.get(t)), d.init(), t.traverseVisible(function (t) { t.isLight && t.layers.test(e.layers) && (d.pushLight(t), t.castShadow && d.pushShadow(t)); }), d.setupLights(), t.traverse(function (e) { const n = e.material; if (n) if (Array.isArray(n)) for (let i = 0; i < n.length; i++) { Pt(n[i], t, e); } else Pt(n, t, e); }); }); let bt = null; function Mt() { Et.stop(); } function Tt() { Et.start(); } const Et = new oi(); function At(t, e, n, i) { if (!1 === t.visible) return; if (t.layers.test(e.layers)) if (t.isGroup) n = t.renderOrder; else if (t.isLOD) !0 === t.autoUpdate && t.update(e); else if (t.isLight) d.pushLight(t), t.castShadow && d.pushShadow(t); else if (t.isSprite) { if (!t.frustumCulled || F.intersectsSprite(t)) { i && U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G); const e = tt.update(t), r = t.material; r.visible && u.push(t, e, r, n, U.z, null); } } else if (t.isImmediateRenderObject) i && U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G), u.push(t, null, t.material, n, U.z, null); else if ( (t.isMesh || t.isLine || t.isPoints) && (t.isSkinnedMesh && t.skeleton.frame !== Y.render.frame && (t.skeleton.update(), (t.skeleton.frame = Y.render.frame)), !t.frustumCulled || F.intersectsObject(t)) ) { i && U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G); const e = tt.update(t), r = t.material; if (Array.isArray(r)) { const i = e.groups; for (let s = 0, a = i.length; s < a; s++) { const a = i[s], o = r[a.materialIndex]; o && o.visible && u.push(t, e, o, n, U.z, a); } } else r.visible && u.push(t, e, r, n, U.z, null); } const r = t.children; for (let t = 0, s = r.length; t < s; t++) At(r[t], e, n, i); } function Rt(t, e, n) { const i = !0 === e.isScene ? e.overrideMaterial : null; for (let r = 0, s = t.length; r < s; r++) { const s = t[r], a = s.object, o = s.geometry, l = null === i ? s.material : i, c = s.group; if (n.isArrayCamera) { const t = n.cameras; for (let n = 0, i = t.length; n < i; n++) { const i = t[n]; a.layers.test(i.layers) && (q.viewport(T.copy(i.viewport)), d.setupLightsView(i), Ct(a, e, i, o, l, c)); } } else Ct(a, e, n, o, l, c); } } function Ct(t, e, n, i, r, s) { if ( (t.onBeforeRender(f, e, n, i, r, s), t.modelViewMatrix.multiplyMatrices(n.matrixWorldInverse, t.matrixWorld), t.normalMatrix.getNormalMatrix(t.modelViewMatrix), t.isImmediateRenderObject) ) { const i = It(n, e, r, t); q.setMaterial(r), dt.reset(), (function (t, e) { t.render(function (t) { f.renderBufferImmediate(t, e); }); })(t, i); } else f.renderBufferDirect(n, e, i, r, t, s); t.onAfterRender(f, e, n, i, r, s); } function Pt(t, e, n) { !0 !== e.isScene && (e = k); const i = Z.get(t), r = d.state.lights, s = d.state.shadowsArray, a = r.state.version, o = et.getParameters(t, r.state, s, e, n), l = et.getProgramCacheKey(o); let c = i.programs; (i.environment = t.isMeshStandardMaterial ? e.environment : null), (i.fog = e.fog), (i.envMap = Q.get(t.envMap || i.environment)), void 0 === c && (t.addEventListener('dispose', wt), (c = new Map()), (i.programs = c)); let h = c.get(l); if (void 0 !== h) { if (i.currentProgram === h && i.lightsStateVersion === a) return Dt(t, o), h; } else (o.uniforms = et.getUniforms(t)), t.onBuild(o, f), t.onBeforeCompile(o, f), (h = et.acquireProgram(o, l)), c.set(l, h), (i.uniforms = o.uniforms); const u = i.uniforms; ((t.isShaderMaterial || t.isRawShaderMaterial) && !0 !== t.clipping) || (u.clippingPlanes = st.uniform), Dt(t, o), (i.needsLights = (function (t) { return ( t.isMeshLambertMaterial || t.isMeshToonMaterial || t.isMeshPhongMaterial || t.isMeshStandardMaterial || t.isShadowMaterial || (t.isShaderMaterial && !0 === t.lights) ); })(t)), (i.lightsStateVersion = a), i.needsLights && ((u.ambientLightColor.value = r.state.ambient), (u.lightProbe.value = r.state.probe), (u.directionalLights.value = r.state.directional), (u.directionalLightShadows.value = r.state.directionalShadow), (u.spotLights.value = r.state.spot), (u.spotLightShadows.value = r.state.spotShadow), (u.rectAreaLights.value = r.state.rectArea), (u.ltc_1.value = r.state.rectAreaLTC1), (u.ltc_2.value = r.state.rectAreaLTC2), (u.pointLights.value = r.state.point), (u.pointLightShadows.value = r.state.pointShadow), (u.hemisphereLights.value = r.state.hemi), (u.directionalShadowMap.value = r.state.directionalShadowMap), (u.directionalShadowMatrix.value = r.state.directionalShadowMatrix), (u.spotShadowMap.value = r.state.spotShadowMap), (u.spotShadowMatrix.value = r.state.spotShadowMatrix), (u.pointShadowMap.value = r.state.pointShadowMap), (u.pointShadowMatrix.value = r.state.pointShadowMatrix)); const p = h.getUniforms(), m = Cr.seqWithValue(p.seq, u); return (i.currentProgram = h), (i.uniformsList = m), h; } function Dt(t, e) { const n = Z.get(t); (n.outputEncoding = e.outputEncoding), (n.instancing = e.instancing), (n.numClippingPlanes = e.numClippingPlanes), (n.numIntersection = e.numClipIntersection), (n.vertexAlphas = e.vertexAlphas); } function It(t, e, n, i) { !0 !== e.isScene && (e = k), J.resetTextureUnits(); const r = e.fog, s = n.isMeshStandardMaterial ? e.environment : null, a = null === _ ? f.outputEncoding : _.texture.encoding, o = Q.get(n.envMap || s), l = !0 === n.vertexColors && i.geometry && i.geometry.attributes.color && 4 === i.geometry.attributes.color.itemSize, c = Z.get(n), h = d.state.lights; if (!0 === O && (!0 === H || t !== S)) { const e = t === S && n.id === w; st.setState(n, t, e); } let u = !1; n.version === c.__version ? (c.needsLights && c.lightsStateVersion !== h.state.version) || c.outputEncoding !== a || (i.isInstancedMesh && !1 === c.instancing) ? (u = !0) : i.isInstancedMesh || !0 !== c.instancing ? c.envMap !== o || (n.fog && c.fog !== r) ? (u = !0) : void 0 === c.numClippingPlanes || (c.numClippingPlanes === st.numPlanes && c.numIntersection === st.numIntersection) ? c.vertexAlphas !== l && (u = !0) : (u = !0) : (u = !0) : ((u = !0), (c.__version = n.version)); let p = c.currentProgram; !0 === u && (p = Pt(n, e, i)); let m = !1, g = !1, v = !1; const y = p.getUniforms(), x = c.uniforms; if ( (q.useProgram(p.program) && ((m = !0), (g = !0), (v = !0)), n.id !== w && ((w = n.id), (g = !0)), m || S !== t) ) { if ( (y.setValue(pt, 'projectionMatrix', t.projectionMatrix), j.logarithmicDepthBuffer && y.setValue( pt, 'logDepthBufFC', 2 / (Math.log(t.far + 1) / Math.LN2) ), S !== t && ((S = t), (g = !0), (v = !0)), n.isShaderMaterial || n.isMeshPhongMaterial || n.isMeshToonMaterial || n.isMeshStandardMaterial || n.envMap) ) { const e = y.map.cameraPosition; void 0 !== e && e.setValue(pt, U.setFromMatrixPosition(t.matrixWorld)); } (n.isMeshPhongMaterial || n.isMeshToonMaterial || n.isMeshLambertMaterial || n.isMeshBasicMaterial || n.isMeshStandardMaterial || n.isShaderMaterial) && y.setValue(pt, 'isOrthographic', !0 === t.isOrthographicCamera), (n.isMeshPhongMaterial || n.isMeshToonMaterial || n.isMeshLambertMaterial || n.isMeshBasicMaterial || n.isMeshStandardMaterial || n.isShaderMaterial || n.isShadowMaterial || n.skinning) && y.setValue(pt, 'viewMatrix', t.matrixWorldInverse); } if (n.skinning) { y.setOptional(pt, i, 'bindMatrix'), y.setOptional(pt, i, 'bindMatrixInverse'); const t = i.skeleton; if (t) { const e = t.bones; if (j.floatVertexTextures) { if (null === t.boneTexture) { let n = Math.sqrt(4 * e.length); (n = mt(n)), (n = Math.max(n, 4)); const i = new Float32Array(n * n * 4); i.set(t.boneMatrices); const r = new ii(i, n, n, E, b); (t.boneMatrices = i), (t.boneTexture = r), (t.boneTextureSize = n); } y.setValue(pt, 'boneTexture', t.boneTexture, J), y.setValue(pt, 'boneTextureSize', t.boneTextureSize); } else y.setOptional(pt, t, 'boneMatrices'); } } var M, T; return ( (g || c.receiveShadow !== i.receiveShadow) && ((c.receiveShadow = i.receiveShadow), y.setValue(pt, 'receiveShadow', i.receiveShadow)), g && (y.setValue(pt, 'toneMappingExposure', f.toneMappingExposure), c.needsLights && ((T = v), ((M = x).ambientLightColor.needsUpdate = T), (M.lightProbe.needsUpdate = T), (M.directionalLights.needsUpdate = T), (M.directionalLightShadows.needsUpdate = T), (M.pointLights.needsUpdate = T), (M.pointLightShadows.needsUpdate = T), (M.spotLights.needsUpdate = T), (M.spotLightShadows.needsUpdate = T), (M.rectAreaLights.needsUpdate = T), (M.hemisphereLights.needsUpdate = T)), r && n.fog && nt.refreshFogUniforms(x, r), nt.refreshMaterialUniforms(x, n, P, C), Cr.upload(pt, c.uniformsList, x, J)), n.isShaderMaterial && !0 === n.uniformsNeedUpdate && (Cr.upload(pt, c.uniformsList, x, J), (n.uniformsNeedUpdate = !1)), n.isSpriteMaterial && y.setValue(pt, 'center', i.center), y.setValue(pt, 'modelViewMatrix', i.modelViewMatrix), y.setValue(pt, 'normalMatrix', i.normalMatrix), y.setValue(pt, 'modelMatrix', i.matrixWorld), p ); } Et.setAnimationLoop(function (t) { bt && bt(t); }), 'undefined' != typeof window && Et.setContext(window), (this.setAnimationLoop = function (t) { (bt = t), yt.setAnimationLoop(t), null === t ? Et.stop() : Et.start(); }), yt.addEventListener('sessionstart', Mt), yt.addEventListener('sessionend', Tt), (this.render = function (t, e) { let n, i; if ( (void 0 !== arguments[2] && (console.warn( 'THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.' ), (n = arguments[2])), void 0 !== arguments[3] && (console.warn( 'THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.' ), (i = arguments[3])), void 0 !== e && !0 !== e.isCamera) ) return void console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); if (!0 === g) return; !0 === t.autoUpdate && t.updateMatrixWorld(), null === e.parent && e.updateMatrixWorld(), !0 === yt.enabled && !0 === yt.isPresenting && (e = yt.getCamera(e)), !0 === t.isScene && t.onBeforeRender(f, t, e, n || _), (d = rt.get(t, m.length)), d.init(), m.push(d), G.multiplyMatrices(e.projectionMatrix, e.matrixWorldInverse), F.setFromProjectionMatrix(G), (H = this.localClippingEnabled), (O = st.init(this.clippingPlanes, H, e)), (u = it.get(t, p.length)), u.init(), p.push(u), At(t, e, 0, f.sortObjects), u.finish(), !0 === f.sortObjects && u.sort(D, I), !0 === O && st.beginShadows(); const r = d.state.shadowsArray; at.render(r, t, e), d.setupLights(), d.setupLightsView(e), !0 === O && st.endShadows(), !0 === this.info.autoReset && this.info.reset(), void 0 !== n && this.setRenderTarget(n), ot.render(u, t, e, i); const s = u.opaque, a = u.transparent; s.length > 0 && Rt(s, t, e), a.length > 0 && Rt(a, t, e), null !== _ && (J.updateRenderTargetMipmap(_), J.updateMultisampleRenderTarget(_)), !0 === t.isScene && t.onAfterRender(f, t, e), q.buffers.depth.setTest(!0), q.buffers.depth.setMask(!0), q.buffers.color.setMask(!0), q.setPolygonOffset(!1), dt.resetDefaultState(), (w = -1), (S = null), m.pop(), (d = m.length > 0 ? m[m.length - 1] : null), p.pop(), (u = p.length > 0 ? p[p.length - 1] : null); }), (this.getActiveCubeFace = function () { return v; }), (this.getActiveMipmapLevel = function () { return y; }), (this.getRenderTarget = function () { return _; }), (this.setRenderTarget = function (t, e = 0, n = 0) { (_ = t), (v = e), (y = n), t && void 0 === Z.get(t).__webglFramebuffer && J.setupRenderTarget(t); let i = null, r = !1, s = !1; if (t) { const n = t.texture; (n.isDataTexture3D || n.isDataTexture2DArray) && (s = !0); const a = Z.get(t).__webglFramebuffer; t.isWebGLCubeRenderTarget ? ((i = a[e]), (r = !0)) : (i = t.isWebGLMultisampleRenderTarget ? Z.get(t).__webglMultisampledFramebuffer : a), T.copy(t.viewport), A.copy(t.scissor), (L = t.scissorTest); } else T.copy(N).multiplyScalar(P).floor(), A.copy(B).multiplyScalar(P).floor(), (L = z); if ( (q.bindFramebuffer(36160, i), q.viewport(T), q.scissor(A), q.setScissorTest(L), r) ) { const i = Z.get(t.texture); pt.framebufferTexture2D(36160, 36064, 34069 + e, i.__webglTexture, n); } else if (s) { const i = Z.get(t.texture), r = e || 0; pt.framebufferTextureLayer(36160, 36064, i.__webglTexture, n || 0, r); } }), (this.readRenderTargetPixels = function (t, e, n, i, r, s, a) { if (!t || !t.isWebGLRenderTarget) return void console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); let o = Z.get(t).__webglFramebuffer; if ((t.isWebGLCubeRenderTarget && void 0 !== a && (o = o[a]), o)) { q.bindFramebuffer(36160, o); try { const a = t.texture, o = a.format, l = a.type; if (o !== E && ut.convert(o) !== pt.getParameter(35739)) return void console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); const c = l === M && (W.has('EXT_color_buffer_half_float') || (j.isWebGL2 && W.has('EXT_color_buffer_float'))); if ( !( l === x || ut.convert(l) === pt.getParameter(35738) || (l === b && (j.isWebGL2 || W.has('OES_texture_float') || W.has('WEBGL_color_buffer_float'))) || c ) ) return void console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); 36053 === pt.checkFramebufferStatus(36160) ? e >= 0 && e <= t.width - i && n >= 0 && n <= t.height - r && pt.readPixels(e, n, i, r, ut.convert(o), ut.convert(l), s) : console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); } finally { const t = null !== _ ? Z.get(_).__webglFramebuffer : null; q.bindFramebuffer(36160, t); } } }), (this.copyFramebufferToTexture = function (t, e, n = 0) { const i = Math.pow(2, -n), r = Math.floor(e.image.width * i), s = Math.floor(e.image.height * i), a = ut.convert(e.format); J.setTexture2D(e, 0), pt.copyTexImage2D(3553, n, a, t.x, t.y, r, s, 0), q.unbindTexture(); }), (this.copyTextureToTexture = function (t, e, n, i = 0) { const r = e.image.width, s = e.image.height, a = ut.convert(n.format), o = ut.convert(n.type); J.setTexture2D(n, 0), pt.pixelStorei(37440, n.flipY), pt.pixelStorei(37441, n.premultiplyAlpha), pt.pixelStorei(3317, n.unpackAlignment), e.isDataTexture ? pt.texSubImage2D(3553, i, t.x, t.y, r, s, a, o, e.image.data) : e.isCompressedTexture ? pt.compressedTexSubImage2D( 3553, i, t.x, t.y, e.mipmaps[0].width, e.mipmaps[0].height, a, e.mipmaps[0].data ) : pt.texSubImage2D(3553, i, t.x, t.y, a, o, e.image), 0 === i && n.generateMipmaps && pt.generateMipmap(3553), q.unbindTexture(); }), (this.copyTextureToTexture3D = function (t, e, n, i, r = 0) { if (f.isWebGL1Renderer) return void console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' ); const { width: s, height: a, data: o } = n.image, l = ut.convert(i.format), c = ut.convert(i.type); let h; if (i.isDataTexture3D) J.setTexture3D(i, 0), (h = 32879); else { if (!i.isDataTexture2DArray) return void console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' ); J.setTexture2DArray(i, 0), (h = 35866); } pt.pixelStorei(37440, i.flipY), pt.pixelStorei(37441, i.premultiplyAlpha), pt.pixelStorei(3317, i.unpackAlignment); const u = pt.getParameter(3314), d = pt.getParameter(32878), p = pt.getParameter(3316), m = pt.getParameter(3315), g = pt.getParameter(32877); pt.pixelStorei(3314, s), pt.pixelStorei(32878, a), pt.pixelStorei(3316, t.min.x), pt.pixelStorei(3315, t.min.y), pt.pixelStorei(32877, t.min.z), pt.texSubImage3D( h, r, e.x, e.y, e.z, t.max.x - t.min.x + 1, t.max.y - t.min.y + 1, t.max.z - t.min.z + 1, l, c, o ), pt.pixelStorei(3314, u), pt.pixelStorei(32878, d), pt.pixelStorei(3316, p), pt.pixelStorei(3315, m), pt.pixelStorei(32877, g), 0 === r && i.generateMipmaps && pt.generateMipmap(h), q.unbindTexture(); }), (this.initTexture = function (t) { J.setTexture2D(t, 0), q.unbindTexture(); }), (this.resetState = function () { (v = 0), (y = 0), (_ = null), q.reset(), dt.reset(); }), 'undefined' != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent('observe', { detail: this }) ); } class bs extends ws {} bs.prototype.isWebGL1Renderer = !0; class Ms { constructor(t, e = 25e-5) { (this.name = ''), (this.color = new tn(t)), (this.density = e); } clone() { return new Ms(this.color, this.density); } toJSON() { return { type: 'FogExp2', color: this.color.getHex(), density: this.density, }; } } Ms.prototype.isFogExp2 = !0; class Ss { constructor(t, e = 1, n = 1e3) { (this.name = ''), (this.color = new tn(t)), (this.near = e), (this.far = n); } clone() { return new Ss(this.color, this.near, this.far); } toJSON() { return { type: 'Fog', color: this.color.getHex(), near: this.near, far: this.far, }; } } Ss.prototype.isFog = !0; class Ts extends Ce { constructor() { super(), (this.type = 'Scene'), (this.background = null), (this.environment = null), (this.fog = null), (this.overrideMaterial = null), (this.autoUpdate = !0), 'undefined' != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent('observe', { detail: this }) ); } copy(t, e) { return ( super.copy(t, e), null !== t.background && (this.background = t.background.clone()), null !== t.environment && (this.environment = t.environment.clone()), null !== t.fog && (this.fog = t.fog.clone()), null !== t.overrideMaterial && (this.overrideMaterial = t.overrideMaterial.clone()), (this.autoUpdate = t.autoUpdate), (this.matrixAutoUpdate = t.matrixAutoUpdate), this ); } toJSON(t) { const e = super.toJSON(t); return ( null !== this.background && (e.object.background = this.background.toJSON(t)), null !== this.environment && (e.object.environment = this.environment.toJSON(t)), null !== this.fog && (e.object.fog = this.fog.toJSON()), e ); } } Ts.prototype.isScene = !0; class Es { constructor(t, e) { (this.array = t), (this.stride = e), (this.count = void 0 !== t ? t.length / e : 0), (this.usage = et), (this.updateRange = { offset: 0, count: -1 }), (this.version = 0), (this.uuid = ct()), (this.onUploadCallback = function () {}); } set needsUpdate(t) { !0 === t && this.version++; } setUsage(t) { return (this.usage = t), this; } copy(t) { return ( (this.array = new t.array.constructor(t.array)), (this.count = t.count), (this.stride = t.stride), (this.usage = t.usage), this ); } copyAt(t, e, n) { (t *= this.stride), (n *= e.stride); for (let i = 0, r = this.stride; i < r; i++) this.array[t + i] = e.array[n + i]; return this; } set(t, e = 0) { return this.array.set(t, e), this; } clone(t) { void 0 === t.arrayBuffers && (t.arrayBuffers = {}), void 0 === this.array.buffer._uuid && (this.array.buffer._uuid = ct()), void 0 === t.arrayBuffers[this.array.buffer._uuid] && (t.arrayBuffers[this.array.buffer._uuid] = this.array.slice(0).buffer); const e = new this.array.constructor( t.arrayBuffers[this.array.buffer._uuid] ), n = new Es(e, this.stride); return n.setUsage(this.usage), n; } onUpload(t) { return (this.onUploadCallback = t), this; } toJSON(t) { return ( void 0 === t.arrayBuffers && (t.arrayBuffers = {}), void 0 === this.array.buffer._uuid && (this.array.buffer._uuid = ct()), void 0 === t.arrayBuffers[this.array.buffer._uuid] && (t.arrayBuffers[this.array.buffer._uuid] = Array.prototype.slice.call( new Uint32Array(this.array.buffer) )), { uuid: this.uuid, buffer: this.array.buffer._uuid, type: this.array.constructor.name, stride: this.stride, } ); } } Es.prototype.isInterleavedBuffer = !0; const As = new Lt(); class Ls { constructor(t, e, n, i) { (this.name = ''), (this.data = t), (this.itemSize = e), (this.offset = n), (this.normalized = !0 === i); } get count() { return this.data.count; } get array() { return this.data.array; } set needsUpdate(t) { this.data.needsUpdate = t; } applyMatrix4(t) { for (let e = 0, n = this.data.count; e < n; e++) (As.x = this.getX(e)), (As.y = this.getY(e)), (As.z = this.getZ(e)), As.applyMatrix4(t), this.setXYZ(e, As.x, As.y, As.z); return this; } applyNormalMatrix(t) { for (let e = 0, n = this.count; e < n; e++) (As.x = this.getX(e)), (As.y = this.getY(e)), (As.z = this.getZ(e)), As.applyNormalMatrix(t), this.setXYZ(e, As.x, As.y, As.z); return this; } transformDirection(t) { for (let e = 0, n = this.count; e < n; e++) (As.x = this.getX(e)), (As.y = this.getY(e)), (As.z = this.getZ(e)), As.transformDirection(t), this.setXYZ(e, As.x, As.y, As.z); return this; } setX(t, e) { return (this.data.array[t * this.data.stride + this.offset] = e), this; } setY(t, e) { return ( (this.data.array[t * this.data.stride + this.offset + 1] = e), this ); } setZ(t, e) { return ( (this.data.array[t * this.data.stride + this.offset + 2] = e), this ); } setW(t, e) { return ( (this.data.array[t * this.data.stride + this.offset + 3] = e), this ); } getX(t) { return this.data.array[t * this.data.stride + this.offset]; } getY(t) { return this.data.array[t * this.data.stride + this.offset + 1]; } getZ(t) { return this.data.array[t * this.data.stride + this.offset + 2]; } getW(t) { return this.data.array[t * this.data.stride + this.offset + 3]; } setXY(t, e, n) { return ( (t = t * this.data.stride + this.offset), (this.data.array[t + 0] = e), (this.data.array[t + 1] = n), this ); } setXYZ(t, e, n, i) { return ( (t = t * this.data.stride + this.offset), (this.data.array[t + 0] = e), (this.data.array[t + 1] = n), (this.data.array[t + 2] = i), this ); } setXYZW(t, e, n, i, r) { return ( (t = t * this.data.stride + this.offset), (this.data.array[t + 0] = e), (this.data.array[t + 1] = n), (this.data.array[t + 2] = i), (this.data.array[t + 3] = r), this ); } clone(t) { if (void 0 === t) { console.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.' ); const t = []; for (let e = 0; e < this.count; e++) { const n = e * this.data.stride + this.offset; for (let e = 0; e < this.itemSize; e++) t.push(this.data.array[n + e]); } return new sn( new this.array.constructor(t), this.itemSize, this.normalized ); } return ( void 0 === t.interleavedBuffers && (t.interleavedBuffers = {}), void 0 === t.interleavedBuffers[this.data.uuid] && (t.interleavedBuffers[this.data.uuid] = this.data.clone(t)), new Ls( t.interleavedBuffers[this.data.uuid], this.itemSize, this.offset, this.normalized ) ); } toJSON(t) { if (void 0 === t) { console.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.' ); const t = []; for (let e = 0; e < this.count; e++) { const n = e * this.data.stride + this.offset; for (let e = 0; e < this.itemSize; e++) t.push(this.data.array[n + e]); } return { itemSize: this.itemSize, type: this.array.constructor.name, array: t, normalized: this.normalized, }; } return ( void 0 === t.interleavedBuffers && (t.interleavedBuffers = {}), void 0 === t.interleavedBuffers[this.data.uuid] && (t.interleavedBuffers[this.data.uuid] = this.data.toJSON(t)), { isInterleavedBufferAttribute: !0, itemSize: this.itemSize, data: this.data.uuid, offset: this.offset, normalized: this.normalized, } ); } } Ls.prototype.isInterleavedBufferAttribute = !0; class Rs extends Xe { constructor(t) { super(), (this.type = 'SpriteMaterial'), (this.color = new tn(16777215)), (this.map = null), (this.alphaMap = null), (this.rotation = 0), (this.sizeAttenuation = !0), (this.transparent = !0), this.setValues(t); } copy(t) { return ( super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.alphaMap = t.alphaMap), (this.rotation = t.rotation), (this.sizeAttenuation = t.sizeAttenuation), this ); } } let Cs; Rs.prototype.isSpriteMaterial = !0; const Ps = new Lt(), Ds = new Lt(), Is = new Lt(), Ns = new vt(), Bs = new vt(), zs = new se(), Fs = new Lt(), Os = new Lt(), Hs = new Lt(), Gs = new vt(), Us = new vt(), ks = new vt(); class Vs extends Ce { constructor(t) { if ((super(), (this.type = 'Sprite'), void 0 === Cs)) { Cs = new En(); const t = new Float32Array([ -0.5, -0.5, 0, 0, 0, 0.5, -0.5, 0, 1, 0, 0.5, 0.5, 0, 1, 1, -0.5, 0.5, 0, 0, 1, ]), e = new Es(t, 5); Cs.setIndex([0, 1, 2, 0, 2, 3]), Cs.setAttribute('position', new Ls(e, 3, 0, !1)), Cs.setAttribute('uv', new Ls(e, 2, 3, !1)); } (this.geometry = Cs), (this.material = void 0 !== t ? t : new Rs()), (this.center = new vt(0.5, 0.5)); } raycast(t, e) { null === t.camera && console.error( 'THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.' ), Ds.setFromMatrixScale(this.matrixWorld), zs.copy(t.camera.matrixWorld), this.modelViewMatrix.multiplyMatrices( t.camera.matrixWorldInverse, this.matrixWorld ), Is.setFromMatrixPosition(this.modelViewMatrix), t.camera.isPerspectiveCamera && !1 === this.material.sizeAttenuation && Ds.multiplyScalar(-Is.z); const n = this.material.rotation; let i, r; 0 !== n && ((r = Math.cos(n)), (i = Math.sin(n))); const s = this.center; Ws(Fs.set(-0.5, -0.5, 0), Is, s, Ds, i, r), Ws(Os.set(0.5, -0.5, 0), Is, s, Ds, i, r), Ws(Hs.set(0.5, 0.5, 0), Is, s, Ds, i, r), Gs.set(0, 0), Us.set(1, 0), ks.set(1, 1); let a = t.ray.intersectTriangle(Fs, Os, Hs, !1, Ps); if ( null === a && (Ws(Os.set(-0.5, 0.5, 0), Is, s, Ds, i, r), Us.set(0, 1), (a = t.ray.intersectTriangle(Fs, Hs, Os, !1, Ps)), null === a) ) return; const o = t.ray.origin.distanceTo(Ps); o < t.near || o > t.far || e.push({ distance: o, point: Ps.clone(), uv: je.getUV(Ps, Fs, Os, Hs, Gs, Us, ks, new vt()), face: null, object: this, }); } copy(t) { return ( super.copy(t), void 0 !== t.center && this.center.copy(t.center), (this.material = t.material), this ); } } function Ws(t, e, n, i, r, s) { Ns.subVectors(t, n).addScalar(0.5).multiply(i), void 0 !== r ? ((Bs.x = s * Ns.x - r * Ns.y), (Bs.y = r * Ns.x + s * Ns.y)) : Bs.copy(Ns), t.copy(e), (t.x += Bs.x), (t.y += Bs.y), t.applyMatrix4(zs); } Vs.prototype.isSprite = !0; const js = new Lt(), qs = new Lt(); class Xs extends Ce { constructor() { super(), (this._currentLevel = 0), (this.type = 'LOD'), Object.defineProperties(this, { levels: { enumerable: !0, value: [] }, isLOD: { value: !0 }, }), (this.autoUpdate = !0); } copy(t) { super.copy(t, !1); const e = t.levels; for (let t = 0, n = e.length; t < n; t++) { const n = e[t]; this.addLevel(n.object.clone(), n.distance); } return (this.autoUpdate = t.autoUpdate), this; } addLevel(t, e = 0) { e = Math.abs(e); const n = this.levels; let i; for (i = 0; i < n.length && !(e < n[i].distance); i++); return n.splice(i, 0, { distance: e, object: t }), this.add(t), this; } getCurrentLevel() { return this._currentLevel; } getObjectForDistance(t) { const e = this.levels; if (e.length > 0) { let n, i; for (n = 1, i = e.length; n < i && !(t < e[n].distance); n++); return e[n - 1].object; } return null; } raycast(t, e) { if (this.levels.length > 0) { js.setFromMatrixPosition(this.matrixWorld); const n = t.ray.origin.distanceTo(js); this.getObjectForDistance(n).raycast(t, e); } } update(t) { const e = this.levels; if (e.length > 1) { js.setFromMatrixPosition(t.matrixWorld), qs.setFromMatrixPosition(this.matrixWorld); const n = js.distanceTo(qs) / t.zoom; let i, r; for ( e[0].object.visible = !0, i = 1, r = e.length; i < r && n >= e[i].distance; i++ ) (e[i - 1].object.visible = !1), (e[i].object.visible = !0); for (this._currentLevel = i - 1; i < r; i++) e[i].object.visible = !1; } } toJSON(t) { const e = super.toJSON(t); !1 === this.autoUpdate && (e.object.autoUpdate = !1), (e.object.levels = []); const n = this.levels; for (let t = 0, i = n.length; t < i; t++) { const i = n[t]; e.object.levels.push({ object: i.object.uuid, distance: i.distance }); } return e; } } const Ys = new Lt(), Zs = new St(), Js = new St(), Qs = new Lt(), Ks = new se(); class $s extends Wn { constructor(t, e) { super(t, e), (this.type = 'SkinnedMesh'), (this.bindMode = 'attached'), (this.bindMatrix = new se()), (this.bindMatrixInverse = new se()); } copy(t) { return ( super.copy(t), (this.bindMode = t.bindMode), this.bindMatrix.copy(t.bindMatrix), this.bindMatrixInverse.copy(t.bindMatrixInverse), (this.skeleton = t.skeleton), this ); } bind(t, e) { (this.skeleton = t), void 0 === e && (this.updateMatrixWorld(!0), this.skeleton.calculateInverses(), (e = this.matrixWorld)), this.bindMatrix.copy(e), this.bindMatrixInverse.copy(e).invert(); } pose() { this.skeleton.pose(); } normalizeSkinWeights() { const t = new St(), e = this.geometry.attributes.skinWeight; for (let n = 0, i = e.count; n < i; n++) { (t.x = e.getX(n)), (t.y = e.getY(n)), (t.z = e.getZ(n)), (t.w = e.getW(n)); const i = 1 / t.manhattanLength(); i !== 1 / 0 ? t.multiplyScalar(i) : t.set(1, 0, 0, 0), e.setXYZW(n, t.x, t.y, t.z, t.w); } } updateMatrixWorld(t) { super.updateMatrixWorld(t), 'attached' === this.bindMode ? this.bindMatrixInverse.copy(this.matrixWorld).invert() : 'detached' === this.bindMode ? this.bindMatrixInverse.copy(this.bindMatrix).invert() : console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); } boneTransform(t, e) { const n = this.skeleton, i = this.geometry; Zs.fromBufferAttribute(i.attributes.skinIndex, t), Js.fromBufferAttribute(i.attributes.skinWeight, t), Ys.fromBufferAttribute(i.attributes.position, t).applyMatrix4( this.bindMatrix ), e.set(0, 0, 0); for (let t = 0; t < 4; t++) { const i = Js.getComponent(t); if (0 !== i) { const r = Zs.getComponent(t); Ks.multiplyMatrices(n.bones[r].matrixWorld, n.boneInverses[r]), e.addScaledVector(Qs.copy(Ys).applyMatrix4(Ks), i); } } return e.applyMatrix4(this.bindMatrixInverse); } } $s.prototype.isSkinnedMesh = !0; class ta extends Ce { constructor() { super(), (this.type = 'Bone'); } } ta.prototype.isBone = !0; const ea = new se(), na = new se(); class ia { constructor(t = [], e = []) { (this.uuid = ct()), (this.bones = t.slice(0)), (this.boneInverses = e), (this.boneMatrices = null), (this.boneTexture = null), (this.boneTextureSize = 0), (this.frame = -1), this.init(); } init() { const t = this.bones, e = this.boneInverses; if ( ((this.boneMatrices = new Float32Array(16 * t.length)), 0 === e.length) ) this.calculateInverses(); else if (t.length !== e.length) { console.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' ), (this.boneInverses = []); for (let t = 0, e = this.bones.length; t < e; t++) this.boneInverses.push(new se()); } } calculateInverses() { this.boneInverses.length = 0; for (let t = 0, e = this.bones.length; t < e; t++) { const e = new se(); this.bones[t] && e.copy(this.bones[t].matrixWorld).invert(), this.boneInverses.push(e); } } pose() { for (let t = 0, e = this.bones.length; t < e; t++) { const e = this.bones[t]; e && e.matrixWorld.copy(this.boneInverses[t]).invert(); } for (let t = 0, e = this.bones.length; t < e; t++) { const e = this.bones[t]; e && (e.parent && e.parent.isBone ? (e.matrix.copy(e.parent.matrixWorld).invert(), e.matrix.multiply(e.matrixWorld)) : e.matrix.copy(e.matrixWorld), e.matrix.decompose(e.position, e.quaternion, e.scale)); } } update() { const t = this.bones, e = this.boneInverses, n = this.boneMatrices, i = this.boneTexture; for (let i = 0, r = t.length; i < r; i++) { const r = t[i] ? t[i].matrixWorld : na; ea.multiplyMatrices(r, e[i]), ea.toArray(n, 16 * i); } null !== i && (i.needsUpdate = !0); } clone() { return new ia(this.bones, this.boneInverses); } getBoneByName(t) { for (let e = 0, n = this.bones.length; e < n; e++) { const n = this.bones[e]; if (n.name === t) return n; } } dispose() { null !== this.boneTexture && (this.boneTexture.dispose(), (this.boneTexture = null)); } fromJSON(t, e) { this.uuid = t.uuid; for (let n = 0, i = t.bones.length; n < i; n++) { const i = t.bones[n]; let r = e[i]; void 0 === r && (console.warn('THREE.Skeleton: No bone found with UUID:', i), (r = new ta())), this.bones.push(r), this.boneInverses.push(new se().fromArray(t.boneInverses[n])); } return this.init(), this; } toJSON() { const t = { metadata: { version: 4.5, type: 'Skeleton', generator: 'Skeleton.toJSON', }, bones: [], boneInverses: [], }; t.uuid = this.uuid; const e = this.bones, n = this.boneInverses; for (let i = 0, r = e.length; i < r; i++) { const r = e[i]; t.bones.push(r.uuid); const s = n[i]; t.boneInverses.push(s.toArray()); } return t; } } const ra = new se(), sa = new se(), aa = [], oa = new Wn(); class la extends Wn { constructor(t, e, n) { super(t, e), (this.instanceMatrix = new sn(new Float32Array(16 * n), 16)), (this.instanceColor = null), (this.count = n), (this.frustumCulled = !1); } copy(t) { return ( super.copy(t), this.instanceMatrix.copy(t.instanceMatrix), null !== t.instanceColor && (this.instanceColor = t.instanceColor.clone()), (this.count = t.count), this ); } getColorAt(t, e) { e.fromArray(this.instanceColor.array, 3 * t); } getMatrixAt(t, e) { e.fromArray(this.instanceMatrix.array, 16 * t); } raycast(t, e) { const n = this.matrixWorld, i = this.count; if ( ((oa.geometry = this.geometry), (oa.material = this.material), void 0 !== oa.material) ) for (let r = 0; r < i; r++) { this.getMatrixAt(r, ra), sa.multiplyMatrices(n, ra), (oa.matrixWorld = sa), oa.raycast(t, aa); for (let t = 0, n = aa.length; t < n; t++) { const n = aa[t]; (n.instanceId = r), (n.object = this), e.push(n); } aa.length = 0; } } setColorAt(t, e) { null === this.instanceColor && (this.instanceColor = new sn(new Float32Array(3 * this.count), 3)), e.toArray(this.instanceColor.array, 3 * t); } setMatrixAt(t, e) { e.toArray(this.instanceMatrix.array, 16 * t); } updateMorphTargets() {} dispose() { this.dispatchEvent({ type: 'dispose' }); } } la.prototype.isInstancedMesh = !0; class ca extends Xe { constructor(t) { super(), (this.type = 'LineBasicMaterial'), (this.color = new tn(16777215)), (this.linewidth = 1), (this.linecap = 'round'), (this.linejoin = 'round'), (this.morphTargets = !1), this.setValues(t); } copy(t) { return ( super.copy(t), this.color.copy(t.color), (this.linewidth = t.linewidth), (this.linecap = t.linecap), (this.linejoin = t.linejoin), (this.morphTargets = t.morphTargets), this ); } } ca.prototype.isLineBasicMaterial = !0; const ha = new Lt(), ua = new Lt(), da = new se(), pa = new re(), ma = new Jt(); class fa extends Ce { constructor(t = new En(), e = new ca()) { super(), (this.type = 'Line'), (this.geometry = t), (this.material = e), this.updateMorphTargets(); } copy(t) { return ( super.copy(t), (this.material = t.material), (this.geometry = t.geometry), this ); } computeLineDistances() { const t = this.geometry; if (t.isBufferGeometry) if (null === t.index) { const e = t.attributes.position, n = [0]; for (let t = 1, i = e.count; t < i; t++) ha.fromBufferAttribute(e, t - 1), ua.fromBufferAttribute(e, t), (n[t] = n[t - 1]), (n[t] += ha.distanceTo(ua)); t.setAttribute('lineDistance', new mn(n, 1)); } else console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); else t.isGeometry && console.error( 'THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); return this; } raycast(t, e) { const n = this.geometry, i = this.matrixWorld, r = t.params.Line.threshold, s = n.drawRange; if ( (null === n.boundingSphere && n.computeBoundingSphere(), ma.copy(n.boundingSphere), ma.applyMatrix4(i), (ma.radius += r), !1 === t.ray.intersectsSphere(ma)) ) return; da.copy(i).invert(), pa.copy(t.ray).applyMatrix4(da); const a = r / ((this.scale.x + this.scale.y + this.scale.z) / 3), o = a * a, l = new Lt(), c = new Lt(), h = new Lt(), u = new Lt(), d = this.isLineSegments ? 2 : 1; if (n.isBufferGeometry) { const i = n.index, r = n.attributes.position; if (null !== i) { for ( let n = Math.max(0, s.start), a = Math.min(i.count, s.start + s.count) - 1; n < a; n += d ) { const s = i.getX(n), a = i.getX(n + 1); l.fromBufferAttribute(r, s), c.fromBufferAttribute(r, a); if (pa.distanceSqToSegment(l, c, u, h) > o) continue; u.applyMatrix4(this.matrixWorld); const d = t.ray.origin.distanceTo(u); d < t.near || d > t.far || e.push({ distance: d, point: h.clone().applyMatrix4(this.matrixWorld), index: n, face: null, faceIndex: null, object: this, }); } } else { for ( let n = Math.max(0, s.start), i = Math.min(r.count, s.start + s.count) - 1; n < i; n += d ) { l.fromBufferAttribute(r, n), c.fromBufferAttribute(r, n + 1); if (pa.distanceSqToSegment(l, c, u, h) > o) continue; u.applyMatrix4(this.matrixWorld); const i = t.ray.origin.distanceTo(u); i < t.near || i > t.far || e.push({ distance: i, point: h.clone().applyMatrix4(this.matrixWorld), index: n, face: null, faceIndex: null, object: this, }); } } } else n.isGeometry && console.error( 'THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); } updateMorphTargets() { const t = this.geometry; if (t.isBufferGeometry) { const e = t.morphAttributes, n = Object.keys(e); if (n.length > 0) { const t = e[n[0]]; if (void 0 !== t) { (this.morphTargetInfluences = []), (this.morphTargetDictionary = {}); for (let e = 0, n = t.length; e < n; e++) { const n = t[e].name || String(e); this.morphTargetInfluences.push(0), (this.morphTargetDictionary[n] = e); } } } } else { const e = t.morphTargets; void 0 !== e && e.length > 0 && console.error( 'THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' ); } } } fa.prototype.isLine = !0; const ga = new Lt(), va = new Lt(); class ya extends fa { constructor(t, e) { super(t, e), (this.type = 'LineSegments'); } computeLineDistances() { const t = this.geometry; if (t.isBufferGeometry) if (null === t.index) { const e = t.attributes.position, n = []; for (let t = 0, i = e.count; t < i; t += 2) ga.fromBufferAttribute(e, t), va.fromBufferAttribute(e, t + 1), (n[t] = 0 === t ? 0 : n[t - 1]), (n[t + 1] = n[t] + ga.distanceTo(va)); t.setAttribute('lineDistance', new mn(n, 1)); } else console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' ); else t.isGeometry && console.error( 'THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); return this; } } ya.prototype.isLineSegments = !0; class xa extends fa { constructor(t, e) { super(t, e), (this.type = 'LineLoop'); } } xa.prototype.isLineLoop = !0; class _a extends Xe { constructor(t) { super(), (this.type = 'PointsMaterial'), (this.color = new tn(16777215)), (this.map = null), (this.alphaMap = null), (this.size = 1), (this.sizeAttenuation = !0), (this.morphTargets = !1), this.setValues(t); } copy(t) { return ( super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.alphaMap = t.alphaMap), (this.size = t.size), (this.sizeAttenuation = t.sizeAttenuation), (this.morphTargets = t.morphTargets), this ); } } _a.prototype.isPointsMaterial = !0; const wa = new se(), ba = new re(), Ma = new Jt(), Sa = new Lt(); class Ta extends Ce { constructor(t = new En(), e = new _a()) { super(), (this.type = 'Points'), (this.geometry = t), (this.material = e), this.updateMorphTargets(); } copy(t) { return ( super.copy(t), (this.material = t.material), (this.geometry = t.geometry), this ); } raycast(t, e) { const n = this.geometry, i = this.matrixWorld, r = t.params.Points.threshold, s = n.drawRange; if ( (null === n.boundingSphere && n.computeBoundingSphere(), Ma.copy(n.boundingSphere), Ma.applyMatrix4(i), (Ma.radius += r), !1 === t.ray.intersectsSphere(Ma)) ) return; wa.copy(i).invert(), ba.copy(t.ray).applyMatrix4(wa); const a = r / ((this.scale.x + this.scale.y + this.scale.z) / 3), o = a * a; if (n.isBufferGeometry) { const r = n.index, a = n.attributes.position; if (null !== r) { for ( let n = Math.max(0, s.start), l = Math.min(r.count, s.start + s.count); n < l; n++ ) { const s = r.getX(n); Sa.fromBufferAttribute(a, s), Ea(Sa, s, o, i, t, e, this); } } else { for ( let n = Math.max(0, s.start), r = Math.min(a.count, s.start + s.count); n < r; n++ ) Sa.fromBufferAttribute(a, n), Ea(Sa, n, o, i, t, e, this); } } else console.error( 'THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); } updateMorphTargets() { const t = this.geometry; if (t.isBufferGeometry) { const e = t.morphAttributes, n = Object.keys(e); if (n.length > 0) { const t = e[n[0]]; if (void 0 !== t) { (this.morphTargetInfluences = []), (this.morphTargetDictionary = {}); for (let e = 0, n = t.length; e < n; e++) { const n = t[e].name || String(e); this.morphTargetInfluences.push(0), (this.morphTargetDictionary[n] = e); } } } } else { const e = t.morphTargets; void 0 !== e && e.length > 0 && console.error( 'THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' ); } } } function Ea(t, e, n, i, r, s, a) { const o = ba.distanceSqToPoint(t); if (o < n) { const n = new Lt(); ba.closestPointToPoint(t, n), n.applyMatrix4(i); const l = r.ray.origin.distanceTo(n); if (l < r.near || l > r.far) return; s.push({ distance: l, distanceToRay: Math.sqrt(o), point: n, index: e, face: null, object: a, }); } } Ta.prototype.isPoints = !0; class Aa extends bt { constructor(t, e, n, i, r, s, a, o, l) { super(t, e, n, i, r, s, a, o, l), (this.format = void 0 !== a ? a : T), (this.minFilter = void 0 !== s ? s : g), (this.magFilter = void 0 !== r ? r : g), (this.generateMipmaps = !1); const c = this; 'requestVideoFrameCallback' in t && t.requestVideoFrameCallback(function e() { (c.needsUpdate = !0), t.requestVideoFrameCallback(e); }); } clone() { return new this.constructor(this.image).copy(this); } update() { const t = this.image; !1 === 'requestVideoFrameCallback' in t && t.readyState >= t.HAVE_CURRENT_DATA && (this.needsUpdate = !0); } } Aa.prototype.isVideoTexture = !0; class La extends bt { constructor(t, e, n, i, r, s, a, o, l, c, h, u) { super(null, s, a, o, l, c, i, r, h, u), (this.image = { width: e, height: n }), (this.mipmaps = t), (this.flipY = !1), (this.generateMipmaps = !1); } } La.prototype.isCompressedTexture = !0; class Ra extends bt { constructor(t, e, n, i, r, s, a, o, l) { super(t, e, n, i, r, s, a, o, l), (this.needsUpdate = !0); } } Ra.prototype.isCanvasTexture = !0; class Ca extends bt { constructor(t, e, n, i, r, s, a, o, l, c) { if ((c = void 0 !== c ? c : A) !== A && c !== L) throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ); void 0 === n && c === A && (n = _), void 0 === n && c === L && (n = S), super(null, i, r, s, a, o, c, n, l), (this.image = { width: t, height: e }), (this.magFilter = void 0 !== a ? a : p), (this.minFilter = void 0 !== o ? o : p), (this.flipY = !1), (this.generateMipmaps = !1); } } Ca.prototype.isDepthTexture = !0; class Pa extends En { constructor(t = 1, e = 8, n = 0, i = 2 * Math.PI) { super(), (this.type = 'CircleGeometry'), (this.parameters = { radius: t, segments: e, thetaStart: n, thetaLength: i, }), (e = Math.max(3, e)); const r = [], s = [], a = [], o = [], l = new Lt(), c = new vt(); s.push(0, 0, 0), a.push(0, 0, 1), o.push(0.5, 0.5); for (let r = 0, h = 3; r <= e; r++, h += 3) { const u = n + (r / e) * i; (l.x = t * Math.cos(u)), (l.y = t * Math.sin(u)), s.push(l.x, l.y, l.z), a.push(0, 0, 1), (c.x = (s[h] / t + 1) / 2), (c.y = (s[h + 1] / t + 1) / 2), o.push(c.x, c.y); } for (let t = 1; t <= e; t++) r.push(t, t + 1, 0); this.setIndex(r), this.setAttribute('position', new mn(s, 3)), this.setAttribute('normal', new mn(a, 3)), this.setAttribute('uv', new mn(o, 2)); } } class Da extends En { constructor( t = 1, e = 1, n = 1, i = 8, r = 1, s = !1, a = 0, o = 2 * Math.PI ) { super(), (this.type = 'CylinderGeometry'), (this.parameters = { radiusTop: t, radiusBottom: e, height: n, radialSegments: i, heightSegments: r, openEnded: s, thetaStart: a, thetaLength: o, }); const l = this; (i = Math.floor(i)), (r = Math.floor(r)); const c = [], h = [], u = [], d = []; let p = 0; const m = [], f = n / 2; let g = 0; function v(n) { const r = p, s = new vt(), m = new Lt(); let v = 0; const y = !0 === n ? t : e, x = !0 === n ? 1 : -1; for (let t = 1; t <= i; t++) h.push(0, f * x, 0), u.push(0, x, 0), d.push(0.5, 0.5), p++; const _ = p; for (let t = 0; t <= i; t++) { const e = (t / i) * o + a, n = Math.cos(e), r = Math.sin(e); (m.x = y * r), (m.y = f * x), (m.z = y * n), h.push(m.x, m.y, m.z), u.push(0, x, 0), (s.x = 0.5 * n + 0.5), (s.y = 0.5 * r * x + 0.5), d.push(s.x, s.y), p++; } for (let t = 0; t < i; t++) { const e = r + t, i = _ + t; !0 === n ? c.push(i, i + 1, e) : c.push(i + 1, i, e), (v += 3); } l.addGroup(g, v, !0 === n ? 1 : 2), (g += v); } !(function () { const s = new Lt(), v = new Lt(); let y = 0; const x = (e - t) / n; for (let l = 0; l <= r; l++) { const c = [], g = l / r, y = g * (e - t) + t; for (let t = 0; t <= i; t++) { const e = t / i, r = e * o + a, l = Math.sin(r), m = Math.cos(r); (v.x = y * l), (v.y = -g * n + f), (v.z = y * m), h.push(v.x, v.y, v.z), s.set(l, x, m).normalize(), u.push(s.x, s.y, s.z), d.push(e, 1 - g), c.push(p++); } m.push(c); } for (let t = 0; t < i; t++) for (let e = 0; e < r; e++) { const n = m[e][t], i = m[e + 1][t], r = m[e + 1][t + 1], s = m[e][t + 1]; c.push(n, i, s), c.push(i, r, s), (y += 6); } l.addGroup(g, y, 0), (g += y); })(), !1 === s && (t > 0 && v(!0), e > 0 && v(!1)), this.setIndex(c), this.setAttribute('position', new mn(h, 3)), this.setAttribute('normal', new mn(u, 3)), this.setAttribute('uv', new mn(d, 2)); } } class Ia extends Da { constructor(t = 1, e = 1, n = 8, i = 1, r = !1, s = 0, a = 2 * Math.PI) { super(0, t, e, n, i, r, s, a), (this.type = 'ConeGeometry'), (this.parameters = { radius: t, height: e, radialSegments: n, heightSegments: i, openEnded: r, thetaStart: s, thetaLength: a, }); } } class Na extends En { constructor(t, e, n = 1, i = 0) { super(), (this.type = 'PolyhedronGeometry'), (this.parameters = { vertices: t, indices: e, radius: n, detail: i }); const r = [], s = []; function a(t, e, n, i) { const r = i + 1, s = []; for (let i = 0; i <= r; i++) { s[i] = []; const a = t.clone().lerp(n, i / r), o = e.clone().lerp(n, i / r), l = r - i; for (let t = 0; t <= l; t++) s[i][t] = 0 === t && i === r ? a : a.clone().lerp(o, t / l); } for (let t = 0; t < r; t++) for (let e = 0; e < 2 * (r - t) - 1; e++) { const n = Math.floor(e / 2); e % 2 == 0 ? (o(s[t][n + 1]), o(s[t + 1][n]), o(s[t][n])) : (o(s[t][n + 1]), o(s[t + 1][n + 1]), o(s[t + 1][n])); } } function o(t) { r.push(t.x, t.y, t.z); } function l(e, n) { const i = 3 * e; (n.x = t[i + 0]), (n.y = t[i + 1]), (n.z = t[i + 2]); } function c(t, e, n, i) { i < 0 && 1 === t.x && (s[e] = t.x - 1), 0 === n.x && 0 === n.z && (s[e] = i / 2 / Math.PI + 0.5); } function h(t) { return Math.atan2(t.z, -t.x); } !(function (t) { const n = new Lt(), i = new Lt(), r = new Lt(); for (let s = 0; s < e.length; s += 3) l(e[s + 0], n), l(e[s + 1], i), l(e[s + 2], r), a(n, i, r, t); })(i), (function (t) { const e = new Lt(); for (let n = 0; n < r.length; n += 3) (e.x = r[n + 0]), (e.y = r[n + 1]), (e.z = r[n + 2]), e.normalize().multiplyScalar(t), (r[n + 0] = e.x), (r[n + 1] = e.y), (r[n + 2] = e.z); })(n), (function () { const t = new Lt(); for (let n = 0; n < r.length; n += 3) { (t.x = r[n + 0]), (t.y = r[n + 1]), (t.z = r[n + 2]); const i = h(t) / 2 / Math.PI + 0.5, a = ((e = t), Math.atan2(-e.y, Math.sqrt(e.x * e.x + e.z * e.z)) / Math.PI + 0.5); s.push(i, 1 - a); } var e; (function () { const t = new Lt(), e = new Lt(), n = new Lt(), i = new Lt(), a = new vt(), o = new vt(), l = new vt(); for (let u = 0, d = 0; u < r.length; u += 9, d += 6) { t.set(r[u + 0], r[u + 1], r[u + 2]), e.set(r[u + 3], r[u + 4], r[u + 5]), n.set(r[u + 6], r[u + 7], r[u + 8]), a.set(s[d + 0], s[d + 1]), o.set(s[d + 2], s[d + 3]), l.set(s[d + 4], s[d + 5]), i.copy(t).add(e).add(n).divideScalar(3); const p = h(i); c(a, d + 0, t, p), c(o, d + 2, e, p), c(l, d + 4, n, p); } })(), (function () { for (let t = 0; t < s.length; t += 6) { const e = s[t + 0], n = s[t + 2], i = s[t + 4], r = Math.max(e, n, i), a = Math.min(e, n, i); r > 0.9 && a < 0.1 && (e < 0.2 && (s[t + 0] += 1), n < 0.2 && (s[t + 2] += 1), i < 0.2 && (s[t + 4] += 1)); } })(); })(), this.setAttribute('position', new mn(r, 3)), this.setAttribute('normal', new mn(r.slice(), 3)), this.setAttribute('uv', new mn(s, 2)), 0 === i ? this.computeVertexNormals() : this.normalizeNormals(); } } class Ba extends Na { constructor(t = 1, e = 0) { const n = (1 + Math.sqrt(5)) / 2, i = 1 / n; super( [ -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 0, -i, -n, 0, -i, n, 0, i, -n, 0, i, n, -i, -n, 0, -i, n, 0, i, -n, 0, i, n, 0, -n, 0, -i, n, 0, -i, -n, 0, i, n, 0, i, ], [ 3, 11, 7, 3, 7, 15, 3, 15, 13, 7, 19, 17, 7, 17, 6, 7, 6, 15, 17, 4, 8, 17, 8, 10, 17, 10, 6, 8, 0, 16, 8, 16, 2, 8, 2, 10, 0, 12, 1, 0, 1, 18, 0, 18, 16, 6, 10, 2, 6, 2, 13, 6, 13, 15, 2, 16, 18, 2, 18, 3, 2, 3, 13, 18, 1, 9, 18, 9, 11, 18, 11, 3, 4, 14, 12, 4, 12, 0, 4, 0, 8, 11, 9, 5, 11, 5, 19, 11, 19, 7, 19, 5, 14, 19, 14, 4, 19, 4, 17, 1, 12, 14, 1, 14, 5, 1, 5, 9, ], t, e ), (this.type = 'DodecahedronGeometry'), (this.parameters = { radius: t, detail: e }); } } const za = new Lt(), Fa = new Lt(), Oa = new Lt(), Ha = new je(); class Ga extends En { constructor(t, e) { if ( (super(), (this.type = 'EdgesGeometry'), (this.parameters = { thresholdAngle: e }), (e = void 0 !== e ? e : 1), !0 === t.isGeometry) ) return void console.error( 'THREE.EdgesGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); const n = Math.pow(10, 4), i = Math.cos(ot * e), r = t.getIndex(), s = t.getAttribute('position'), a = r ? r.count : s.count, o = [0, 0, 0], l = ['a', 'b', 'c'], c = new Array(3), h = {}, u = []; for (let t = 0; t < a; t += 3) { r ? ((o[0] = r.getX(t)), (o[1] = r.getX(t + 1)), (o[2] = r.getX(t + 2))) : ((o[0] = t), (o[1] = t + 1), (o[2] = t + 2)); const { a: e, b: a, c: d } = Ha; if ( (e.fromBufferAttribute(s, o[0]), a.fromBufferAttribute(s, o[1]), d.fromBufferAttribute(s, o[2]), Ha.getNormal(Oa), (c[0] = `${Math.round(e.x * n)},${Math.round(e.y * n)},${Math.round(e.z * n)}`), (c[1] = `${Math.round(a.x * n)},${Math.round(a.y * n)},${Math.round(a.z * n)}`), (c[2] = `${Math.round(d.x * n)},${Math.round(d.y * n)},${Math.round(d.z * n)}`), c[0] !== c[1] && c[1] !== c[2] && c[2] !== c[0]) ) for (let t = 0; t < 3; t++) { const e = (t + 1) % 3, n = c[t], r = c[e], s = Ha[l[t]], a = Ha[l[e]], d = `${n}_${r}`, p = `${r}_${n}`; p in h && h[p] ? (Oa.dot(h[p].normal) <= i && (u.push(s.x, s.y, s.z), u.push(a.x, a.y, a.z)), (h[p] = null)) : d in h || (h[d] = { index0: o[t], index1: o[e], normal: Oa.clone() }); } } for (const t in h) if (h[t]) { const { index0: e, index1: n } = h[t]; za.fromBufferAttribute(s, e), Fa.fromBufferAttribute(s, n), u.push(za.x, za.y, za.z), u.push(Fa.x, Fa.y, Fa.z); } this.setAttribute('position', new mn(u, 3)); } } const Ua = function (t, e, n) { n = n || 2; const i = e && e.length, r = i ? e[0] * n : t.length; let s = ka(t, 0, r, n, !0); const a = []; if (!s || s.next === s.prev) return a; let o, l, c, h, u, d, p; if ( (i && (s = (function (t, e, n, i) { const r = []; let s, a, o, l, c; for (s = 0, a = e.length; s < a; s++) (o = e[s] * i), (l = s < a - 1 ? e[s + 1] * i : t.length), (c = ka(t, o, l, i, !1)), c === c.next && (c.steiner = !0), r.push($a(c)); for (r.sort(Za), s = 0; s < r.length; s++) Ja(r[s], n), (n = Va(n, n.next)); return n; })(t, e, s, n)), t.length > 80 * n) ) { (o = c = t[0]), (l = h = t[1]); for (let e = n; e < r; e += n) (u = t[e]), (d = t[e + 1]), u < o && (o = u), d < l && (l = d), u > c && (c = u), d > h && (h = d); (p = Math.max(c - o, h - l)), (p = 0 !== p ? 1 / p : 0); } return Wa(s, a, n, o, l, p), a; }; function ka(t, e, n, i, r) { let s, a; if ( r === (function (t, e, n, i) { let r = 0; for (let s = e, a = n - i; s < n; s += i) (r += (t[a] - t[s]) * (t[s + 1] + t[a + 1])), (a = s); return r; })(t, e, n, i) > 0 ) for (s = e; s < n; s += i) a = co(s, t[s], t[s + 1], a); else for (s = n - i; s >= e; s -= i) a = co(s, t[s], t[s + 1], a); return a && io(a, a.next) && (ho(a), (a = a.next)), a; } function Va(t, e) { if (!t) return t; e || (e = t); let n, i = t; do { if ( ((n = !1), i.steiner || (!io(i, i.next) && 0 !== no(i.prev, i, i.next))) ) i = i.next; else { if ((ho(i), (i = e = i.prev), i === i.next)) break; n = !0; } } while (n || i !== e); return e; } function Wa(t, e, n, i, r, s, a) { if (!t) return; !a && s && (function (t, e, n, i) { let r = t; do { null === r.z && (r.z = Ka(r.x, r.y, e, n, i)), (r.prevZ = r.prev), (r.nextZ = r.next), (r = r.next); } while (r !== t); (r.prevZ.nextZ = null), (r.prevZ = null), (function (t) { let e, n, i, r, s, a, o, l, c = 1; do { for (n = t, t = null, s = null, a = 0; n; ) { for ( a++, i = n, o = 0, e = 0; e < c && (o++, (i = i.nextZ), i); e++ ); for (l = c; o > 0 || (l > 0 && i); ) 0 !== o && (0 === l || !i || n.z <= i.z) ? ((r = n), (n = n.nextZ), o--) : ((r = i), (i = i.nextZ), l--), s ? (s.nextZ = r) : (t = r), (r.prevZ = s), (s = r); n = i; } (s.nextZ = null), (c *= 2); } while (a > 1); })(r); })(t, i, r, s); let o, l, c = t; for (; t.prev !== t.next; ) if (((o = t.prev), (l = t.next), s ? qa(t, i, r, s) : ja(t))) e.push(o.i / n), e.push(t.i / n), e.push(l.i / n), ho(t), (t = l.next), (c = l.next); else if ((t = l) === c) { a ? 1 === a ? Wa((t = Xa(Va(t), e, n)), e, n, i, r, s, 2) : 2 === a && Ya(t, e, n, i, r, s) : Wa(Va(t), e, n, i, r, s, 1); break; } } function ja(t) { const e = t.prev, n = t, i = t.next; if (no(e, n, i) >= 0) return !1; let r = t.next.next; for (; r !== t.prev; ) { if ( to(e.x, e.y, n.x, n.y, i.x, i.y, r.x, r.y) && no(r.prev, r, r.next) >= 0 ) return !1; r = r.next; } return !0; } function qa(t, e, n, i) { const r = t.prev, s = t, a = t.next; if (no(r, s, a) >= 0) return !1; const o = r.x < s.x ? (r.x < a.x ? r.x : a.x) : s.x < a.x ? s.x : a.x, l = r.y < s.y ? (r.y < a.y ? r.y : a.y) : s.y < a.y ? s.y : a.y, c = r.x > s.x ? (r.x > a.x ? r.x : a.x) : s.x > a.x ? s.x : a.x, h = r.y > s.y ? (r.y > a.y ? r.y : a.y) : s.y > a.y ? s.y : a.y, u = Ka(o, l, e, n, i), d = Ka(c, h, e, n, i); let p = t.prevZ, m = t.nextZ; for (; p && p.z >= u && m && m.z <= d; ) { if ( p !== t.prev && p !== t.next && to(r.x, r.y, s.x, s.y, a.x, a.y, p.x, p.y) && no(p.prev, p, p.next) >= 0 ) return !1; if ( ((p = p.prevZ), m !== t.prev && m !== t.next && to(r.x, r.y, s.x, s.y, a.x, a.y, m.x, m.y) && no(m.prev, m, m.next) >= 0) ) return !1; m = m.nextZ; } for (; p && p.z >= u; ) { if ( p !== t.prev && p !== t.next && to(r.x, r.y, s.x, s.y, a.x, a.y, p.x, p.y) && no(p.prev, p, p.next) >= 0 ) return !1; p = p.prevZ; } for (; m && m.z <= d; ) { if ( m !== t.prev && m !== t.next && to(r.x, r.y, s.x, s.y, a.x, a.y, m.x, m.y) && no(m.prev, m, m.next) >= 0 ) return !1; m = m.nextZ; } return !0; } function Xa(t, e, n) { let i = t; do { const r = i.prev, s = i.next.next; !io(r, s) && ro(r, i, i.next, s) && oo(r, s) && oo(s, r) && (e.push(r.i / n), e.push(i.i / n), e.push(s.i / n), ho(i), ho(i.next), (i = t = s)), (i = i.next); } while (i !== t); return Va(i); } function Ya(t, e, n, i, r, s) { let a = t; do { let t = a.next.next; for (; t !== a.prev; ) { if (a.i !== t.i && eo(a, t)) { let o = lo(a, t); return ( (a = Va(a, a.next)), (o = Va(o, o.next)), Wa(a, e, n, i, r, s), void Wa(o, e, n, i, r, s) ); } t = t.next; } a = a.next; } while (a !== t); } function Za(t, e) { return t.x - e.x; } function Ja(t, e) { if ( (e = (function (t, e) { let n = e; const i = t.x, r = t.y; let s, a = -1 / 0; do { if (r <= n.y && r >= n.next.y && n.next.y !== n.y) { const t = n.x + ((r - n.y) * (n.next.x - n.x)) / (n.next.y - n.y); if (t <= i && t > a) { if (((a = t), t === i)) { if (r === n.y) return n; if (r === n.next.y) return n.next; } s = n.x < n.next.x ? n : n.next; } } n = n.next; } while (n !== e); if (!s) return null; if (i === a) return s; const o = s, l = s.x, c = s.y; let h, u = 1 / 0; n = s; do { i >= n.x && n.x >= l && i !== n.x && to(r < c ? i : a, r, l, c, r < c ? a : i, r, n.x, n.y) && ((h = Math.abs(r - n.y) / (i - n.x)), oo(n, t) && (h < u || (h === u && (n.x > s.x || (n.x === s.x && Qa(s, n))))) && ((s = n), (u = h))), (n = n.next); } while (n !== o); return s; })(t, e)) ) { const n = lo(e, t); Va(e, e.next), Va(n, n.next); } } function Qa(t, e) { return no(t.prev, t, e.prev) < 0 && no(e.next, t, t.next) < 0; } function Ka(t, e, n, i, r) { return ( (t = 1431655765 & ((t = 858993459 & ((t = 252645135 & ((t = 16711935 & ((t = 32767 * (t - n) * r) | (t << 8))) | (t << 4))) | (t << 2))) | (t << 1))) | ((e = 1431655765 & ((e = 858993459 & ((e = 252645135 & ((e = 16711935 & ((e = 32767 * (e - i) * r) | (e << 8))) | (e << 4))) | (e << 2))) | (e << 1))) << 1) ); } function $a(t) { let e = t, n = t; do { (e.x < n.x || (e.x === n.x && e.y < n.y)) && (n = e), (e = e.next); } while (e !== t); return n; } function to(t, e, n, i, r, s, a, o) { return ( (r - a) * (e - o) - (t - a) * (s - o) >= 0 && (t - a) * (i - o) - (n - a) * (e - o) >= 0 && (n - a) * (s - o) - (r - a) * (i - o) >= 0 ); } function eo(t, e) { return ( t.next.i !== e.i && t.prev.i !== e.i && !(function (t, e) { let n = t; do { if ( n.i !== t.i && n.next.i !== t.i && n.i !== e.i && n.next.i !== e.i && ro(n, n.next, t, e) ) return !0; n = n.next; } while (n !== t); return !1; })(t, e) && ((oo(t, e) && oo(e, t) && (function (t, e) { let n = t, i = !1; const r = (t.x + e.x) / 2, s = (t.y + e.y) / 2; do { n.y > s != n.next.y > s && n.next.y !== n.y && r < ((n.next.x - n.x) * (s - n.y)) / (n.next.y - n.y) + n.x && (i = !i), (n = n.next); } while (n !== t); return i; })(t, e) && (no(t.prev, t, e.prev) || no(t, e.prev, e))) || (io(t, e) && no(t.prev, t, t.next) > 0 && no(e.prev, e, e.next) > 0)) ); } function no(t, e, n) { return (e.y - t.y) * (n.x - e.x) - (e.x - t.x) * (n.y - e.y); } function io(t, e) { return t.x === e.x && t.y === e.y; } function ro(t, e, n, i) { const r = ao(no(t, e, n)), s = ao(no(t, e, i)), a = ao(no(n, i, t)), o = ao(no(n, i, e)); return ( (r !== s && a !== o) || !(0 !== r || !so(t, n, e)) || !(0 !== s || !so(t, i, e)) || !(0 !== a || !so(n, t, i)) || !(0 !== o || !so(n, e, i)) ); } function so(t, e, n) { return ( e.x <= Math.max(t.x, n.x) && e.x >= Math.min(t.x, n.x) && e.y <= Math.max(t.y, n.y) && e.y >= Math.min(t.y, n.y) ); } function ao(t) { return t > 0 ? 1 : t < 0 ? -1 : 0; } function oo(t, e) { return no(t.prev, t, t.next) < 0 ? no(t, e, t.next) >= 0 && no(t, t.prev, e) >= 0 : no(t, e, t.prev) < 0 || no(t, t.next, e) < 0; } function lo(t, e) { const n = new uo(t.i, t.x, t.y), i = new uo(e.i, e.x, e.y), r = t.next, s = e.prev; return ( (t.next = e), (e.prev = t), (n.next = r), (r.prev = n), (i.next = n), (n.prev = i), (s.next = i), (i.prev = s), i ); } function co(t, e, n, i) { const r = new uo(t, e, n); return ( i ? ((r.next = i.next), (r.prev = i), (i.next.prev = r), (i.next = r)) : ((r.prev = r), (r.next = r)), r ); } function ho(t) { (t.next.prev = t.prev), (t.prev.next = t.next), t.prevZ && (t.prevZ.nextZ = t.nextZ), t.nextZ && (t.nextZ.prevZ = t.prevZ); } function uo(t, e, n) { (this.i = t), (this.x = e), (this.y = n), (this.prev = null), (this.next = null), (this.z = null), (this.prevZ = null), (this.nextZ = null), (this.steiner = !1); } class po { static area(t) { const e = t.length; let n = 0; for (let i = e - 1, r = 0; r < e; i = r++) n += t[i].x * t[r].y - t[r].x * t[i].y; return 0.5 * n; } static isClockWise(t) { return po.area(t) < 0; } static triangulateShape(t, e) { const n = [], i = [], r = []; mo(t), fo(n, t); let s = t.length; e.forEach(mo); for (let t = 0; t < e.length; t++) i.push(s), (s += e[t].length), fo(n, e[t]); const a = Ua(n, i); for (let t = 0; t < a.length; t += 3) r.push(a.slice(t, t + 3)); return r; } } function mo(t) { const e = t.length; e > 2 && t[e - 1].equals(t[0]) && t.pop(); } function fo(t, e) { for (let n = 0; n < e.length; n++) t.push(e[n].x), t.push(e[n].y); } class go extends En { constructor(t, e) { super(), (this.type = 'ExtrudeGeometry'), (this.parameters = { shapes: t, options: e }), (t = Array.isArray(t) ? t : [t]); const n = this, i = [], r = []; for (let e = 0, n = t.length; e < n; e++) { s(t[e]); } function s(t) { const s = [], a = void 0 !== e.curveSegments ? e.curveSegments : 12, o = void 0 !== e.steps ? e.steps : 1; let l = void 0 !== e.depth ? e.depth : 100, c = void 0 === e.bevelEnabled || e.bevelEnabled, h = void 0 !== e.bevelThickness ? e.bevelThickness : 6, u = void 0 !== e.bevelSize ? e.bevelSize : h - 2, d = void 0 !== e.bevelOffset ? e.bevelOffset : 0, p = void 0 !== e.bevelSegments ? e.bevelSegments : 3; const m = e.extrudePath, f = void 0 !== e.UVGenerator ? e.UVGenerator : vo; void 0 !== e.amount && (console.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' ), (l = e.amount)); let g, v, y, x, _, w = !1; m && ((g = m.getSpacedPoints(o)), (w = !0), (c = !1), (v = m.computeFrenetFrames(o, !1)), (y = new Lt()), (x = new Lt()), (_ = new Lt())), c || ((p = 0), (h = 0), (u = 0), (d = 0)); const b = t.extractPoints(a); let M = b.shape; const S = b.holes; if (!po.isClockWise(M)) { M = M.reverse(); for (let t = 0, e = S.length; t < e; t++) { const e = S[t]; po.isClockWise(e) && (S[t] = e.reverse()); } } const T = po.triangulateShape(M, S), E = M; for (let t = 0, e = S.length; t < e; t++) { const e = S[t]; M = M.concat(e); } function A(t, e, n) { return ( e || console.error('THREE.ExtrudeGeometry: vec does not exist'), e.clone().multiplyScalar(n).add(t) ); } const L = M.length, R = T.length; function C(t, e, n) { let i, r, s; const a = t.x - e.x, o = t.y - e.y, l = n.x - t.x, c = n.y - t.y, h = a * a + o * o, u = a * c - o * l; if (Math.abs(u) > Number.EPSILON) { const u = Math.sqrt(h), d = Math.sqrt(l * l + c * c), p = e.x - o / u, m = e.y + a / u, f = ((n.x - c / d - p) * c - (n.y + l / d - m) * l) / (a * c - o * l); (i = p + a * f - t.x), (r = m + o * f - t.y); const g = i * i + r * r; if (g <= 2) return new vt(i, r); s = Math.sqrt(g / 2); } else { let t = !1; a > Number.EPSILON ? l > Number.EPSILON && (t = !0) : a < -Number.EPSILON ? l < -Number.EPSILON && (t = !0) : Math.sign(o) === Math.sign(c) && (t = !0), t ? ((i = -o), (r = a), (s = Math.sqrt(h))) : ((i = a), (r = o), (s = Math.sqrt(h / 2))); } return new vt(i / s, r / s); } const P = []; for ( let t = 0, e = E.length, n = e - 1, i = t + 1; t < e; t++, n++, i++ ) n === e && (n = 0), i === e && (i = 0), (P[t] = C(E[t], E[n], E[i])); const D = []; let I, N = P.concat(); for (let t = 0, e = S.length; t < e; t++) { const e = S[t]; I = []; for ( let t = 0, n = e.length, i = n - 1, r = t + 1; t < n; t++, i++, r++ ) i === n && (i = 0), r === n && (r = 0), (I[t] = C(e[t], e[i], e[r])); D.push(I), (N = N.concat(I)); } for (let t = 0; t < p; t++) { const e = t / p, n = h * Math.cos((e * Math.PI) / 2), i = u * Math.sin((e * Math.PI) / 2) + d; for (let t = 0, e = E.length; t < e; t++) { const e = A(E[t], P[t], i); F(e.x, e.y, -n); } for (let t = 0, e = S.length; t < e; t++) { const e = S[t]; I = D[t]; for (let t = 0, r = e.length; t < r; t++) { const r = A(e[t], I[t], i); F(r.x, r.y, -n); } } } const B = u + d; for (let t = 0; t < L; t++) { const e = c ? A(M[t], N[t], B) : M[t]; w ? (x.copy(v.normals[0]).multiplyScalar(e.x), y.copy(v.binormals[0]).multiplyScalar(e.y), _.copy(g[0]).add(x).add(y), F(_.x, _.y, _.z)) : F(e.x, e.y, 0); } for (let t = 1; t <= o; t++) for (let e = 0; e < L; e++) { const n = c ? A(M[e], N[e], B) : M[e]; w ? (x.copy(v.normals[t]).multiplyScalar(n.x), y.copy(v.binormals[t]).multiplyScalar(n.y), _.copy(g[t]).add(x).add(y), F(_.x, _.y, _.z)) : F(n.x, n.y, (l / o) * t); } for (let t = p - 1; t >= 0; t--) { const e = t / p, n = h * Math.cos((e * Math.PI) / 2), i = u * Math.sin((e * Math.PI) / 2) + d; for (let t = 0, e = E.length; t < e; t++) { const e = A(E[t], P[t], i); F(e.x, e.y, l + n); } for (let t = 0, e = S.length; t < e; t++) { const e = S[t]; I = D[t]; for (let t = 0, r = e.length; t < r; t++) { const r = A(e[t], I[t], i); w ? F(r.x, r.y + g[o - 1].y, g[o - 1].x + n) : F(r.x, r.y, l + n); } } } function z(t, e) { let n = t.length; for (; --n >= 0; ) { const i = n; let r = n - 1; r < 0 && (r = t.length - 1); for (let t = 0, n = o + 2 * p; t < n; t++) { const n = L * t, s = L * (t + 1); H(e + i + n, e + r + n, e + r + s, e + i + s); } } } function F(t, e, n) { s.push(t), s.push(e), s.push(n); } function O(t, e, r) { G(t), G(e), G(r); const s = i.length / 3, a = f.generateTopUV(n, i, s - 3, s - 2, s - 1); U(a[0]), U(a[1]), U(a[2]); } function H(t, e, r, s) { G(t), G(e), G(s), G(e), G(r), G(s); const a = i.length / 3, o = f.generateSideWallUV(n, i, a - 6, a - 3, a - 2, a - 1); U(o[0]), U(o[1]), U(o[3]), U(o[1]), U(o[2]), U(o[3]); } function G(t) { i.push(s[3 * t + 0]), i.push(s[3 * t + 1]), i.push(s[3 * t + 2]); } function U(t) { r.push(t.x), r.push(t.y); } !(function () { const t = i.length / 3; if (c) { let t = 0, e = L * t; for (let t = 0; t < R; t++) { const n = T[t]; O(n[2] + e, n[1] + e, n[0] + e); } (t = o + 2 * p), (e = L * t); for (let t = 0; t < R; t++) { const n = T[t]; O(n[0] + e, n[1] + e, n[2] + e); } } else { for (let t = 0; t < R; t++) { const e = T[t]; O(e[2], e[1], e[0]); } for (let t = 0; t < R; t++) { const e = T[t]; O(e[0] + L * o, e[1] + L * o, e[2] + L * o); } } n.addGroup(t, i.length / 3 - t, 0); })(), (function () { const t = i.length / 3; let e = 0; z(E, e), (e += E.length); for (let t = 0, n = S.length; t < n; t++) { const n = S[t]; z(n, e), (e += n.length); } n.addGroup(t, i.length / 3 - t, 1); })(); } this.setAttribute('position', new mn(i, 3)), this.setAttribute('uv', new mn(r, 2)), this.computeVertexNormals(); } toJSON() { const t = En.prototype.toJSON.call(this); return (function (t, e, n) { if (((n.shapes = []), Array.isArray(t))) for (let e = 0, i = t.length; e < i; e++) { const i = t[e]; n.shapes.push(i.uuid); } else n.shapes.push(t.uuid); void 0 !== e.extrudePath && (n.options.extrudePath = e.extrudePath.toJSON()); return n; })(this.parameters.shapes, this.parameters.options, t); } } const vo = { generateTopUV: function (t, e, n, i, r) { const s = e[3 * n], a = e[3 * n + 1], o = e[3 * i], l = e[3 * i + 1], c = e[3 * r], h = e[3 * r + 1]; return [new vt(s, a), new vt(o, l), new vt(c, h)]; }, generateSideWallUV: function (t, e, n, i, r, s) { const a = e[3 * n], o = e[3 * n + 1], l = e[3 * n + 2], c = e[3 * i], h = e[3 * i + 1], u = e[3 * i + 2], d = e[3 * r], p = e[3 * r + 1], m = e[3 * r + 2], f = e[3 * s], g = e[3 * s + 1], v = e[3 * s + 2]; return Math.abs(o - h) < 0.01 ? [ new vt(a, 1 - l), new vt(c, 1 - u), new vt(d, 1 - m), new vt(f, 1 - v), ] : [ new vt(o, 1 - l), new vt(h, 1 - u), new vt(p, 1 - m), new vt(g, 1 - v), ]; }, }; class yo extends Na { constructor(t = 1, e = 0) { const n = (1 + Math.sqrt(5)) / 2; super( [ -1, n, 0, 1, n, 0, -1, -n, 0, 1, -n, 0, 0, -1, n, 0, 1, n, 0, -1, -n, 0, 1, -n, n, 0, -1, n, 0, 1, -n, 0, -1, -n, 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, ], t, e ), (this.type = 'IcosahedronGeometry'), (this.parameters = { radius: t, detail: e }); } } class xo extends En { constructor(t, e = 12, n = 0, i = 2 * Math.PI) { super(), (this.type = 'LatheGeometry'), (this.parameters = { points: t, segments: e, phiStart: n, phiLength: i, }), (e = Math.floor(e)), (i = ht(i, 0, 2 * Math.PI)); const r = [], s = [], a = [], o = 1 / e, l = new Lt(), c = new vt(); for (let r = 0; r <= e; r++) { const h = n + r * o * i, u = Math.sin(h), d = Math.cos(h); for (let n = 0; n <= t.length - 1; n++) (l.x = t[n].x * u), (l.y = t[n].y), (l.z = t[n].x * d), s.push(l.x, l.y, l.z), (c.x = r / e), (c.y = n / (t.length - 1)), a.push(c.x, c.y); } for (let n = 0; n < e; n++) for (let e = 0; e < t.length - 1; e++) { const i = e + n * t.length, s = i, a = i + t.length, o = i + t.length + 1, l = i + 1; r.push(s, a, l), r.push(a, o, l); } if ( (this.setIndex(r), this.setAttribute('position', new mn(s, 3)), this.setAttribute('uv', new mn(a, 2)), this.computeVertexNormals(), i === 2 * Math.PI) ) { const n = this.attributes.normal.array, i = new Lt(), r = new Lt(), s = new Lt(), a = e * t.length * 3; for (let e = 0, o = 0; e < t.length; e++, o += 3) (i.x = n[o + 0]), (i.y = n[o + 1]), (i.z = n[o + 2]), (r.x = n[a + o + 0]), (r.y = n[a + o + 1]), (r.z = n[a + o + 2]), s.addVectors(i, r).normalize(), (n[o + 0] = n[a + o + 0] = s.x), (n[o + 1] = n[a + o + 1] = s.y), (n[o + 2] = n[a + o + 2] = s.z); } } } class _o extends Na { constructor(t = 1, e = 0) { super( [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, ], t, e ), (this.type = 'OctahedronGeometry'), (this.parameters = { radius: t, detail: e }); } } class wo extends En { constructor(t, e, n) { super(), (this.type = 'ParametricGeometry'), (this.parameters = { func: t, slices: e, stacks: n }); const i = [], r = [], s = [], a = [], o = 1e-5, l = new Lt(), c = new Lt(), h = new Lt(), u = new Lt(), d = new Lt(); t.length < 3 && console.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' ); const p = e + 1; for (let i = 0; i <= n; i++) { const p = i / n; for (let n = 0; n <= e; n++) { const i = n / e; t(i, p, c), r.push(c.x, c.y, c.z), i - o >= 0 ? (t(i - o, p, h), u.subVectors(c, h)) : (t(i + o, p, h), u.subVectors(h, c)), p - o >= 0 ? (t(i, p - o, h), d.subVectors(c, h)) : (t(i, p + o, h), d.subVectors(h, c)), l.crossVectors(u, d).normalize(), s.push(l.x, l.y, l.z), a.push(i, p); } } for (let t = 0; t < n; t++) for (let n = 0; n < e; n++) { const e = t * p + n, r = t * p + n + 1, s = (t + 1) * p + n + 1, a = (t + 1) * p + n; i.push(e, r, a), i.push(r, s, a); } this.setIndex(i), this.setAttribute('position', new mn(r, 3)), this.setAttribute('normal', new mn(s, 3)), this.setAttribute('uv', new mn(a, 2)); } } class bo extends En { constructor(t = 0.5, e = 1, n = 8, i = 1, r = 0, s = 2 * Math.PI) { super(), (this.type = 'RingGeometry'), (this.parameters = { innerRadius: t, outerRadius: e, thetaSegments: n, phiSegments: i, thetaStart: r, thetaLength: s, }), (n = Math.max(3, n)); const a = [], o = [], l = [], c = []; let h = t; const u = (e - t) / (i = Math.max(1, i)), d = new Lt(), p = new vt(); for (let t = 0; t <= i; t++) { for (let t = 0; t <= n; t++) { const i = r + (t / n) * s; (d.x = h * Math.cos(i)), (d.y = h * Math.sin(i)), o.push(d.x, d.y, d.z), l.push(0, 0, 1), (p.x = (d.x / e + 1) / 2), (p.y = (d.y / e + 1) / 2), c.push(p.x, p.y); } h += u; } for (let t = 0; t < i; t++) { const e = t * (n + 1); for (let t = 0; t < n; t++) { const i = t + e, r = i, s = i + n + 1, o = i + n + 2, l = i + 1; a.push(r, s, l), a.push(s, o, l); } } this.setIndex(a), this.setAttribute('position', new mn(o, 3)), this.setAttribute('normal', new mn(l, 3)), this.setAttribute('uv', new mn(c, 2)); } } class Mo extends En { constructor(t, e = 12) { super(), (this.type = 'ShapeGeometry'), (this.parameters = { shapes: t, curveSegments: e }); const n = [], i = [], r = [], s = []; let a = 0, o = 0; if (!1 === Array.isArray(t)) l(t); else for (let e = 0; e < t.length; e++) l(t[e]), this.addGroup(a, o, e), (a += o), (o = 0); function l(t) { const a = i.length / 3, l = t.extractPoints(e); let c = l.shape; const h = l.holes; !1 === po.isClockWise(c) && (c = c.reverse()); for (let t = 0, e = h.length; t < e; t++) { const e = h[t]; !0 === po.isClockWise(e) && (h[t] = e.reverse()); } const u = po.triangulateShape(c, h); for (let t = 0, e = h.length; t < e; t++) { const e = h[t]; c = c.concat(e); } for (let t = 0, e = c.length; t < e; t++) { const e = c[t]; i.push(e.x, e.y, 0), r.push(0, 0, 1), s.push(e.x, e.y); } for (let t = 0, e = u.length; t < e; t++) { const e = u[t], i = e[0] + a, r = e[1] + a, s = e[2] + a; n.push(i, r, s), (o += 3); } } this.setIndex(n), this.setAttribute('position', new mn(i, 3)), this.setAttribute('normal', new mn(r, 3)), this.setAttribute('uv', new mn(s, 2)); } toJSON() { const t = En.prototype.toJSON.call(this); return (function (t, e) { if (((e.shapes = []), Array.isArray(t))) for (let n = 0, i = t.length; n < i; n++) { const i = t[n]; e.shapes.push(i.uuid); } else e.shapes.push(t.uuid); return e; })(this.parameters.shapes, t); } } class So extends En { constructor( t = 1, e = 8, n = 6, i = 0, r = 2 * Math.PI, s = 0, a = Math.PI ) { super(), (this.type = 'SphereGeometry'), (this.parameters = { radius: t, widthSegments: e, heightSegments: n, phiStart: i, phiLength: r, thetaStart: s, thetaLength: a, }), (e = Math.max(3, Math.floor(e))), (n = Math.max(2, Math.floor(n))); const o = Math.min(s + a, Math.PI); let l = 0; const c = [], h = new Lt(), u = new Lt(), d = [], p = [], m = [], f = []; for (let d = 0; d <= n; d++) { const g = [], v = d / n; let y = 0; 0 == d && 0 == s ? (y = 0.5 / e) : d == n && o == Math.PI && (y = -0.5 / e); for (let n = 0; n <= e; n++) { const o = n / e; (h.x = -t * Math.cos(i + o * r) * Math.sin(s + v * a)), (h.y = t * Math.cos(s + v * a)), (h.z = t * Math.sin(i + o * r) * Math.sin(s + v * a)), p.push(h.x, h.y, h.z), u.copy(h).normalize(), m.push(u.x, u.y, u.z), f.push(o + y, 1 - v), g.push(l++); } c.push(g); } for (let t = 0; t < n; t++) for (let i = 0; i < e; i++) { const e = c[t][i + 1], r = c[t][i], a = c[t + 1][i], l = c[t + 1][i + 1]; (0 !== t || s > 0) && d.push(e, r, l), (t !== n - 1 || o < Math.PI) && d.push(r, a, l); } this.setIndex(d), this.setAttribute('position', new mn(p, 3)), this.setAttribute('normal', new mn(m, 3)), this.setAttribute('uv', new mn(f, 2)); } } class To extends Na { constructor(t = 1, e = 0) { super( [1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1], [2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1], t, e ), (this.type = 'TetrahedronGeometry'), (this.parameters = { radius: t, detail: e }); } } class Eo extends go { constructor(t, e = {}) { const n = e.font; if (!n || !n.isFont) return ( console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ), new En() ); const i = n.generateShapes(t, e.size); (e.depth = void 0 !== e.height ? e.height : 50), void 0 === e.bevelThickness && (e.bevelThickness = 10), void 0 === e.bevelSize && (e.bevelSize = 8), void 0 === e.bevelEnabled && (e.bevelEnabled = !1), super(i, e), (this.type = 'TextGeometry'); } } class Ao extends En { constructor(t = 1, e = 0.4, n = 8, i = 6, r = 2 * Math.PI) { super(), (this.type = 'TorusGeometry'), (this.parameters = { radius: t, tube: e, radialSegments: n, tubularSegments: i, arc: r, }), (n = Math.floor(n)), (i = Math.floor(i)); const s = [], a = [], o = [], l = [], c = new Lt(), h = new Lt(), u = new Lt(); for (let s = 0; s <= n; s++) for (let d = 0; d <= i; d++) { const p = (d / i) * r, m = (s / n) * Math.PI * 2; (h.x = (t + e * Math.cos(m)) * Math.cos(p)), (h.y = (t + e * Math.cos(m)) * Math.sin(p)), (h.z = e * Math.sin(m)), a.push(h.x, h.y, h.z), (c.x = t * Math.cos(p)), (c.y = t * Math.sin(p)), u.subVectors(h, c).normalize(), o.push(u.x, u.y, u.z), l.push(d / i), l.push(s / n); } for (let t = 1; t <= n; t++) for (let e = 1; e <= i; e++) { const n = (i + 1) * t + e - 1, r = (i + 1) * (t - 1) + e - 1, a = (i + 1) * (t - 1) + e, o = (i + 1) * t + e; s.push(n, r, o), s.push(r, a, o); } this.setIndex(s), this.setAttribute('position', new mn(a, 3)), this.setAttribute('normal', new mn(o, 3)), this.setAttribute('uv', new mn(l, 2)); } } class Lo extends En { constructor(t = 1, e = 0.4, n = 64, i = 8, r = 2, s = 3) { super(), (this.type = 'TorusKnotGeometry'), (this.parameters = { radius: t, tube: e, tubularSegments: n, radialSegments: i, p: r, q: s, }), (n = Math.floor(n)), (i = Math.floor(i)); const a = [], o = [], l = [], c = [], h = new Lt(), u = new Lt(), d = new Lt(), p = new Lt(), m = new Lt(), f = new Lt(), g = new Lt(); for (let a = 0; a <= n; ++a) { const y = (a / n) * r * Math.PI * 2; v(y, r, s, t, d), v(y + 0.01, r, s, t, p), f.subVectors(p, d), g.addVectors(p, d), m.crossVectors(f, g), g.crossVectors(m, f), m.normalize(), g.normalize(); for (let t = 0; t <= i; ++t) { const r = (t / i) * Math.PI * 2, s = -e * Math.cos(r), p = e * Math.sin(r); (h.x = d.x + (s * g.x + p * m.x)), (h.y = d.y + (s * g.y + p * m.y)), (h.z = d.z + (s * g.z + p * m.z)), o.push(h.x, h.y, h.z), u.subVectors(h, d).normalize(), l.push(u.x, u.y, u.z), c.push(a / n), c.push(t / i); } } for (let t = 1; t <= n; t++) for (let e = 1; e <= i; e++) { const n = (i + 1) * (t - 1) + (e - 1), r = (i + 1) * t + (e - 1), s = (i + 1) * t + e, o = (i + 1) * (t - 1) + e; a.push(n, r, o), a.push(r, s, o); } function v(t, e, n, i, r) { const s = Math.cos(t), a = Math.sin(t), o = (n / e) * t, l = Math.cos(o); (r.x = i * (2 + l) * 0.5 * s), (r.y = i * (2 + l) * a * 0.5), (r.z = i * Math.sin(o) * 0.5); } this.setIndex(a), this.setAttribute('position', new mn(o, 3)), this.setAttribute('normal', new mn(l, 3)), this.setAttribute('uv', new mn(c, 2)); } } class Ro extends En { constructor(t, e = 64, n = 1, i = 8, r = !1) { super(), (this.type = 'TubeGeometry'), (this.parameters = { path: t, tubularSegments: e, radius: n, radialSegments: i, closed: r, }); const s = t.computeFrenetFrames(e, r); (this.tangents = s.tangents), (this.normals = s.normals), (this.binormals = s.binormals); const a = new Lt(), o = new Lt(), l = new vt(); let c = new Lt(); const h = [], u = [], d = [], p = []; function m(r) { c = t.getPointAt(r / e, c); const l = s.normals[r], d = s.binormals[r]; for (let t = 0; t <= i; t++) { const e = (t / i) * Math.PI * 2, r = Math.sin(e), s = -Math.cos(e); (o.x = s * l.x + r * d.x), (o.y = s * l.y + r * d.y), (o.z = s * l.z + r * d.z), o.normalize(), u.push(o.x, o.y, o.z), (a.x = c.x + n * o.x), (a.y = c.y + n * o.y), (a.z = c.z + n * o.z), h.push(a.x, a.y, a.z); } } !(function () { for (let t = 0; t < e; t++) m(t); m(!1 === r ? e : 0), (function () { for (let t = 0; t <= e; t++) for (let n = 0; n <= i; n++) (l.x = t / e), (l.y = n / i), d.push(l.x, l.y); })(), (function () { for (let t = 1; t <= e; t++) for (let e = 1; e <= i; e++) { const n = (i + 1) * (t - 1) + (e - 1), r = (i + 1) * t + (e - 1), s = (i + 1) * t + e, a = (i + 1) * (t - 1) + e; p.push(n, r, a), p.push(r, s, a); } })(); })(), this.setIndex(p), this.setAttribute('position', new mn(h, 3)), this.setAttribute('normal', new mn(u, 3)), this.setAttribute('uv', new mn(d, 2)); } toJSON() { const t = En.prototype.toJSON.call(this); return (t.path = this.parameters.path.toJSON()), t; } } class Co extends En { constructor(t) { if ((super(), (this.type = 'WireframeGeometry'), !0 === t.isGeometry)) return void console.error( 'THREE.WireframeGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' ); const e = [], n = [0, 0], i = {}, r = new Lt(); if (null !== t.index) { const s = t.attributes.position, a = t.index; let o = t.groups; 0 === o.length && (o = [{ start: 0, count: a.count, materialIndex: 0 }]); for (let t = 0, e = o.length; t < e; ++t) { const e = o[t], r = e.start; for (let t = r, s = r + e.count; t < s; t += 3) for (let e = 0; e < 3; e++) { const r = a.getX(t + e), s = a.getX(t + ((e + 1) % 3)); (n[0] = Math.min(r, s)), (n[1] = Math.max(r, s)); const o = n[0] + ',' + n[1]; void 0 === i[o] && (i[o] = { index1: n[0], index2: n[1] }); } } for (const t in i) { const n = i[t]; r.fromBufferAttribute(s, n.index1), e.push(r.x, r.y, r.z), r.fromBufferAttribute(s, n.index2), e.push(r.x, r.y, r.z); } } else { const n = t.attributes.position; for (let t = 0, i = n.count / 3; t < i; t++) for (let i = 0; i < 3; i++) { const s = 3 * t + i; r.fromBufferAttribute(n, s), e.push(r.x, r.y, r.z); const a = 3 * t + ((i + 1) % 3); r.fromBufferAttribute(n, a), e.push(r.x, r.y, r.z); } } this.setAttribute('position', new mn(e, 3)); } } var Po = Object.freeze({ __proto__: null, BoxGeometry: qn, BoxBufferGeometry: qn, CircleGeometry: Pa, CircleBufferGeometry: Pa, ConeGeometry: Ia, ConeBufferGeometry: Ia, CylinderGeometry: Da, CylinderBufferGeometry: Da, DodecahedronGeometry: Ba, DodecahedronBufferGeometry: Ba, EdgesGeometry: Ga, ExtrudeGeometry: go, ExtrudeBufferGeometry: go, IcosahedronGeometry: yo, IcosahedronBufferGeometry: yo, LatheGeometry: xo, LatheBufferGeometry: xo, OctahedronGeometry: _o, OctahedronBufferGeometry: _o, ParametricGeometry: wo, ParametricBufferGeometry: wo, PlaneGeometry: ci, PlaneBufferGeometry: ci, PolyhedronGeometry: Na, PolyhedronBufferGeometry: Na, RingGeometry: bo, RingBufferGeometry: bo, ShapeGeometry: Mo, ShapeBufferGeometry: Mo, SphereGeometry: So, SphereBufferGeometry: So, TetrahedronGeometry: To, TetrahedronBufferGeometry: To, TextGeometry: Eo, TextBufferGeometry: Eo, TorusGeometry: Ao, TorusBufferGeometry: Ao, TorusKnotGeometry: Lo, TorusKnotBufferGeometry: Lo, TubeGeometry: Ro, TubeBufferGeometry: Ro, WireframeGeometry: Co, }); class Do extends Xe { constructor(t) { super(), (this.type = 'ShadowMaterial'), (this.color = new tn(0)), (this.transparent = !0), this.setValues(t); } copy(t) { return super.copy(t), this.color.copy(t.color), this; } } Do.prototype.isShadowMaterial = !0; class Io extends Jn { constructor(t) { super(t), (this.type = 'RawShaderMaterial'); } } Io.prototype.isRawShaderMaterial = !0; class No extends Xe { constructor(t) { super(), (this.defines = { STANDARD: '' }), (this.type = 'MeshStandardMaterial'), (this.color = new tn(16777215)), (this.roughness = 1), (this.metalness = 0), (this.map = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.emissive = new tn(0)), (this.emissiveIntensity = 1), (this.emissiveMap = null), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new vt(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.roughnessMap = null), (this.metalnessMap = null), (this.alphaMap = null), (this.envMap = null), (this.envMapIntensity = 1), (this.refractionRatio = 0.98), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = 'round'), (this.wireframeLinejoin = 'round'), (this.skinning = !1), (this.morphTargets = !1), (this.morphNormals = !1), (this.flatShading = !1), (this.vertexTangents = !1), this.setValues(t); } copy(t) { return ( super.copy(t), (this.defines = { STANDARD: '' }), this.color.copy(t.color), (this.roughness = t.roughness), (this.metalness = t.metalness), (this.map = t.map), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), this.emissive.copy(t.emissive), (this.emissiveMap = t.emissiveMap), (this.emissiveIntensity = t.emissiveIntensity), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.roughnessMap = t.roughnessMap), (this.metalnessMap = t.metalnessMap), (this.alphaMap = t.alphaMap), (this.envMap = t.envMap), (this.envMapIntensity = t.envMapIntensity), (this.refractionRatio = t.refractionRatio), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.morphNormals = t.morphNormals), (this.flatShading = t.flatShading), (this.vertexTangents = t.vertexTangents), this ); } } No.prototype.isMeshStandardMaterial = !0; class Bo extends No { constructor(t) { super(), (this.defines = { STANDARD: '', PHYSICAL: '' }), (this.type = 'MeshPhysicalMaterial'), (this.clearcoat = 0), (this.clearcoatMap = null), (this.clearcoatRoughness = 0), (this.clearcoatRoughnessMap = null), (this.clearcoatNormalScale = new vt(1, 1)), (this.clearcoatNormalMap = null), (this.reflectivity = 0.5), Object.defineProperty(this, 'ior', { get: function () { return ( (1 + 0.4 * this.reflectivity) / (1 - 0.4 * this.reflectivity) ); }, set: function (t) { this.reflectivity = ht((2.5 * (t - 1)) / (t + 1), 0, 1); }, }), (this.sheen = null), (this.transmission = 0), (this.transmissionMap = null), this.setValues(t); } copy(t) { return ( super.copy(t), (this.defines = { STANDARD: '', PHYSICAL: '' }), (this.clearcoat = t.clearcoat), (this.clearcoatMap = t.clearcoatMap), (this.clearcoatRoughness = t.clearcoatRoughness), (this.clearcoatRoughnessMap = t.clearcoatRoughnessMap), (this.clearcoatNormalMap = t.clearcoatNormalMap), this.clearcoatNormalScale.copy(t.clearcoatNormalScale), (this.reflectivity = t.reflectivity), t.sheen ? (this.sheen = (this.sheen || new tn()).copy(t.sheen)) : (this.sheen = null), (this.transmission = t.transmission), (this.transmissionMap = t.transmissionMap), this ); } } Bo.prototype.isMeshPhysicalMaterial = !0; class zo extends Xe { constructor(t) { super(), (this.type = 'MeshPhongMaterial'), (this.color = new tn(16777215)), (this.specular = new tn(1118481)), (this.shininess = 30), (this.map = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.emissive = new tn(0)), (this.emissiveIntensity = 1), (this.emissiveMap = null), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new vt(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.specularMap = null), (this.alphaMap = null), (this.envMap = null), (this.combine = 0), (this.reflectivity = 1), (this.refractionRatio = 0.98), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = 'round'), (this.wireframeLinejoin = 'round'), (this.skinning = !1), (this.morphTargets = !1), (this.morphNormals = !1), (this.flatShading = !1), this.setValues(t); } copy(t) { return ( super.copy(t), this.color.copy(t.color), this.specular.copy(t.specular), (this.shininess = t.shininess), (this.map = t.map), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), this.emissive.copy(t.emissive), (this.emissiveMap = t.emissiveMap), (this.emissiveIntensity = t.emissiveIntensity), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.specularMap = t.specularMap), (this.alphaMap = t.alphaMap), (this.envMap = t.envMap), (this.combine = t.combine), (this.reflectivity = t.reflectivity), (this.refractionRatio = t.refractionRatio), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.morphNormals = t.morphNormals), (this.flatShading = t.flatShading), this ); } } zo.prototype.isMeshPhongMaterial = !0; class Fo extends Xe { constructor(t) { super(), (this.defines = { TOON: '' }), (this.type = 'MeshToonMaterial'), (this.color = new tn(16777215)), (this.map = null), (this.gradientMap = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.emissive = new tn(0)), (this.emissiveIntensity = 1), (this.emissiveMap = null), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new vt(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.alphaMap = null), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = 'round'), (this.wireframeLinejoin = 'round'), (this.skinning = !1), (this.morphTargets = !1), (this.morphNormals = !1), this.setValues(t); } copy(t) { return ( super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.gradientMap = t.gradientMap), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), this.emissive.copy(t.emissive), (this.emissiveMap = t.emissiveMap), (this.emissiveIntensity = t.emissiveIntensity), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.alphaMap = t.alphaMap), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.morphNormals = t.morphNormals), this ); } } Fo.prototype.isMeshToonMaterial = !0; class Oo extends Xe { constructor(t) { super(), (this.type = 'MeshNormalMaterial'), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new vt(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.fog = !1), (this.skinning = !1), (this.morphTargets = !1), (this.morphNormals = !1), (this.flatShading = !1), this.setValues(t); } copy(t) { return ( super.copy(t), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.morphNormals = t.morphNormals), (this.flatShading = t.flatShading), this ); } } Oo.prototype.isMeshNormalMaterial = !0; class Ho extends Xe { constructor(t) { super(), (this.type = 'MeshLambertMaterial'), (this.color = new tn(16777215)), (this.map = null), (this.lightMap = null), (this.lightMapIntensity = 1), (this.aoMap = null), (this.aoMapIntensity = 1), (this.emissive = new tn(0)), (this.emissiveIntensity = 1), (this.emissiveMap = null), (this.specularMap = null), (this.alphaMap = null), (this.envMap = null), (this.combine = 0), (this.reflectivity = 1), (this.refractionRatio = 0.98), (this.wireframe = !1), (this.wireframeLinewidth = 1), (this.wireframeLinecap = 'round'), (this.wireframeLinejoin = 'round'), (this.skinning = !1), (this.morphTargets = !1), (this.morphNormals = !1), this.setValues(t); } copy(t) { return ( super.copy(t), this.color.copy(t.color), (this.map = t.map), (this.lightMap = t.lightMap), (this.lightMapIntensity = t.lightMapIntensity), (this.aoMap = t.aoMap), (this.aoMapIntensity = t.aoMapIntensity), this.emissive.copy(t.emissive), (this.emissiveMap = t.emissiveMap), (this.emissiveIntensity = t.emissiveIntensity), (this.specularMap = t.specularMap), (this.alphaMap = t.alphaMap), (this.envMap = t.envMap), (this.combine = t.combine), (this.reflectivity = t.reflectivity), (this.refractionRatio = t.refractionRatio), (this.wireframe = t.wireframe), (this.wireframeLinewidth = t.wireframeLinewidth), (this.wireframeLinecap = t.wireframeLinecap), (this.wireframeLinejoin = t.wireframeLinejoin), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.morphNormals = t.morphNormals), this ); } } Ho.prototype.isMeshLambertMaterial = !0; class Go extends Xe { constructor(t) { super(), (this.defines = { MATCAP: '' }), (this.type = 'MeshMatcapMaterial'), (this.color = new tn(16777215)), (this.matcap = null), (this.map = null), (this.bumpMap = null), (this.bumpScale = 1), (this.normalMap = null), (this.normalMapType = 0), (this.normalScale = new vt(1, 1)), (this.displacementMap = null), (this.displacementScale = 1), (this.displacementBias = 0), (this.alphaMap = null), (this.skinning = !1), (this.morphTargets = !1), (this.morphNormals = !1), (this.flatShading = !1), this.setValues(t); } copy(t) { return ( super.copy(t), (this.defines = { MATCAP: '' }), this.color.copy(t.color), (this.matcap = t.matcap), (this.map = t.map), (this.bumpMap = t.bumpMap), (this.bumpScale = t.bumpScale), (this.normalMap = t.normalMap), (this.normalMapType = t.normalMapType), this.normalScale.copy(t.normalScale), (this.displacementMap = t.displacementMap), (this.displacementScale = t.displacementScale), (this.displacementBias = t.displacementBias), (this.alphaMap = t.alphaMap), (this.skinning = t.skinning), (this.morphTargets = t.morphTargets), (this.morphNormals = t.morphNormals), (this.flatShading = t.flatShading), this ); } } Go.prototype.isMeshMatcapMaterial = !0; class Uo extends ca { constructor(t) { super(), (this.type = 'LineDashedMaterial'), (this.scale = 1), (this.dashSize = 3), (this.gapSize = 1), this.setValues(t); } copy(t) { return ( super.copy(t), (this.scale = t.scale), (this.dashSize = t.dashSize), (this.gapSize = t.gapSize), this ); } } Uo.prototype.isLineDashedMaterial = !0; var ko = Object.freeze({ __proto__: null, ShadowMaterial: Do, SpriteMaterial: Rs, RawShaderMaterial: Io, ShaderMaterial: Jn, PointsMaterial: _a, MeshPhysicalMaterial: Bo, MeshStandardMaterial: No, MeshPhongMaterial: zo, MeshToonMaterial: Fo, MeshNormalMaterial: Oo, MeshLambertMaterial: Ho, MeshDepthMaterial: cs, MeshDistanceMaterial: hs, MeshBasicMaterial: en, MeshMatcapMaterial: Go, LineDashedMaterial: Uo, LineBasicMaterial: ca, Material: Xe, }); const Vo = { arraySlice: function (t, e, n) { return Vo.isTypedArray(t) ? new t.constructor(t.subarray(e, void 0 !== n ? n : t.length)) : t.slice(e, n); }, convertArray: function (t, e, n) { return !t || (!n && t.constructor === e) ? t : 'number' == typeof e.BYTES_PER_ELEMENT ? new e(t) : Array.prototype.slice.call(t); }, isTypedArray: function (t) { return ArrayBuffer.isView(t) && !(t instanceof DataView); }, getKeyframeOrder: function (t) { const e = t.length, n = new Array(e); for (let t = 0; t !== e; ++t) n[t] = t; return ( n.sort(function (e, n) { return t[e] - t[n]; }), n ); }, sortedArray: function (t, e, n) { const i = t.length, r = new t.constructor(i); for (let s = 0, a = 0; a !== i; ++s) { const i = n[s] * e; for (let n = 0; n !== e; ++n) r[a++] = t[i + n]; } return r; }, flattenJSON: function (t, e, n, i) { let r = 1, s = t[0]; for (; void 0 !== s && void 0 === s[i]; ) s = t[r++]; if (void 0 === s) return; let a = s[i]; if (void 0 !== a) if (Array.isArray(a)) do { (a = s[i]), void 0 !== a && (e.push(s.time), n.push.apply(n, a)), (s = t[r++]); } while (void 0 !== s); else if (void 0 !== a.toArray) do { (a = s[i]), void 0 !== a && (e.push(s.time), a.toArray(n, n.length)), (s = t[r++]); } while (void 0 !== s); else do { (a = s[i]), void 0 !== a && (e.push(s.time), n.push(a)), (s = t[r++]); } while (void 0 !== s); }, subclip: function (t, e, n, i, r = 30) { const s = t.clone(); s.name = e; const a = []; for (let t = 0; t < s.tracks.length; ++t) { const e = s.tracks[t], o = e.getValueSize(), l = [], c = []; for (let t = 0; t < e.times.length; ++t) { const s = e.times[t] * r; if (!(s < n || s >= i)) { l.push(e.times[t]); for (let n = 0; n < o; ++n) c.push(e.values[t * o + n]); } } 0 !== l.length && ((e.times = Vo.convertArray(l, e.times.constructor)), (e.values = Vo.convertArray(c, e.values.constructor)), a.push(e)); } s.tracks = a; let o = 1 / 0; for (let t = 0; t < s.tracks.length; ++t) o > s.tracks[t].times[0] && (o = s.tracks[t].times[0]); for (let t = 0; t < s.tracks.length; ++t) s.tracks[t].shift(-1 * o); return s.resetDuration(), s; }, makeClipAdditive: function (t, e = 0, n = t, i = 30) { i <= 0 && (i = 30); const r = n.tracks.length, s = e / i; for (let e = 0; e < r; ++e) { const i = n.tracks[e], r = i.ValueTypeName; if ('bool' === r || 'string' === r) continue; const a = t.tracks.find(function (t) { return t.name === i.name && t.ValueTypeName === r; }); if (void 0 === a) continue; let o = 0; const l = i.getValueSize(); i.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline && (o = l / 3); let c = 0; const h = a.getValueSize(); a.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline && (c = h / 3); const u = i.times.length - 1; let d; if (s <= i.times[0]) { const t = o, e = l - o; d = Vo.arraySlice(i.values, t, e); } else if (s >= i.times[u]) { const t = u * l + o, e = t + l - o; d = Vo.arraySlice(i.values, t, e); } else { const t = i.createInterpolant(), e = o, n = l - o; t.evaluate(s), (d = Vo.arraySlice(t.resultBuffer, e, n)); } if ('quaternion' === r) { new At().fromArray(d).normalize().conjugate().toArray(d); } const p = a.times.length; for (let t = 0; t < p; ++t) { const e = t * h + c; if ('quaternion' === r) At.multiplyQuaternionsFlat(a.values, e, d, 0, a.values, e); else { const t = h - 2 * c; for (let n = 0; n < t; ++n) a.values[e + n] -= d[n]; } } } return (t.blendMode = q), t; }, }; class Wo { constructor(t, e, n, i) { (this.parameterPositions = t), (this._cachedIndex = 0), (this.resultBuffer = void 0 !== i ? i : new e.constructor(n)), (this.sampleValues = e), (this.valueSize = n), (this.settings = null), (this.DefaultSettings_ = {}); } evaluate(t) { const e = this.parameterPositions; let n = this._cachedIndex, i = e[n], r = e[n - 1]; t: { e: { let s; n: { i: if (!(t < i)) { for (let s = n + 2; ; ) { if (void 0 === i) { if (t < r) break i; return ( (n = e.length), (this._cachedIndex = n), this.afterEnd_(n - 1, t, r) ); } if (n === s) break; if (((r = i), (i = e[++n]), t < i)) break e; } s = e.length; break n; } if (t >= r) break t; { const a = e[1]; t < a && ((n = 2), (r = a)); for (let s = n - 2; ; ) { if (void 0 === r) return (this._cachedIndex = 0), this.beforeStart_(0, t, i); if (n === s) break; if (((i = r), (r = e[--n - 1]), t >= r)) break e; } (s = n), (n = 0); } } for (; n < s; ) { const i = (n + s) >>> 1; t < e[i] ? (s = i) : (n = i + 1); } if (((i = e[n]), (r = e[n - 1]), void 0 === r)) return (this._cachedIndex = 0), this.beforeStart_(0, t, i); if (void 0 === i) return ( (n = e.length), (this._cachedIndex = n), this.afterEnd_(n - 1, r, t) ); } (this._cachedIndex = n), this.intervalChanged_(n, r, i); } return this.interpolate_(n, r, t, i); } getSettings_() { return this.settings || this.DefaultSettings_; } copySampleValue_(t) { const e = this.resultBuffer, n = this.sampleValues, i = this.valueSize, r = t * i; for (let t = 0; t !== i; ++t) e[t] = n[r + t]; return e; } interpolate_() { throw new Error('call to abstract method'); } intervalChanged_() {} } (Wo.prototype.beforeStart_ = Wo.prototype.copySampleValue_), (Wo.prototype.afterEnd_ = Wo.prototype.copySampleValue_); class jo extends Wo { constructor(t, e, n, i) { super(t, e, n, i), (this._weightPrev = -0), (this._offsetPrev = -0), (this._weightNext = -0), (this._offsetNext = -0), (this.DefaultSettings_ = { endingStart: k, endingEnd: k }); } intervalChanged_(t, e, n) { const i = this.parameterPositions; let r = t - 2, s = t + 1, a = i[r], o = i[s]; if (void 0 === a) switch (this.getSettings_().endingStart) { case V: (r = t), (a = 2 * e - n); break; case W: (r = i.length - 2), (a = e + i[r] - i[r + 1]); break; default: (r = t), (a = n); } if (void 0 === o) switch (this.getSettings_().endingEnd) { case V: (s = t), (o = 2 * n - e); break; case W: (s = 1), (o = n + i[1] - i[0]); break; default: (s = t - 1), (o = e); } const l = 0.5 * (n - e), c = this.valueSize; (this._weightPrev = l / (e - a)), (this._weightNext = l / (o - n)), (this._offsetPrev = r * c), (this._offsetNext = s * c); } interpolate_(t, e, n, i) { const r = this.resultBuffer, s = this.sampleValues, a = this.valueSize, o = t * a, l = o - a, c = this._offsetPrev, h = this._offsetNext, u = this._weightPrev, d = this._weightNext, p = (n - e) / (i - e), m = p * p, f = m * p, g = -u * f + 2 * u * m - u * p, v = (1 + u) * f + (-1.5 - 2 * u) * m + (-0.5 + u) * p + 1, y = (-1 - d) * f + (1.5 + d) * m + 0.5 * p, x = d * f - d * m; for (let t = 0; t !== a; ++t) r[t] = g * s[c + t] + v * s[l + t] + y * s[o + t] + x * s[h + t]; return r; } } class qo extends Wo { constructor(t, e, n, i) { super(t, e, n, i); } interpolate_(t, e, n, i) { const r = this.resultBuffer, s = this.sampleValues, a = this.valueSize, o = t * a, l = o - a, c = (n - e) / (i - e), h = 1 - c; for (let t = 0; t !== a; ++t) r[t] = s[l + t] * h + s[o + t] * c; return r; } } class Xo extends Wo { constructor(t, e, n, i) { super(t, e, n, i); } interpolate_(t) { return this.copySampleValue_(t - 1); } } class Yo { constructor(t, e, n, i) { if (void 0 === t) throw new Error('THREE.KeyframeTrack: track name is undefined'); if (void 0 === e || 0 === e.length) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + t ); (this.name = t), (this.times = Vo.convertArray(e, this.TimeBufferType)), (this.values = Vo.convertArray(n, this.ValueBufferType)), this.setInterpolation(i || this.DefaultInterpolation); } static toJSON(t) { const e = t.constructor; let n; if (e.toJSON !== this.toJSON) n = e.toJSON(t); else { n = { name: t.name, times: Vo.convertArray(t.times, Array), values: Vo.convertArray(t.values, Array), }; const e = t.getInterpolation(); e !== t.DefaultInterpolation && (n.interpolation = e); } return (n.type = t.ValueTypeName), n; } InterpolantFactoryMethodDiscrete(t) { return new Xo(this.times, this.values, this.getValueSize(), t); } InterpolantFactoryMethodLinear(t) { return new qo(this.times, this.values, this.getValueSize(), t); } InterpolantFactoryMethodSmooth(t) { return new jo(this.times, this.values, this.getValueSize(), t); } setInterpolation(t) { let e; switch (t) { case H: e = this.InterpolantFactoryMethodDiscrete; break; case G: e = this.InterpolantFactoryMethodLinear; break; case U: e = this.InterpolantFactoryMethodSmooth; } if (void 0 === e) { const e = 'unsupported interpolation for ' + this.ValueTypeName + ' keyframe track named ' + this.name; if (void 0 === this.createInterpolant) { if (t === this.DefaultInterpolation) throw new Error(e); this.setInterpolation(this.DefaultInterpolation); } return console.warn('THREE.KeyframeTrack:', e), this; } return (this.createInterpolant = e), this; } getInterpolation() { switch (this.createInterpolant) { case this.InterpolantFactoryMethodDiscrete: return H; case this.InterpolantFactoryMethodLinear: return G; case this.InterpolantFactoryMethodSmooth: return U; } } getValueSize() { return this.values.length / this.times.length; } shift(t) { if (0 !== t) { const e = this.times; for (let n = 0, i = e.length; n !== i; ++n) e[n] += t; } return this; } scale(t) { if (1 !== t) { const e = this.times; for (let n = 0, i = e.length; n !== i; ++n) e[n] *= t; } return this; } trim(t, e) { const n = this.times, i = n.length; let r = 0, s = i - 1; for (; r !== i && n[r] < t; ) ++r; for (; -1 !== s && n[s] > e; ) --s; if ((++s, 0 !== r || s !== i)) { r >= s && ((s = Math.max(s, 1)), (r = s - 1)); const t = this.getValueSize(); (this.times = Vo.arraySlice(n, r, s)), (this.values = Vo.arraySlice(this.values, r * t, s * t)); } return this; } validate() { let t = !0; const e = this.getValueSize(); e - Math.floor(e) != 0 && (console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this ), (t = !1)); const n = this.times, i = this.values, r = n.length; 0 === r && (console.error('THREE.KeyframeTrack: Track is empty.', this), (t = !1)); let s = null; for (let e = 0; e !== r; e++) { const i = n[e]; if ('number' == typeof i && isNaN(i)) { console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, e, i ), (t = !1); break; } if (null !== s && s > i) { console.error( 'THREE.KeyframeTrack: Out of order keys.', this, e, i, s ), (t = !1); break; } s = i; } if (void 0 !== i && Vo.isTypedArray(i)) for (let e = 0, n = i.length; e !== n; ++e) { const n = i[e]; if (isNaN(n)) { console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, e, n ), (t = !1); break; } } return t; } optimize() { const t = Vo.arraySlice(this.times), e = Vo.arraySlice(this.values), n = this.getValueSize(), i = this.getInterpolation() === U, r = t.length - 1; let s = 1; for (let a = 1; a < r; ++a) { let r = !1; const o = t[a]; if (o !== t[a + 1] && (1 !== a || o !== t[0])) if (i) r = !0; else { const t = a * n, i = t - n, s = t + n; for (let a = 0; a !== n; ++a) { const n = e[t + a]; if (n !== e[i + a] || n !== e[s + a]) { r = !0; break; } } } if (r) { if (a !== s) { t[s] = t[a]; const i = a * n, r = s * n; for (let t = 0; t !== n; ++t) e[r + t] = e[i + t]; } ++s; } } if (r > 0) { t[s] = t[r]; for (let t = r * n, i = s * n, a = 0; a !== n; ++a) e[i + a] = e[t + a]; ++s; } return ( s !== t.length ? ((this.times = Vo.arraySlice(t, 0, s)), (this.values = Vo.arraySlice(e, 0, s * n))) : ((this.times = t), (this.values = e)), this ); } clone() { const t = Vo.arraySlice(this.times, 0), e = Vo.arraySlice(this.values, 0), n = new (0, this.constructor)(this.name, t, e); return (n.createInterpolant = this.createInterpolant), n; } } (Yo.prototype.TimeBufferType = Float32Array), (Yo.prototype.ValueBufferType = Float32Array), (Yo.prototype.DefaultInterpolation = G); class Zo extends Yo {} (Zo.prototype.ValueTypeName = 'bool'), (Zo.prototype.ValueBufferType = Array), (Zo.prototype.DefaultInterpolation = H), (Zo.prototype.InterpolantFactoryMethodLinear = void 0), (Zo.prototype.InterpolantFactoryMethodSmooth = void 0); class Jo extends Yo {} Jo.prototype.ValueTypeName = 'color'; class Qo extends Yo {} Qo.prototype.ValueTypeName = 'number'; class Ko extends Wo { constructor(t, e, n, i) { super(t, e, n, i); } interpolate_(t, e, n, i) { const r = this.resultBuffer, s = this.sampleValues, a = this.valueSize, o = (n - e) / (i - e); let l = t * a; for (let t = l + a; l !== t; l += 4) At.slerpFlat(r, 0, s, l - a, s, l, o); return r; } } class $o extends Yo { InterpolantFactoryMethodLinear(t) { return new Ko(this.times, this.values, this.getValueSize(), t); } } ($o.prototype.ValueTypeName = 'quaternion'), ($o.prototype.DefaultInterpolation = G), ($o.prototype.InterpolantFactoryMethodSmooth = void 0); class tl extends Yo {} (tl.prototype.ValueTypeName = 'string'), (tl.prototype.ValueBufferType = Array), (tl.prototype.DefaultInterpolation = H), (tl.prototype.InterpolantFactoryMethodLinear = void 0), (tl.prototype.InterpolantFactoryMethodSmooth = void 0); class el extends Yo {} el.prototype.ValueTypeName = 'vector'; class nl { constructor(t, e = -1, n, i = 2500) { (this.name = t), (this.tracks = n), (this.duration = e), (this.blendMode = i), (this.uuid = ct()), this.duration < 0 && this.resetDuration(); } static parse(t) { const e = [], n = t.tracks, i = 1 / (t.fps || 1); for (let t = 0, r = n.length; t !== r; ++t) e.push(il(n[t]).scale(i)); const r = new this(t.name, t.duration, e, t.blendMode); return (r.uuid = t.uuid), r; } static toJSON(t) { const e = [], n = t.tracks, i = { name: t.name, duration: t.duration, tracks: e, uuid: t.uuid, blendMode: t.blendMode, }; for (let t = 0, i = n.length; t !== i; ++t) e.push(Yo.toJSON(n[t])); return i; } static CreateFromMorphTargetSequence(t, e, n, i) { const r = e.length, s = []; for (let t = 0; t < r; t++) { let a = [], o = []; a.push((t + r - 1) % r, t, (t + 1) % r), o.push(0, 1, 0); const l = Vo.getKeyframeOrder(a); (a = Vo.sortedArray(a, 1, l)), (o = Vo.sortedArray(o, 1, l)), i || 0 !== a[0] || (a.push(r), o.push(o[0])), s.push( new Qo('.morphTargetInfluences[' + e[t].name + ']', a, o).scale( 1 / n ) ); } return new this(t, -1, s); } static findByName(t, e) { let n = t; if (!Array.isArray(t)) { const e = t; n = (e.geometry && e.geometry.animations) || e.animations; } for (let t = 0; t < n.length; t++) if (n[t].name === e) return n[t]; return null; } static CreateClipsFromMorphTargetSequences(t, e, n) { const i = {}, r = /^([\w-]*?)([\d]+)$/; for (let e = 0, n = t.length; e < n; e++) { const n = t[e], s = n.name.match(r); if (s && s.length > 1) { const t = s[1]; let e = i[t]; e || (i[t] = e = []), e.push(n); } } const s = []; for (const t in i) s.push(this.CreateFromMorphTargetSequence(t, i[t], e, n)); return s; } static parseAnimation(t, e) { if (!t) return ( console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ), null ); const n = function (t, e, n, i, r) { if (0 !== n.length) { const s = [], a = []; Vo.flattenJSON(n, s, a, i), 0 !== s.length && r.push(new t(e, s, a)); } }, i = [], r = t.name || 'default', s = t.fps || 30, a = t.blendMode; let o = t.length || -1; const l = t.hierarchy || []; for (let t = 0; t < l.length; t++) { const r = l[t].keys; if (r && 0 !== r.length) if (r[0].morphTargets) { const t = {}; let e; for (e = 0; e < r.length; e++) if (r[e].morphTargets) for (let n = 0; n < r[e].morphTargets.length; n++) t[r[e].morphTargets[n]] = -1; for (const n in t) { const t = [], s = []; for (let i = 0; i !== r[e].morphTargets.length; ++i) { const i = r[e]; t.push(i.time), s.push(i.morphTarget === n ? 1 : 0); } i.push(new Qo('.morphTargetInfluence[' + n + ']', t, s)); } o = t.length * (s || 1); } else { const s = '.bones[' + e[t].name + ']'; n(el, s + '.position', r, 'pos', i), n($o, s + '.quaternion', r, 'rot', i), n(el, s + '.scale', r, 'scl', i); } } if (0 === i.length) return null; return new this(r, o, i, a); } resetDuration() { let t = 0; for (let e = 0, n = this.tracks.length; e !== n; ++e) { const n = this.tracks[e]; t = Math.max(t, n.times[n.times.length - 1]); } return (this.duration = t), this; } trim() { for (let t = 0; t < this.tracks.length; t++) this.tracks[t].trim(0, this.duration); return this; } validate() { let t = !0; for (let e = 0; e < this.tracks.length; e++) t = t && this.tracks[e].validate(); return t; } optimize() { for (let t = 0; t < this.tracks.length; t++) this.tracks[t].optimize(); return this; } clone() { const t = []; for (let e = 0; e < this.tracks.length; e++) t.push(this.tracks[e].clone()); return new this.constructor(this.name, this.duration, t, this.blendMode); } toJSON() { return this.constructor.toJSON(this); } } function il(t) { if (void 0 === t.type) throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); const e = (function (t) { switch (t.toLowerCase()) { case 'scalar': case 'double': case 'float': case 'number': case 'integer': return Qo; case 'vector': case 'vector2': case 'vector3': case 'vector4': return el; case 'color': return Jo; case 'quaternion': return $o; case 'bool': case 'boolean': return Zo; case 'string': return tl; } throw new Error('THREE.KeyframeTrack: Unsupported typeName: ' + t); })(t.type); if (void 0 === t.times) { const e = [], n = []; Vo.flattenJSON(t.keys, e, n, 'value'), (t.times = e), (t.values = n); } return void 0 !== e.parse ? e.parse(t) : new e(t.name, t.times, t.values, t.interpolation); } const rl = { enabled: !1, files: {}, add: function (t, e) { !1 !== this.enabled && (this.files[t] = e); }, get: function (t) { if (!1 !== this.enabled) return this.files[t]; }, remove: function (t) { delete this.files[t]; }, clear: function () { this.files = {}; }, }; class sl { constructor(t, e, n) { const i = this; let r, s = !1, a = 0, o = 0; const l = []; (this.onStart = void 0), (this.onLoad = t), (this.onProgress = e), (this.onError = n), (this.itemStart = function (t) { o++, !1 === s && void 0 !== i.onStart && i.onStart(t, a, o), (s = !0); }), (this.itemEnd = function (t) { a++, void 0 !== i.onProgress && i.onProgress(t, a, o), a === o && ((s = !1), void 0 !== i.onLoad && i.onLoad()); }), (this.itemError = function (t) { void 0 !== i.onError && i.onError(t); }), (this.resolveURL = function (t) { return r ? r(t) : t; }), (this.setURLModifier = function (t) { return (r = t), this; }), (this.addHandler = function (t, e) { return l.push(t, e), this; }), (this.removeHandler = function (t) { const e = l.indexOf(t); return -1 !== e && l.splice(e, 2), this; }), (this.getHandler = function (t) { for (let e = 0, n = l.length; e < n; e += 2) { const n = l[e], i = l[e + 1]; if ((n.global && (n.lastIndex = 0), n.test(t))) return i; } return null; }); } } const al = new sl(); class ol { constructor(t) { (this.manager = void 0 !== t ? t : al), (this.crossOrigin = 'anonymous'), (this.withCredentials = !1), (this.path = ''), (this.resourcePath = ''), (this.requestHeader = {}); } load() {} loadAsync(t, e) { const n = this; return new Promise(function (i, r) { n.load(t, i, e, r); }); } parse() {} setCrossOrigin(t) { return (this.crossOrigin = t), this; } setWithCredentials(t) { return (this.withCredentials = t), this; } setPath(t) { return (this.path = t), this; } setResourcePath(t) { return (this.resourcePath = t), this; } setRequestHeader(t) { return (this.requestHeader = t), this; } } const ll = {}; class cl extends ol { constructor(t) { super(t); } load(t, e, n, i) { void 0 === t && (t = ''), void 0 !== this.path && (t = this.path + t), (t = this.manager.resolveURL(t)); const r = this, s = rl.get(t); if (void 0 !== s) return ( r.manager.itemStart(t), setTimeout(function () { e && e(s), r.manager.itemEnd(t); }, 0), s ); if (void 0 !== ll[t]) return void ll[t].push({ onLoad: e, onProgress: n, onError: i }); const a = t.match(/^data:(.*?)(;base64)?,(.*)$/); let o; if (a) { const n = a[1], s = !!a[2]; let o = a[3]; (o = decodeURIComponent(o)), s && (o = atob(o)); try { let i; const s = (this.responseType || '').toLowerCase(); switch (s) { case 'arraybuffer': case 'blob': const t = new Uint8Array(o.length); for (let e = 0; e < o.length; e++) t[e] = o.charCodeAt(e); i = 'blob' === s ? new Blob([t.buffer], { type: n }) : t.buffer; break; case 'document': const e = new DOMParser(); i = e.parseFromString(o, n); break; case 'json': i = JSON.parse(o); break; default: i = o; } setTimeout(function () { e && e(i), r.manager.itemEnd(t); }, 0); } catch (e) { setTimeout(function () { i && i(e), r.manager.itemError(t), r.manager.itemEnd(t); }, 0); } } else { (ll[t] = []), ll[t].push({ onLoad: e, onProgress: n, onError: i }), (o = new XMLHttpRequest()), o.open('GET', t, !0), o.addEventListener( 'load', function (e) { const n = this.response, i = ll[t]; if ((delete ll[t], 200 === this.status || 0 === this.status)) { 0 === this.status && console.warn('THREE.FileLoader: HTTP Status 0 received.'), rl.add(t, n); for (let t = 0, e = i.length; t < e; t++) { const e = i[t]; e.onLoad && e.onLoad(n); } r.manager.itemEnd(t); } else { for (let t = 0, n = i.length; t < n; t++) { const n = i[t]; n.onError && n.onError(e); } r.manager.itemError(t), r.manager.itemEnd(t); } }, !1 ), o.addEventListener( 'progress', function (e) { const n = ll[t]; for (let t = 0, i = n.length; t < i; t++) { const i = n[t]; i.onProgress && i.onProgress(e); } }, !1 ), o.addEventListener( 'error', function (e) { const n = ll[t]; delete ll[t]; for (let t = 0, i = n.length; t < i; t++) { const i = n[t]; i.onError && i.onError(e); } r.manager.itemError(t), r.manager.itemEnd(t); }, !1 ), o.addEventListener( 'abort', function (e) { const n = ll[t]; delete ll[t]; for (let t = 0, i = n.length; t < i; t++) { const i = n[t]; i.onError && i.onError(e); } r.manager.itemError(t), r.manager.itemEnd(t); }, !1 ), void 0 !== this.responseType && (o.responseType = this.responseType), void 0 !== this.withCredentials && (o.withCredentials = this.withCredentials), o.overrideMimeType && o.overrideMimeType( void 0 !== this.mimeType ? this.mimeType : 'text/plain' ); for (const t in this.requestHeader) o.setRequestHeader(t, this.requestHeader[t]); o.send(null); } return r.manager.itemStart(t), o; } setResponseType(t) { return (this.responseType = t), this; } setMimeType(t) { return (this.mimeType = t), this; } } class hl extends ol { constructor(t) { super(t); } load(t, e, n, i) { void 0 !== this.path && (t = this.path + t), (t = this.manager.resolveURL(t)); const r = this, s = rl.get(t); if (void 0 !== s) return ( r.manager.itemStart(t), setTimeout(function () { e && e(s), r.manager.itemEnd(t); }, 0), s ); const a = document.createElementNS('http://www.w3.org/1999/xhtml', 'img'); function o() { a.removeEventListener('load', o, !1), a.removeEventListener('error', l, !1), rl.add(t, this), e && e(this), r.manager.itemEnd(t); } function l(e) { a.removeEventListener('load', o, !1), a.removeEventListener('error', l, !1), i && i(e), r.manager.itemError(t), r.manager.itemEnd(t); } return ( a.addEventListener('load', o, !1), a.addEventListener('error', l, !1), 'data:' !== t.substr(0, 5) && void 0 !== this.crossOrigin && (a.crossOrigin = this.crossOrigin), r.manager.itemStart(t), (a.src = t), a ); } } class ul extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = new ei(), s = new hl(this.manager); s.setCrossOrigin(this.crossOrigin), s.setPath(this.path); let a = 0; function o(n) { s.load( t[n], function (t) { (r.images[n] = t), a++, 6 === a && ((r.needsUpdate = !0), e && e(r)); }, void 0, i ); } for (let e = 0; e < t.length; ++e) o(e); return r; } } class dl extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = this, s = new ii(), a = new cl(this.manager); return ( a.setResponseType('arraybuffer'), a.setRequestHeader(this.requestHeader), a.setPath(this.path), a.setWithCredentials(r.withCredentials), a.load( t, function (t) { const n = r.parse(t); n && (void 0 !== n.image ? (s.image = n.image) : void 0 !== n.data && ((s.image.width = n.width), (s.image.height = n.height), (s.image.data = n.data)), (s.wrapS = void 0 !== n.wrapS ? n.wrapS : u), (s.wrapT = void 0 !== n.wrapT ? n.wrapT : u), (s.magFilter = void 0 !== n.magFilter ? n.magFilter : g), (s.minFilter = void 0 !== n.minFilter ? n.minFilter : g), (s.anisotropy = void 0 !== n.anisotropy ? n.anisotropy : 1), void 0 !== n.encoding && (s.encoding = n.encoding), void 0 !== n.flipY && (s.flipY = n.flipY), void 0 !== n.format && (s.format = n.format), void 0 !== n.type && (s.type = n.type), void 0 !== n.mipmaps && ((s.mipmaps = n.mipmaps), (s.minFilter = y)), 1 === n.mipmapCount && (s.minFilter = g), void 0 !== n.generateMipmaps && (s.generateMipmaps = n.generateMipmaps), (s.needsUpdate = !0), e && e(s, n)); }, n, i ), s ); } } class pl extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = new bt(), s = new hl(this.manager); return ( s.setCrossOrigin(this.crossOrigin), s.setPath(this.path), s.load( t, function (n) { r.image = n; const i = t.search(/\.jpe?g($|\?)/i) > 0 || 0 === t.search(/^data\:image\/jpeg/); (r.format = i ? T : E), (r.needsUpdate = !0), void 0 !== e && e(r); }, n, i ), r ); } } class ml { constructor() { (this.type = 'Curve'), (this.arcLengthDivisions = 200); } getPoint() { return console.warn('THREE.Curve: .getPoint() not implemented.'), null; } getPointAt(t, e) { const n = this.getUtoTmapping(t); return this.getPoint(n, e); } getPoints(t = 5) { const e = []; for (let n = 0; n <= t; n++) e.push(this.getPoint(n / t)); return e; } getSpacedPoints(t = 5) { const e = []; for (let n = 0; n <= t; n++) e.push(this.getPointAt(n / t)); return e; } getLength() { const t = this.getLengths(); return t[t.length - 1]; } getLengths(t = this.arcLengthDivisions) { if ( this.cacheArcLengths && this.cacheArcLengths.length === t + 1 && !this.needsUpdate ) return this.cacheArcLengths; this.needsUpdate = !1; const e = []; let n, i = this.getPoint(0), r = 0; e.push(0); for (let s = 1; s <= t; s++) (n = this.getPoint(s / t)), (r += n.distanceTo(i)), e.push(r), (i = n); return (this.cacheArcLengths = e), e; } updateArcLengths() { (this.needsUpdate = !0), this.getLengths(); } getUtoTmapping(t, e) { const n = this.getLengths(); let i = 0; const r = n.length; let s; s = e || t * n[r - 1]; let a, o = 0, l = r - 1; for (; o <= l; ) if (((i = Math.floor(o + (l - o) / 2)), (a = n[i] - s), a < 0)) o = i + 1; else { if (!(a > 0)) { l = i; break; } l = i - 1; } if (((i = l), n[i] === s)) return i / (r - 1); const c = n[i]; return (i + (s - c) / (n[i + 1] - c)) / (r - 1); } getTangent(t, e) { const n = 1e-4; let i = t - n, r = t + n; i < 0 && (i = 0), r > 1 && (r = 1); const s = this.getPoint(i), a = this.getPoint(r), o = e || (s.isVector2 ? new vt() : new Lt()); return o.copy(a).sub(s).normalize(), o; } getTangentAt(t, e) { const n = this.getUtoTmapping(t); return this.getTangent(n, e); } computeFrenetFrames(t, e) { const n = new Lt(), i = [], r = [], s = [], a = new Lt(), o = new se(); for (let e = 0; e <= t; e++) { const n = e / t; (i[e] = this.getTangentAt(n, new Lt())), i[e].normalize(); } (r[0] = new Lt()), (s[0] = new Lt()); let l = Number.MAX_VALUE; const c = Math.abs(i[0].x), h = Math.abs(i[0].y), u = Math.abs(i[0].z); c <= l && ((l = c), n.set(1, 0, 0)), h <= l && ((l = h), n.set(0, 1, 0)), u <= l && n.set(0, 0, 1), a.crossVectors(i[0], n).normalize(), r[0].crossVectors(i[0], a), s[0].crossVectors(i[0], r[0]); for (let e = 1; e <= t; e++) { if ( ((r[e] = r[e - 1].clone()), (s[e] = s[e - 1].clone()), a.crossVectors(i[e - 1], i[e]), a.length() > Number.EPSILON) ) { a.normalize(); const t = Math.acos(ht(i[e - 1].dot(i[e]), -1, 1)); r[e].applyMatrix4(o.makeRotationAxis(a, t)); } s[e].crossVectors(i[e], r[e]); } if (!0 === e) { let e = Math.acos(ht(r[0].dot(r[t]), -1, 1)); (e /= t), i[0].dot(a.crossVectors(r[0], r[t])) > 0 && (e = -e); for (let n = 1; n <= t; n++) r[n].applyMatrix4(o.makeRotationAxis(i[n], e * n)), s[n].crossVectors(i[n], r[n]); } return { tangents: i, normals: r, binormals: s }; } clone() { return new this.constructor().copy(this); } copy(t) { return (this.arcLengthDivisions = t.arcLengthDivisions), this; } toJSON() { const t = { metadata: { version: 4.5, type: 'Curve', generator: 'Curve.toJSON' }, }; return ( (t.arcLengthDivisions = this.arcLengthDivisions), (t.type = this.type), t ); } fromJSON(t) { return (this.arcLengthDivisions = t.arcLengthDivisions), this; } } class fl extends ml { constructor( t = 0, e = 0, n = 1, i = 1, r = 0, s = 2 * Math.PI, a = !1, o = 0 ) { super(), (this.type = 'EllipseCurve'), (this.aX = t), (this.aY = e), (this.xRadius = n), (this.yRadius = i), (this.aStartAngle = r), (this.aEndAngle = s), (this.aClockwise = a), (this.aRotation = o); } getPoint(t, e) { const n = e || new vt(), i = 2 * Math.PI; let r = this.aEndAngle - this.aStartAngle; const s = Math.abs(r) < Number.EPSILON; for (; r < 0; ) r += i; for (; r > i; ) r -= i; r < Number.EPSILON && (r = s ? 0 : i), !0 !== this.aClockwise || s || (r === i ? (r = -i) : (r -= i)); const a = this.aStartAngle + t * r; let o = this.aX + this.xRadius * Math.cos(a), l = this.aY + this.yRadius * Math.sin(a); if (0 !== this.aRotation) { const t = Math.cos(this.aRotation), e = Math.sin(this.aRotation), n = o - this.aX, i = l - this.aY; (o = n * t - i * e + this.aX), (l = n * e + i * t + this.aY); } return n.set(o, l); } copy(t) { return ( super.copy(t), (this.aX = t.aX), (this.aY = t.aY), (this.xRadius = t.xRadius), (this.yRadius = t.yRadius), (this.aStartAngle = t.aStartAngle), (this.aEndAngle = t.aEndAngle), (this.aClockwise = t.aClockwise), (this.aRotation = t.aRotation), this ); } toJSON() { const t = super.toJSON(); return ( (t.aX = this.aX), (t.aY = this.aY), (t.xRadius = this.xRadius), (t.yRadius = this.yRadius), (t.aStartAngle = this.aStartAngle), (t.aEndAngle = this.aEndAngle), (t.aClockwise = this.aClockwise), (t.aRotation = this.aRotation), t ); } fromJSON(t) { return ( super.fromJSON(t), (this.aX = t.aX), (this.aY = t.aY), (this.xRadius = t.xRadius), (this.yRadius = t.yRadius), (this.aStartAngle = t.aStartAngle), (this.aEndAngle = t.aEndAngle), (this.aClockwise = t.aClockwise), (this.aRotation = t.aRotation), this ); } } fl.prototype.isEllipseCurve = !0; class gl extends fl { constructor(t, e, n, i, r, s) { super(t, e, n, n, i, r, s), (this.type = 'ArcCurve'); } } function vl() { let t = 0, e = 0, n = 0, i = 0; function r(r, s, a, o) { (t = r), (e = a), (n = -3 * r + 3 * s - 2 * a - o), (i = 2 * r - 2 * s + a + o); } return { initCatmullRom: function (t, e, n, i, s) { r(e, n, s * (n - t), s * (i - e)); }, initNonuniformCatmullRom: function (t, e, n, i, s, a, o) { let l = (e - t) / s - (n - t) / (s + a) + (n - e) / a, c = (n - e) / a - (i - e) / (a + o) + (i - n) / o; (l *= a), (c *= a), r(e, n, l, c); }, calc: function (r) { const s = r * r; return t + e * r + n * s + i * (s * r); }, }; } gl.prototype.isArcCurve = !0; const yl = new Lt(), xl = new vl(), _l = new vl(), wl = new vl(); class bl extends ml { constructor(t = [], e = !1, n = 'centripetal', i = 0.5) { super(), (this.type = 'CatmullRomCurve3'), (this.points = t), (this.closed = e), (this.curveType = n), (this.tension = i); } getPoint(t, e = new Lt()) { const n = e, i = this.points, r = i.length, s = (r - (this.closed ? 0 : 1)) * t; let a, o, l = Math.floor(s), c = s - l; this.closed ? (l += l > 0 ? 0 : (Math.floor(Math.abs(l) / r) + 1) * r) : 0 === c && l === r - 1 && ((l = r - 2), (c = 1)), this.closed || l > 0 ? (a = i[(l - 1) % r]) : (yl.subVectors(i[0], i[1]).add(i[0]), (a = yl)); const h = i[l % r], u = i[(l + 1) % r]; if ( (this.closed || l + 2 < r ? (o = i[(l + 2) % r]) : (yl.subVectors(i[r - 1], i[r - 2]).add(i[r - 1]), (o = yl)), 'centripetal' === this.curveType || 'chordal' === this.curveType) ) { const t = 'chordal' === this.curveType ? 0.5 : 0.25; let e = Math.pow(a.distanceToSquared(h), t), n = Math.pow(h.distanceToSquared(u), t), i = Math.pow(u.distanceToSquared(o), t); n < 1e-4 && (n = 1), e < 1e-4 && (e = n), i < 1e-4 && (i = n), xl.initNonuniformCatmullRom(a.x, h.x, u.x, o.x, e, n, i), _l.initNonuniformCatmullRom(a.y, h.y, u.y, o.y, e, n, i), wl.initNonuniformCatmullRom(a.z, h.z, u.z, o.z, e, n, i); } else 'catmullrom' === this.curveType && (xl.initCatmullRom(a.x, h.x, u.x, o.x, this.tension), _l.initCatmullRom(a.y, h.y, u.y, o.y, this.tension), wl.initCatmullRom(a.z, h.z, u.z, o.z, this.tension)); return n.set(xl.calc(c), _l.calc(c), wl.calc(c)), n; } copy(t) { super.copy(t), (this.points = []); for (let e = 0, n = t.points.length; e < n; e++) { const n = t.points[e]; this.points.push(n.clone()); } return ( (this.closed = t.closed), (this.curveType = t.curveType), (this.tension = t.tension), this ); } toJSON() { const t = super.toJSON(); t.points = []; for (let e = 0, n = this.points.length; e < n; e++) { const n = this.points[e]; t.points.push(n.toArray()); } return ( (t.closed = this.closed), (t.curveType = this.curveType), (t.tension = this.tension), t ); } fromJSON(t) { super.fromJSON(t), (this.points = []); for (let e = 0, n = t.points.length; e < n; e++) { const n = t.points[e]; this.points.push(new Lt().fromArray(n)); } return ( (this.closed = t.closed), (this.curveType = t.curveType), (this.tension = t.tension), this ); } } function Ml(t, e, n, i, r) { const s = 0.5 * (i - e), a = 0.5 * (r - n), o = t * t; return ( (2 * n - 2 * i + s + a) * (t * o) + (-3 * n + 3 * i - 2 * s - a) * o + s * t + n ); } function Sl(t, e, n, i) { return ( (function (t, e) { const n = 1 - t; return n * n * e; })(t, e) + (function (t, e) { return 2 * (1 - t) * t * e; })(t, n) + (function (t, e) { return t * t * e; })(t, i) ); } function Tl(t, e, n, i, r) { return ( (function (t, e) { const n = 1 - t; return n * n * n * e; })(t, e) + (function (t, e) { const n = 1 - t; return 3 * n * n * t * e; })(t, n) + (function (t, e) { return 3 * (1 - t) * t * t * e; })(t, i) + (function (t, e) { return t * t * t * e; })(t, r) ); } bl.prototype.isCatmullRomCurve3 = !0; class El extends ml { constructor(t = new vt(), e = new vt(), n = new vt(), i = new vt()) { super(), (this.type = 'CubicBezierCurve'), (this.v0 = t), (this.v1 = e), (this.v2 = n), (this.v3 = i); } getPoint(t, e = new vt()) { const n = e, i = this.v0, r = this.v1, s = this.v2, a = this.v3; return n.set(Tl(t, i.x, r.x, s.x, a.x), Tl(t, i.y, r.y, s.y, a.y)), n; } copy(t) { return ( super.copy(t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this.v3.copy(t.v3), this ); } toJSON() { const t = super.toJSON(); return ( (t.v0 = this.v0.toArray()), (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), (t.v3 = this.v3.toArray()), t ); } fromJSON(t) { return ( super.fromJSON(t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this.v3.fromArray(t.v3), this ); } } El.prototype.isCubicBezierCurve = !0; class Al extends ml { constructor(t = new Lt(), e = new Lt(), n = new Lt(), i = new Lt()) { super(), (this.type = 'CubicBezierCurve3'), (this.v0 = t), (this.v1 = e), (this.v2 = n), (this.v3 = i); } getPoint(t, e = new Lt()) { const n = e, i = this.v0, r = this.v1, s = this.v2, a = this.v3; return ( n.set( Tl(t, i.x, r.x, s.x, a.x), Tl(t, i.y, r.y, s.y, a.y), Tl(t, i.z, r.z, s.z, a.z) ), n ); } copy(t) { return ( super.copy(t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this.v3.copy(t.v3), this ); } toJSON() { const t = super.toJSON(); return ( (t.v0 = this.v0.toArray()), (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), (t.v3 = this.v3.toArray()), t ); } fromJSON(t) { return ( super.fromJSON(t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this.v3.fromArray(t.v3), this ); } } Al.prototype.isCubicBezierCurve3 = !0; class Ll extends ml { constructor(t = new vt(), e = new vt()) { super(), (this.type = 'LineCurve'), (this.v1 = t), (this.v2 = e); } getPoint(t, e = new vt()) { const n = e; return ( 1 === t ? n.copy(this.v2) : (n.copy(this.v2).sub(this.v1), n.multiplyScalar(t).add(this.v1)), n ); } getPointAt(t, e) { return this.getPoint(t, e); } getTangent(t, e) { const n = e || new vt(); return n.copy(this.v2).sub(this.v1).normalize(), n; } copy(t) { return super.copy(t), this.v1.copy(t.v1), this.v2.copy(t.v2), this; } toJSON() { const t = super.toJSON(); return (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), t; } fromJSON(t) { return ( super.fromJSON(t), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this ); } } Ll.prototype.isLineCurve = !0; class Rl extends ml { constructor(t = new Lt(), e = new Lt()) { super(), (this.type = 'LineCurve3'), (this.isLineCurve3 = !0), (this.v1 = t), (this.v2 = e); } getPoint(t, e = new Lt()) { const n = e; return ( 1 === t ? n.copy(this.v2) : (n.copy(this.v2).sub(this.v1), n.multiplyScalar(t).add(this.v1)), n ); } getPointAt(t, e) { return this.getPoint(t, e); } copy(t) { return super.copy(t), this.v1.copy(t.v1), this.v2.copy(t.v2), this; } toJSON() { const t = super.toJSON(); return (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), t; } fromJSON(t) { return ( super.fromJSON(t), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this ); } } class Cl extends ml { constructor(t = new vt(), e = new vt(), n = new vt()) { super(), (this.type = 'QuadraticBezierCurve'), (this.v0 = t), (this.v1 = e), (this.v2 = n); } getPoint(t, e = new vt()) { const n = e, i = this.v0, r = this.v1, s = this.v2; return n.set(Sl(t, i.x, r.x, s.x), Sl(t, i.y, r.y, s.y)), n; } copy(t) { return ( super.copy(t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this ); } toJSON() { const t = super.toJSON(); return ( (t.v0 = this.v0.toArray()), (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), t ); } fromJSON(t) { return ( super.fromJSON(t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this ); } } Cl.prototype.isQuadraticBezierCurve = !0; class Pl extends ml { constructor(t = new Lt(), e = new Lt(), n = new Lt()) { super(), (this.type = 'QuadraticBezierCurve3'), (this.v0 = t), (this.v1 = e), (this.v2 = n); } getPoint(t, e = new Lt()) { const n = e, i = this.v0, r = this.v1, s = this.v2; return ( n.set(Sl(t, i.x, r.x, s.x), Sl(t, i.y, r.y, s.y), Sl(t, i.z, r.z, s.z)), n ); } copy(t) { return ( super.copy(t), this.v0.copy(t.v0), this.v1.copy(t.v1), this.v2.copy(t.v2), this ); } toJSON() { const t = super.toJSON(); return ( (t.v0 = this.v0.toArray()), (t.v1 = this.v1.toArray()), (t.v2 = this.v2.toArray()), t ); } fromJSON(t) { return ( super.fromJSON(t), this.v0.fromArray(t.v0), this.v1.fromArray(t.v1), this.v2.fromArray(t.v2), this ); } } Pl.prototype.isQuadraticBezierCurve3 = !0; class Dl extends ml { constructor(t = []) { super(), (this.type = 'SplineCurve'), (this.points = t); } getPoint(t, e = new vt()) { const n = e, i = this.points, r = (i.length - 1) * t, s = Math.floor(r), a = r - s, o = i[0 === s ? s : s - 1], l = i[s], c = i[s > i.length - 2 ? i.length - 1 : s + 1], h = i[s > i.length - 3 ? i.length - 1 : s + 2]; return n.set(Ml(a, o.x, l.x, c.x, h.x), Ml(a, o.y, l.y, c.y, h.y)), n; } copy(t) { super.copy(t), (this.points = []); for (let e = 0, n = t.points.length; e < n; e++) { const n = t.points[e]; this.points.push(n.clone()); } return this; } toJSON() { const t = super.toJSON(); t.points = []; for (let e = 0, n = this.points.length; e < n; e++) { const n = this.points[e]; t.points.push(n.toArray()); } return t; } fromJSON(t) { super.fromJSON(t), (this.points = []); for (let e = 0, n = t.points.length; e < n; e++) { const n = t.points[e]; this.points.push(new vt().fromArray(n)); } return this; } } Dl.prototype.isSplineCurve = !0; var Il = Object.freeze({ __proto__: null, ArcCurve: gl, CatmullRomCurve3: bl, CubicBezierCurve: El, CubicBezierCurve3: Al, EllipseCurve: fl, LineCurve: Ll, LineCurve3: Rl, QuadraticBezierCurve: Cl, QuadraticBezierCurve3: Pl, SplineCurve: Dl, }); class Nl extends ml { constructor() { super(), (this.type = 'CurvePath'), (this.curves = []), (this.autoClose = !1); } add(t) { this.curves.push(t); } closePath() { const t = this.curves[0].getPoint(0), e = this.curves[this.curves.length - 1].getPoint(1); t.equals(e) || this.curves.push(new Ll(e, t)); } getPoint(t) { const e = t * this.getLength(), n = this.getCurveLengths(); let i = 0; for (; i < n.length; ) { if (n[i] >= e) { const t = n[i] - e, r = this.curves[i], s = r.getLength(), a = 0 === s ? 0 : 1 - t / s; return r.getPointAt(a); } i++; } return null; } getLength() { const t = this.getCurveLengths(); return t[t.length - 1]; } updateArcLengths() { (this.needsUpdate = !0), (this.cacheLengths = null), this.getCurveLengths(); } getCurveLengths() { if (this.cacheLengths && this.cacheLengths.length === this.curves.length) return this.cacheLengths; const t = []; let e = 0; for (let n = 0, i = this.curves.length; n < i; n++) (e += this.curves[n].getLength()), t.push(e); return (this.cacheLengths = t), t; } getSpacedPoints(t = 40) { const e = []; for (let n = 0; n <= t; n++) e.push(this.getPoint(n / t)); return this.autoClose && e.push(e[0]), e; } getPoints(t = 12) { const e = []; let n; for (let i = 0, r = this.curves; i < r.length; i++) { const s = r[i], a = s && s.isEllipseCurve ? 2 * t : s && (s.isLineCurve || s.isLineCurve3) ? 1 : s && s.isSplineCurve ? t * s.points.length : t, o = s.getPoints(a); for (let t = 0; t < o.length; t++) { const i = o[t]; (n && n.equals(i)) || (e.push(i), (n = i)); } } return ( this.autoClose && e.length > 1 && !e[e.length - 1].equals(e[0]) && e.push(e[0]), e ); } copy(t) { super.copy(t), (this.curves = []); for (let e = 0, n = t.curves.length; e < n; e++) { const n = t.curves[e]; this.curves.push(n.clone()); } return (this.autoClose = t.autoClose), this; } toJSON() { const t = super.toJSON(); (t.autoClose = this.autoClose), (t.curves = []); for (let e = 0, n = this.curves.length; e < n; e++) { const n = this.curves[e]; t.curves.push(n.toJSON()); } return t; } fromJSON(t) { super.fromJSON(t), (this.autoClose = t.autoClose), (this.curves = []); for (let e = 0, n = t.curves.length; e < n; e++) { const n = t.curves[e]; this.curves.push(new Il[n.type]().fromJSON(n)); } return this; } } class Bl extends Nl { constructor(t) { super(), (this.type = 'Path'), (this.currentPoint = new vt()), t && this.setFromPoints(t); } setFromPoints(t) { this.moveTo(t[0].x, t[0].y); for (let e = 1, n = t.length; e < n; e++) this.lineTo(t[e].x, t[e].y); return this; } moveTo(t, e) { return this.currentPoint.set(t, e), this; } lineTo(t, e) { const n = new Ll(this.currentPoint.clone(), new vt(t, e)); return this.curves.push(n), this.currentPoint.set(t, e), this; } quadraticCurveTo(t, e, n, i) { const r = new Cl(this.currentPoint.clone(), new vt(t, e), new vt(n, i)); return this.curves.push(r), this.currentPoint.set(n, i), this; } bezierCurveTo(t, e, n, i, r, s) { const a = new El( this.currentPoint.clone(), new vt(t, e), new vt(n, i), new vt(r, s) ); return this.curves.push(a), this.currentPoint.set(r, s), this; } splineThru(t) { const e = [this.currentPoint.clone()].concat(t), n = new Dl(e); return this.curves.push(n), this.currentPoint.copy(t[t.length - 1]), this; } arc(t, e, n, i, r, s) { const a = this.currentPoint.x, o = this.currentPoint.y; return this.absarc(t + a, e + o, n, i, r, s), this; } absarc(t, e, n, i, r, s) { return this.absellipse(t, e, n, n, i, r, s), this; } ellipse(t, e, n, i, r, s, a, o) { const l = this.currentPoint.x, c = this.currentPoint.y; return this.absellipse(t + l, e + c, n, i, r, s, a, o), this; } absellipse(t, e, n, i, r, s, a, o) { const l = new fl(t, e, n, i, r, s, a, o); if (this.curves.length > 0) { const t = l.getPoint(0); t.equals(this.currentPoint) || this.lineTo(t.x, t.y); } this.curves.push(l); const c = l.getPoint(1); return this.currentPoint.copy(c), this; } copy(t) { return super.copy(t), this.currentPoint.copy(t.currentPoint), this; } toJSON() { const t = super.toJSON(); return (t.currentPoint = this.currentPoint.toArray()), t; } fromJSON(t) { return ( super.fromJSON(t), this.currentPoint.fromArray(t.currentPoint), this ); } } class zl extends Bl { constructor(t) { super(t), (this.uuid = ct()), (this.type = 'Shape'), (this.holes = []); } getPointsHoles(t) { const e = []; for (let n = 0, i = this.holes.length; n < i; n++) e[n] = this.holes[n].getPoints(t); return e; } extractPoints(t) { return { shape: this.getPoints(t), holes: this.getPointsHoles(t) }; } copy(t) { super.copy(t), (this.holes = []); for (let e = 0, n = t.holes.length; e < n; e++) { const n = t.holes[e]; this.holes.push(n.clone()); } return this; } toJSON() { const t = super.toJSON(); (t.uuid = this.uuid), (t.holes = []); for (let e = 0, n = this.holes.length; e < n; e++) { const n = this.holes[e]; t.holes.push(n.toJSON()); } return t; } fromJSON(t) { super.fromJSON(t), (this.uuid = t.uuid), (this.holes = []); for (let e = 0, n = t.holes.length; e < n; e++) { const n = t.holes[e]; this.holes.push(new Bl().fromJSON(n)); } return this; } } class Fl extends Ce { constructor(t, e = 1) { super(), (this.type = 'Light'), (this.color = new tn(t)), (this.intensity = e); } dispose() {} copy(t) { return ( super.copy(t), this.color.copy(t.color), (this.intensity = t.intensity), this ); } toJSON(t) { const e = super.toJSON(t); return ( (e.object.color = this.color.getHex()), (e.object.intensity = this.intensity), void 0 !== this.groundColor && (e.object.groundColor = this.groundColor.getHex()), void 0 !== this.distance && (e.object.distance = this.distance), void 0 !== this.angle && (e.object.angle = this.angle), void 0 !== this.decay && (e.object.decay = this.decay), void 0 !== this.penumbra && (e.object.penumbra = this.penumbra), void 0 !== this.shadow && (e.object.shadow = this.shadow.toJSON()), e ); } } Fl.prototype.isLight = !0; class Ol extends Fl { constructor(t, e, n) { super(t, n), (this.type = 'HemisphereLight'), this.position.copy(Ce.DefaultUp), this.updateMatrix(), (this.groundColor = new tn(e)); } copy(t) { return ( Fl.prototype.copy.call(this, t), this.groundColor.copy(t.groundColor), this ); } } Ol.prototype.isHemisphereLight = !0; const Hl = new se(), Gl = new Lt(), Ul = new Lt(); class kl { constructor(t) { (this.camera = t), (this.bias = 0), (this.normalBias = 0), (this.radius = 1), (this.mapSize = new vt(512, 512)), (this.map = null), (this.mapPass = null), (this.matrix = new se()), (this.autoUpdate = !0), (this.needsUpdate = !1), (this._frustum = new ai()), (this._frameExtents = new vt(1, 1)), (this._viewportCount = 1), (this._viewports = [new St(0, 0, 1, 1)]); } getViewportCount() { return this._viewportCount; } getFrustum() { return this._frustum; } updateMatrices(t) { const e = this.camera, n = this.matrix; Gl.setFromMatrixPosition(t.matrixWorld), e.position.copy(Gl), Ul.setFromMatrixPosition(t.target.matrixWorld), e.lookAt(Ul), e.updateMatrixWorld(), Hl.multiplyMatrices(e.projectionMatrix, e.matrixWorldInverse), this._frustum.setFromProjectionMatrix(Hl), n.set(0.5, 0, 0, 0.5, 0, 0.5, 0, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0, 1), n.multiply(e.projectionMatrix), n.multiply(e.matrixWorldInverse); } getViewport(t) { return this._viewports[t]; } getFrameExtents() { return this._frameExtents; } dispose() { this.map && this.map.dispose(), this.mapPass && this.mapPass.dispose(); } copy(t) { return ( (this.camera = t.camera.clone()), (this.bias = t.bias), (this.radius = t.radius), this.mapSize.copy(t.mapSize), this ); } clone() { return new this.constructor().copy(this); } toJSON() { const t = {}; return ( 0 !== this.bias && (t.bias = this.bias), 0 !== this.normalBias && (t.normalBias = this.normalBias), 1 !== this.radius && (t.radius = this.radius), (512 === this.mapSize.x && 512 === this.mapSize.y) || (t.mapSize = this.mapSize.toArray()), (t.camera = this.camera.toJSON(!1).object), delete t.camera.matrix, t ); } } class Vl extends kl { constructor() { super(new Kn(50, 1, 0.5, 500)), (this.focus = 1); } updateMatrices(t) { const e = this.camera, n = 2 * lt * t.angle * this.focus, i = this.mapSize.width / this.mapSize.height, r = t.distance || e.far; (n === e.fov && i === e.aspect && r === e.far) || ((e.fov = n), (e.aspect = i), (e.far = r), e.updateProjectionMatrix()), super.updateMatrices(t); } copy(t) { return super.copy(t), (this.focus = t.focus), this; } } Vl.prototype.isSpotLightShadow = !0; class Wl extends Fl { constructor(t, e, n = 0, i = Math.PI / 3, r = 0, s = 1) { super(t, e), (this.type = 'SpotLight'), this.position.copy(Ce.DefaultUp), this.updateMatrix(), (this.target = new Ce()), (this.distance = n), (this.angle = i), (this.penumbra = r), (this.decay = s), (this.shadow = new Vl()); } get power() { return this.intensity * Math.PI; } set power(t) { this.intensity = t / Math.PI; } dispose() { this.shadow.dispose(); } copy(t) { return ( super.copy(t), (this.distance = t.distance), (this.angle = t.angle), (this.penumbra = t.penumbra), (this.decay = t.decay), (this.target = t.target.clone()), (this.shadow = t.shadow.clone()), this ); } } Wl.prototype.isSpotLight = !0; const jl = new se(), ql = new Lt(), Xl = new Lt(); class Yl extends kl { constructor() { super(new Kn(90, 1, 0.5, 500)), (this._frameExtents = new vt(4, 2)), (this._viewportCount = 6), (this._viewports = [ new St(2, 1, 1, 1), new St(0, 1, 1, 1), new St(3, 1, 1, 1), new St(1, 1, 1, 1), new St(3, 0, 1, 1), new St(1, 0, 1, 1), ]), (this._cubeDirections = [ new Lt(1, 0, 0), new Lt(-1, 0, 0), new Lt(0, 0, 1), new Lt(0, 0, -1), new Lt(0, 1, 0), new Lt(0, -1, 0), ]), (this._cubeUps = [ new Lt(0, 1, 0), new Lt(0, 1, 0), new Lt(0, 1, 0), new Lt(0, 1, 0), new Lt(0, 0, 1), new Lt(0, 0, -1), ]); } updateMatrices(t, e = 0) { const n = this.camera, i = this.matrix, r = t.distance || n.far; r !== n.far && ((n.far = r), n.updateProjectionMatrix()), ql.setFromMatrixPosition(t.matrixWorld), n.position.copy(ql), Xl.copy(n.position), Xl.add(this._cubeDirections[e]), n.up.copy(this._cubeUps[e]), n.lookAt(Xl), n.updateMatrixWorld(), i.makeTranslation(-ql.x, -ql.y, -ql.z), jl.multiplyMatrices(n.projectionMatrix, n.matrixWorldInverse), this._frustum.setFromProjectionMatrix(jl); } } Yl.prototype.isPointLightShadow = !0; class Zl extends Fl { constructor(t, e, n = 0, i = 1) { super(t, e), (this.type = 'PointLight'), (this.distance = n), (this.decay = i), (this.shadow = new Yl()); } get power() { return 4 * this.intensity * Math.PI; } set power(t) { this.intensity = t / (4 * Math.PI); } dispose() { this.shadow.dispose(); } copy(t) { return ( super.copy(t), (this.distance = t.distance), (this.decay = t.decay), (this.shadow = t.shadow.clone()), this ); } } Zl.prototype.isPointLight = !0; class Jl extends Qn { constructor(t = -1, e = 1, n = 1, i = -1, r = 0.1, s = 2e3) { super(), (this.type = 'OrthographicCamera'), (this.zoom = 1), (this.view = null), (this.left = t), (this.right = e), (this.top = n), (this.bottom = i), (this.near = r), (this.far = s), this.updateProjectionMatrix(); } copy(t, e) { return ( super.copy(t, e), (this.left = t.left), (this.right = t.right), (this.top = t.top), (this.bottom = t.bottom), (this.near = t.near), (this.far = t.far), (this.zoom = t.zoom), (this.view = null === t.view ? null : Object.assign({}, t.view)), this ); } setViewOffset(t, e, n, i, r, s) { null === this.view && (this.view = { enabled: !0, fullWidth: 1, fullHeight: 1, offsetX: 0, offsetY: 0, width: 1, height: 1, }), (this.view.enabled = !0), (this.view.fullWidth = t), (this.view.fullHeight = e), (this.view.offsetX = n), (this.view.offsetY = i), (this.view.width = r), (this.view.height = s), this.updateProjectionMatrix(); } clearViewOffset() { null !== this.view && (this.view.enabled = !1), this.updateProjectionMatrix(); } updateProjectionMatrix() { const t = (this.right - this.left) / (2 * this.zoom), e = (this.top - this.bottom) / (2 * this.zoom), n = (this.right + this.left) / 2, i = (this.top + this.bottom) / 2; let r = n - t, s = n + t, a = i + e, o = i - e; if (null !== this.view && this.view.enabled) { const t = (this.right - this.left) / this.view.fullWidth / this.zoom, e = (this.top - this.bottom) / this.view.fullHeight / this.zoom; (r += t * this.view.offsetX), (s = r + t * this.view.width), (a -= e * this.view.offsetY), (o = a - e * this.view.height); } this.projectionMatrix.makeOrthographic(r, s, a, o, this.near, this.far), this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); } toJSON(t) { const e = super.toJSON(t); return ( (e.object.zoom = this.zoom), (e.object.left = this.left), (e.object.right = this.right), (e.object.top = this.top), (e.object.bottom = this.bottom), (e.object.near = this.near), (e.object.far = this.far), null !== this.view && (e.object.view = Object.assign({}, this.view)), e ); } } Jl.prototype.isOrthographicCamera = !0; class Ql extends kl { constructor() { super(new Jl(-5, 5, 5, -5, 0.5, 500)); } } Ql.prototype.isDirectionalLightShadow = !0; class Kl extends Fl { constructor(t, e) { super(t, e), (this.type = 'DirectionalLight'), this.position.copy(Ce.DefaultUp), this.updateMatrix(), (this.target = new Ce()), (this.shadow = new Ql()); } dispose() { this.shadow.dispose(); } copy(t) { return ( super.copy(t), (this.target = t.target.clone()), (this.shadow = t.shadow.clone()), this ); } } Kl.prototype.isDirectionalLight = !0; class $l extends Fl { constructor(t, e) { super(t, e), (this.type = 'AmbientLight'); } } $l.prototype.isAmbientLight = !0; class tc extends Fl { constructor(t, e, n = 10, i = 10) { super(t, e), (this.type = 'RectAreaLight'), (this.width = n), (this.height = i); } copy(t) { return ( super.copy(t), (this.width = t.width), (this.height = t.height), this ); } toJSON(t) { const e = super.toJSON(t); return (e.object.width = this.width), (e.object.height = this.height), e; } } tc.prototype.isRectAreaLight = !0; class ec { constructor() { this.coefficients = []; for (let t = 0; t < 9; t++) this.coefficients.push(new Lt()); } set(t) { for (let e = 0; e < 9; e++) this.coefficients[e].copy(t[e]); return this; } zero() { for (let t = 0; t < 9; t++) this.coefficients[t].set(0, 0, 0); return this; } getAt(t, e) { const n = t.x, i = t.y, r = t.z, s = this.coefficients; return ( e.copy(s[0]).multiplyScalar(0.282095), e.addScaledVector(s[1], 0.488603 * i), e.addScaledVector(s[2], 0.488603 * r), e.addScaledVector(s[3], 0.488603 * n), e.addScaledVector(s[4], n * i * 1.092548), e.addScaledVector(s[5], i * r * 1.092548), e.addScaledVector(s[6], 0.315392 * (3 * r * r - 1)), e.addScaledVector(s[7], n * r * 1.092548), e.addScaledVector(s[8], 0.546274 * (n * n - i * i)), e ); } getIrradianceAt(t, e) { const n = t.x, i = t.y, r = t.z, s = this.coefficients; return ( e.copy(s[0]).multiplyScalar(0.886227), e.addScaledVector(s[1], 1.023328 * i), e.addScaledVector(s[2], 1.023328 * r), e.addScaledVector(s[3], 1.023328 * n), e.addScaledVector(s[4], 0.858086 * n * i), e.addScaledVector(s[5], 0.858086 * i * r), e.addScaledVector(s[6], 0.743125 * r * r - 0.247708), e.addScaledVector(s[7], 0.858086 * n * r), e.addScaledVector(s[8], 0.429043 * (n * n - i * i)), e ); } add(t) { for (let e = 0; e < 9; e++) this.coefficients[e].add(t.coefficients[e]); return this; } addScaledSH(t, e) { for (let n = 0; n < 9; n++) this.coefficients[n].addScaledVector(t.coefficients[n], e); return this; } scale(t) { for (let e = 0; e < 9; e++) this.coefficients[e].multiplyScalar(t); return this; } lerp(t, e) { for (let n = 0; n < 9; n++) this.coefficients[n].lerp(t.coefficients[n], e); return this; } equals(t) { for (let e = 0; e < 9; e++) if (!this.coefficients[e].equals(t.coefficients[e])) return !1; return !0; } copy(t) { return this.set(t.coefficients); } clone() { return new this.constructor().copy(this); } fromArray(t, e = 0) { const n = this.coefficients; for (let i = 0; i < 9; i++) n[i].fromArray(t, e + 3 * i); return this; } toArray(t = [], e = 0) { const n = this.coefficients; for (let i = 0; i < 9; i++) n[i].toArray(t, e + 3 * i); return t; } static getBasisAt(t, e) { const n = t.x, i = t.y, r = t.z; (e[0] = 0.282095), (e[1] = 0.488603 * i), (e[2] = 0.488603 * r), (e[3] = 0.488603 * n), (e[4] = 1.092548 * n * i), (e[5] = 1.092548 * i * r), (e[6] = 0.315392 * (3 * r * r - 1)), (e[7] = 1.092548 * n * r), (e[8] = 0.546274 * (n * n - i * i)); } } ec.prototype.isSphericalHarmonics3 = !0; class nc extends Fl { constructor(t = new ec(), e = 1) { super(void 0, e), (this.sh = t); } copy(t) { return super.copy(t), this.sh.copy(t.sh), this; } fromJSON(t) { return (this.intensity = t.intensity), this.sh.fromArray(t.sh), this; } toJSON(t) { const e = super.toJSON(t); return (e.object.sh = this.sh.toArray()), e; } } nc.prototype.isLightProbe = !0; class ic extends ol { constructor(t) { super(t), (this.textures = {}); } load(t, e, n, i) { const r = this, s = new cl(r.manager); s.setPath(r.path), s.setRequestHeader(r.requestHeader), s.setWithCredentials(r.withCredentials), s.load( t, function (n) { try { e(r.parse(JSON.parse(n))); } catch (e) { i ? i(e) : console.error(e), r.manager.itemError(t); } }, n, i ); } parse(t) { const e = this.textures; function n(t) { return ( void 0 === e[t] && console.warn('THREE.MaterialLoader: Undefined texture', t), e[t] ); } const i = new ko[t.type](); if ( (void 0 !== t.uuid && (i.uuid = t.uuid), void 0 !== t.name && (i.name = t.name), void 0 !== t.color && void 0 !== i.color && i.color.setHex(t.color), void 0 !== t.roughness && (i.roughness = t.roughness), void 0 !== t.metalness && (i.metalness = t.metalness), void 0 !== t.sheen && (i.sheen = new tn().setHex(t.sheen)), void 0 !== t.emissive && void 0 !== i.emissive && i.emissive.setHex(t.emissive), void 0 !== t.specular && void 0 !== i.specular && i.specular.setHex(t.specular), void 0 !== t.shininess && (i.shininess = t.shininess), void 0 !== t.clearcoat && (i.clearcoat = t.clearcoat), void 0 !== t.clearcoatRoughness && (i.clearcoatRoughness = t.clearcoatRoughness), void 0 !== t.fog && (i.fog = t.fog), void 0 !== t.flatShading && (i.flatShading = t.flatShading), void 0 !== t.blending && (i.blending = t.blending), void 0 !== t.combine && (i.combine = t.combine), void 0 !== t.side && (i.side = t.side), void 0 !== t.shadowSide && (i.shadowSide = t.shadowSide), void 0 !== t.opacity && (i.opacity = t.opacity), void 0 !== t.transparent && (i.transparent = t.transparent), void 0 !== t.alphaTest && (i.alphaTest = t.alphaTest), void 0 !== t.depthTest && (i.depthTest = t.depthTest), void 0 !== t.depthWrite && (i.depthWrite = t.depthWrite), void 0 !== t.colorWrite && (i.colorWrite = t.colorWrite), void 0 !== t.stencilWrite && (i.stencilWrite = t.stencilWrite), void 0 !== t.stencilWriteMask && (i.stencilWriteMask = t.stencilWriteMask), void 0 !== t.stencilFunc && (i.stencilFunc = t.stencilFunc), void 0 !== t.stencilRef && (i.stencilRef = t.stencilRef), void 0 !== t.stencilFuncMask && (i.stencilFuncMask = t.stencilFuncMask), void 0 !== t.stencilFail && (i.stencilFail = t.stencilFail), void 0 !== t.stencilZFail && (i.stencilZFail = t.stencilZFail), void 0 !== t.stencilZPass && (i.stencilZPass = t.stencilZPass), void 0 !== t.wireframe && (i.wireframe = t.wireframe), void 0 !== t.wireframeLinewidth && (i.wireframeLinewidth = t.wireframeLinewidth), void 0 !== t.wireframeLinecap && (i.wireframeLinecap = t.wireframeLinecap), void 0 !== t.wireframeLinejoin && (i.wireframeLinejoin = t.wireframeLinejoin), void 0 !== t.rotation && (i.rotation = t.rotation), 1 !== t.linewidth && (i.linewidth = t.linewidth), void 0 !== t.dashSize && (i.dashSize = t.dashSize), void 0 !== t.gapSize && (i.gapSize = t.gapSize), void 0 !== t.scale && (i.scale = t.scale), void 0 !== t.polygonOffset && (i.polygonOffset = t.polygonOffset), void 0 !== t.polygonOffsetFactor && (i.polygonOffsetFactor = t.polygonOffsetFactor), void 0 !== t.polygonOffsetUnits && (i.polygonOffsetUnits = t.polygonOffsetUnits), void 0 !== t.skinning && (i.skinning = t.skinning), void 0 !== t.morphTargets && (i.morphTargets = t.morphTargets), void 0 !== t.morphNormals && (i.morphNormals = t.morphNormals), void 0 !== t.dithering && (i.dithering = t.dithering), void 0 !== t.alphaToCoverage && (i.alphaToCoverage = t.alphaToCoverage), void 0 !== t.premultipliedAlpha && (i.premultipliedAlpha = t.premultipliedAlpha), void 0 !== t.vertexTangents && (i.vertexTangents = t.vertexTangents), void 0 !== t.visible && (i.visible = t.visible), void 0 !== t.toneMapped && (i.toneMapped = t.toneMapped), void 0 !== t.userData && (i.userData = t.userData), void 0 !== t.vertexColors && ('number' == typeof t.vertexColors ? (i.vertexColors = t.vertexColors > 0) : (i.vertexColors = t.vertexColors)), void 0 !== t.uniforms) ) for (const e in t.uniforms) { const r = t.uniforms[e]; switch (((i.uniforms[e] = {}), r.type)) { case 't': i.uniforms[e].value = n(r.value); break; case 'c': i.uniforms[e].value = new tn().setHex(r.value); break; case 'v2': i.uniforms[e].value = new vt().fromArray(r.value); break; case 'v3': i.uniforms[e].value = new Lt().fromArray(r.value); break; case 'v4': i.uniforms[e].value = new St().fromArray(r.value); break; case 'm3': i.uniforms[e].value = new yt().fromArray(r.value); break; case 'm4': i.uniforms[e].value = new se().fromArray(r.value); break; default: i.uniforms[e].value = r.value; } } if ( (void 0 !== t.defines && (i.defines = t.defines), void 0 !== t.vertexShader && (i.vertexShader = t.vertexShader), void 0 !== t.fragmentShader && (i.fragmentShader = t.fragmentShader), void 0 !== t.extensions) ) for (const e in t.extensions) i.extensions[e] = t.extensions[e]; if ( (void 0 !== t.shading && (i.flatShading = 1 === t.shading), void 0 !== t.size && (i.size = t.size), void 0 !== t.sizeAttenuation && (i.sizeAttenuation = t.sizeAttenuation), void 0 !== t.map && (i.map = n(t.map)), void 0 !== t.matcap && (i.matcap = n(t.matcap)), void 0 !== t.alphaMap && (i.alphaMap = n(t.alphaMap)), void 0 !== t.bumpMap && (i.bumpMap = n(t.bumpMap)), void 0 !== t.bumpScale && (i.bumpScale = t.bumpScale), void 0 !== t.normalMap && (i.normalMap = n(t.normalMap)), void 0 !== t.normalMapType && (i.normalMapType = t.normalMapType), void 0 !== t.normalScale) ) { let e = t.normalScale; !1 === Array.isArray(e) && (e = [e, e]), (i.normalScale = new vt().fromArray(e)); } return ( void 0 !== t.displacementMap && (i.displacementMap = n(t.displacementMap)), void 0 !== t.displacementScale && (i.displacementScale = t.displacementScale), void 0 !== t.displacementBias && (i.displacementBias = t.displacementBias), void 0 !== t.roughnessMap && (i.roughnessMap = n(t.roughnessMap)), void 0 !== t.metalnessMap && (i.metalnessMap = n(t.metalnessMap)), void 0 !== t.emissiveMap && (i.emissiveMap = n(t.emissiveMap)), void 0 !== t.emissiveIntensity && (i.emissiveIntensity = t.emissiveIntensity), void 0 !== t.specularMap && (i.specularMap = n(t.specularMap)), void 0 !== t.envMap && (i.envMap = n(t.envMap)), void 0 !== t.envMapIntensity && (i.envMapIntensity = t.envMapIntensity), void 0 !== t.reflectivity && (i.reflectivity = t.reflectivity), void 0 !== t.refractionRatio && (i.refractionRatio = t.refractionRatio), void 0 !== t.lightMap && (i.lightMap = n(t.lightMap)), void 0 !== t.lightMapIntensity && (i.lightMapIntensity = t.lightMapIntensity), void 0 !== t.aoMap && (i.aoMap = n(t.aoMap)), void 0 !== t.aoMapIntensity && (i.aoMapIntensity = t.aoMapIntensity), void 0 !== t.gradientMap && (i.gradientMap = n(t.gradientMap)), void 0 !== t.clearcoatMap && (i.clearcoatMap = n(t.clearcoatMap)), void 0 !== t.clearcoatRoughnessMap && (i.clearcoatRoughnessMap = n(t.clearcoatRoughnessMap)), void 0 !== t.clearcoatNormalMap && (i.clearcoatNormalMap = n(t.clearcoatNormalMap)), void 0 !== t.clearcoatNormalScale && (i.clearcoatNormalScale = new vt().fromArray(t.clearcoatNormalScale)), void 0 !== t.transmission && (i.transmission = t.transmission), void 0 !== t.transmissionMap && (i.transmissionMap = n(t.transmissionMap)), i ); } setTextures(t) { return (this.textures = t), this; } } class rc { static decodeText(t) { if ('undefined' != typeof TextDecoder) return new TextDecoder().decode(t); let e = ''; for (let n = 0, i = t.length; n < i; n++) e += String.fromCharCode(t[n]); try { return decodeURIComponent(escape(e)); } catch (t) { return e; } } static extractUrlBase(t) { const e = t.lastIndexOf('/'); return -1 === e ? './' : t.substr(0, e + 1); } } class sc extends En { constructor() { super(), (this.type = 'InstancedBufferGeometry'), (this.instanceCount = 1 / 0); } copy(t) { return super.copy(t), (this.instanceCount = t.instanceCount), this; } clone() { return new this.constructor().copy(this); } toJSON() { const t = super.toJSON(this); return ( (t.instanceCount = this.instanceCount), (t.isInstancedBufferGeometry = !0), t ); } } sc.prototype.isInstancedBufferGeometry = !0; class ac extends sn { constructor(t, e, n, i) { 'number' == typeof n && ((i = n), (n = !1), console.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' )), super(t, e, n), (this.meshPerAttribute = i || 1); } copy(t) { return super.copy(t), (this.meshPerAttribute = t.meshPerAttribute), this; } toJSON() { const t = super.toJSON(); return ( (t.meshPerAttribute = this.meshPerAttribute), (t.isInstancedBufferAttribute = !0), t ); } } ac.prototype.isInstancedBufferAttribute = !0; class oc extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = this, s = new cl(r.manager); s.setPath(r.path), s.setRequestHeader(r.requestHeader), s.setWithCredentials(r.withCredentials), s.load( t, function (n) { try { e(r.parse(JSON.parse(n))); } catch (e) { i ? i(e) : console.error(e), r.manager.itemError(t); } }, n, i ); } parse(t) { const e = {}, n = {}; function i(t, i) { if (void 0 !== e[i]) return e[i]; const r = t.interleavedBuffers[i], s = (function (t, e) { if (void 0 !== n[e]) return n[e]; const i = t.arrayBuffers[e], r = new Uint32Array(i).buffer; return (n[e] = r), r; })(t, r.buffer), a = yn(r.type, s), o = new Es(a, r.stride); return (o.uuid = r.uuid), (e[i] = o), o; } const r = t.isInstancedBufferGeometry ? new sc() : new En(), s = t.data.index; if (void 0 !== s) { const t = yn(s.type, s.array); r.setIndex(new sn(t, 1)); } const a = t.data.attributes; for (const e in a) { const n = a[e]; let s; if (n.isInterleavedBufferAttribute) { const e = i(t.data, n.data); s = new Ls(e, n.itemSize, n.offset, n.normalized); } else { const t = yn(n.type, n.array); s = new (n.isInstancedBufferAttribute ? ac : sn)( t, n.itemSize, n.normalized ); } void 0 !== n.name && (s.name = n.name), void 0 !== n.usage && s.setUsage(n.usage), void 0 !== n.updateRange && ((s.updateRange.offset = n.updateRange.offset), (s.updateRange.count = n.updateRange.count)), r.setAttribute(e, s); } const o = t.data.morphAttributes; if (o) for (const e in o) { const n = o[e], s = []; for (let e = 0, r = n.length; e < r; e++) { const r = n[e]; let a; if (r.isInterleavedBufferAttribute) { const e = i(t.data, r.data); a = new Ls(e, r.itemSize, r.offset, r.normalized); } else { const t = yn(r.type, r.array); a = new sn(t, r.itemSize, r.normalized); } void 0 !== r.name && (a.name = r.name), s.push(a); } r.morphAttributes[e] = s; } t.data.morphTargetsRelative && (r.morphTargetsRelative = !0); const l = t.data.groups || t.data.drawcalls || t.data.offsets; if (void 0 !== l) for (let t = 0, e = l.length; t !== e; ++t) { const e = l[t]; r.addGroup(e.start, e.count, e.materialIndex); } const c = t.data.boundingSphere; if (void 0 !== c) { const t = new Lt(); void 0 !== c.center && t.fromArray(c.center), (r.boundingSphere = new Jt(t, c.radius)); } return ( t.name && (r.name = t.name), t.userData && (r.userData = t.userData), r ); } } const lc = { UVMapping: i, CubeReflectionMapping: r, CubeRefractionMapping: s, EquirectangularReflectionMapping: a, EquirectangularRefractionMapping: o, CubeUVReflectionMapping: l, CubeUVRefractionMapping: c, }, cc = { RepeatWrapping: h, ClampToEdgeWrapping: u, MirroredRepeatWrapping: d, }, hc = { NearestFilter: p, NearestMipmapNearestFilter: m, NearestMipmapLinearFilter: f, LinearFilter: g, LinearMipmapNearestFilter: v, LinearMipmapLinearFilter: y, }; class uc extends ol { constructor(t) { super(t), 'undefined' == typeof createImageBitmap && console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ), 'undefined' == typeof fetch && console.warn('THREE.ImageBitmapLoader: fetch() not supported.'), (this.options = { premultiplyAlpha: 'none' }); } setOptions(t) { return (this.options = t), this; } load(t, e, n, i) { void 0 === t && (t = ''), void 0 !== this.path && (t = this.path + t), (t = this.manager.resolveURL(t)); const r = this, s = rl.get(t); if (void 0 !== s) return ( r.manager.itemStart(t), setTimeout(function () { e && e(s), r.manager.itemEnd(t); }, 0), s ); const a = {}; (a.credentials = 'anonymous' === this.crossOrigin ? 'same-origin' : 'include'), (a.headers = this.requestHeader), fetch(t, a) .then(function (t) { return t.blob(); }) .then(function (t) { return createImageBitmap( t, Object.assign(r.options, { colorSpaceConversion: 'none' }) ); }) .then(function (n) { rl.add(t, n), e && e(n), r.manager.itemEnd(t); }) .catch(function (e) { i && i(e), r.manager.itemError(t), r.manager.itemEnd(t); }), r.manager.itemStart(t); } } uc.prototype.isImageBitmapLoader = !0; class dc { constructor() { (this.type = 'ShapePath'), (this.color = new tn()), (this.subPaths = []), (this.currentPath = null); } moveTo(t, e) { return ( (this.currentPath = new Bl()), this.subPaths.push(this.currentPath), this.currentPath.moveTo(t, e), this ); } lineTo(t, e) { return this.currentPath.lineTo(t, e), this; } quadraticCurveTo(t, e, n, i) { return this.currentPath.quadraticCurveTo(t, e, n, i), this; } bezierCurveTo(t, e, n, i, r, s) { return this.currentPath.bezierCurveTo(t, e, n, i, r, s), this; } splineThru(t) { return this.currentPath.splineThru(t), this; } toShapes(t, e) { function n(t) { const e = []; for (let n = 0, i = t.length; n < i; n++) { const i = t[n], r = new zl(); (r.curves = i.curves), e.push(r); } return e; } function i(t, e) { const n = e.length; let i = !1; for (let r = n - 1, s = 0; s < n; r = s++) { let n = e[r], a = e[s], o = a.x - n.x, l = a.y - n.y; if (Math.abs(l) > Number.EPSILON) { if ( (l < 0 && ((n = e[s]), (o = -o), (a = e[r]), (l = -l)), t.y < n.y || t.y > a.y) ) continue; if (t.y === n.y) { if (t.x === n.x) return !0; } else { const e = l * (t.x - n.x) - o * (t.y - n.y); if (0 === e) return !0; if (e < 0) continue; i = !i; } } else { if (t.y !== n.y) continue; if ((a.x <= t.x && t.x <= n.x) || (n.x <= t.x && t.x <= a.x)) return !0; } } return i; } const r = po.isClockWise, s = this.subPaths; if (0 === s.length) return []; if (!0 === e) return n(s); let a, o, l; const c = []; if (1 === s.length) return (o = s[0]), (l = new zl()), (l.curves = o.curves), c.push(l), c; let h = !r(s[0].getPoints()); h = t ? !h : h; const u = [], d = []; let p, m, f = [], g = 0; (d[g] = void 0), (f[g] = []); for (let e = 0, n = s.length; e < n; e++) (o = s[e]), (p = o.getPoints()), (a = r(p)), (a = t ? !a : a), a ? (!h && d[g] && g++, (d[g] = { s: new zl(), p: p }), (d[g].s.curves = o.curves), h && g++, (f[g] = [])) : f[g].push({ h: o, p: p[0] }); if (!d[0]) return n(s); if (d.length > 1) { let t = !1; const e = []; for (let t = 0, e = d.length; t < e; t++) u[t] = []; for (let n = 0, r = d.length; n < r; n++) { const r = f[n]; for (let s = 0; s < r.length; s++) { const a = r[s]; let o = !0; for (let r = 0; r < d.length; r++) i(a.p, d[r].p) && (n !== r && e.push({ froms: n, tos: r, hole: s }), o ? ((o = !1), u[r].push(a)) : (t = !0)); o && u[n].push(a); } } e.length > 0 && (t || (f = u)); } for (let t = 0, e = d.length; t < e; t++) { (l = d[t].s), c.push(l), (m = f[t]); for (let t = 0, e = m.length; t < e; t++) l.holes.push(m[t].h); } return c; } } class pc { constructor(t) { (this.type = 'Font'), (this.data = t); } generateShapes(t, e = 100) { const n = [], i = (function (t, e, n) { const i = Array.from(t), r = e / n.resolution, s = (n.boundingBox.yMax - n.boundingBox.yMin + n.underlineThickness) * r, a = []; let o = 0, l = 0; for (let t = 0; t < i.length; t++) { const e = i[t]; if ('\n' === e) (o = 0), (l -= s); else { const t = mc(e, r, o, l, n); (o += t.offsetX), a.push(t.path); } } return a; })(t, e, this.data); for (let t = 0, e = i.length; t < e; t++) Array.prototype.push.apply(n, i[t].toShapes()); return n; } } function mc(t, e, n, i, r) { const s = r.glyphs[t] || r.glyphs['?']; if (!s) return void console.error( 'THREE.Font: character "' + t + '" does not exists in font family ' + r.familyName + '.' ); const a = new dc(); let o, l, c, h, u, d, p, m; if (s.o) { const t = s._cachedOutline || (s._cachedOutline = s.o.split(' ')); for (let r = 0, s = t.length; r < s; ) { switch (t[r++]) { case 'm': (o = t[r++] * e + n), (l = t[r++] * e + i), a.moveTo(o, l); break; case 'l': (o = t[r++] * e + n), (l = t[r++] * e + i), a.lineTo(o, l); break; case 'q': (c = t[r++] * e + n), (h = t[r++] * e + i), (u = t[r++] * e + n), (d = t[r++] * e + i), a.quadraticCurveTo(u, d, c, h); break; case 'b': (c = t[r++] * e + n), (h = t[r++] * e + i), (u = t[r++] * e + n), (d = t[r++] * e + i), (p = t[r++] * e + n), (m = t[r++] * e + i), a.bezierCurveTo(u, d, p, m, c, h); } } } return { offsetX: s.ha * e, path: a }; } pc.prototype.isFont = !0; let fc; const gc = { getContext: function () { return ( void 0 === fc && (fc = new (window.AudioContext || window.webkitAudioContext)()), fc ); }, setContext: function (t) { fc = t; }, }; class vc extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = this, s = new cl(this.manager); s.setResponseType('arraybuffer'), s.setPath(this.path), s.setRequestHeader(this.requestHeader), s.setWithCredentials(this.withCredentials), s.load( t, function (n) { try { const t = n.slice(0); gc.getContext().decodeAudioData(t, function (t) { e(t); }); } catch (e) { i ? i(e) : console.error(e), r.manager.itemError(t); } }, n, i ); } } class yc extends nc { constructor(t, e, n = 1) { super(void 0, n); const i = new tn().set(t), r = new tn().set(e), s = new Lt(i.r, i.g, i.b), a = new Lt(r.r, r.g, r.b), o = Math.sqrt(Math.PI), l = o * Math.sqrt(0.75); this.sh.coefficients[0].copy(s).add(a).multiplyScalar(o), this.sh.coefficients[1].copy(s).sub(a).multiplyScalar(l); } } yc.prototype.isHemisphereLightProbe = !0; class xc extends nc { constructor(t, e = 1) { super(void 0, e); const n = new tn().set(t); this.sh.coefficients[0] .set(n.r, n.g, n.b) .multiplyScalar(2 * Math.sqrt(Math.PI)); } } xc.prototype.isAmbientLightProbe = !0; const _c = new se(), wc = new se(); class bc { constructor(t = !0) { (this.autoStart = t), (this.startTime = 0), (this.oldTime = 0), (this.elapsedTime = 0), (this.running = !1); } start() { (this.startTime = Mc()), (this.oldTime = this.startTime), (this.elapsedTime = 0), (this.running = !0); } stop() { this.getElapsedTime(), (this.running = !1), (this.autoStart = !1); } getElapsedTime() { return this.getDelta(), this.elapsedTime; } getDelta() { let t = 0; if (this.autoStart && !this.running) return this.start(), 0; if (this.running) { const e = Mc(); (t = (e - this.oldTime) / 1e3), (this.oldTime = e), (this.elapsedTime += t); } return t; } } function Mc() { return ('undefined' == typeof performance ? Date : performance).now(); } const Sc = new Lt(), Tc = new At(), Ec = new Lt(), Ac = new Lt(); class Lc extends Ce { constructor(t) { super(), (this.type = 'Audio'), (this.listener = t), (this.context = t.context), (this.gain = this.context.createGain()), this.gain.connect(t.getInput()), (this.autoplay = !1), (this.buffer = null), (this.detune = 0), (this.loop = !1), (this.loopStart = 0), (this.loopEnd = 0), (this.offset = 0), (this.duration = void 0), (this.playbackRate = 1), (this.isPlaying = !1), (this.hasPlaybackControl = !0), (this.source = null), (this.sourceType = 'empty'), (this._startedAt = 0), (this._progress = 0), (this._connected = !1), (this.filters = []); } getOutput() { return this.gain; } setNodeSource(t) { return ( (this.hasPlaybackControl = !1), (this.sourceType = 'audioNode'), (this.source = t), this.connect(), this ); } setMediaElementSource(t) { return ( (this.hasPlaybackControl = !1), (this.sourceType = 'mediaNode'), (this.source = this.context.createMediaElementSource(t)), this.connect(), this ); } setMediaStreamSource(t) { return ( (this.hasPlaybackControl = !1), (this.sourceType = 'mediaStreamNode'), (this.source = this.context.createMediaStreamSource(t)), this.connect(), this ); } setBuffer(t) { return ( (this.buffer = t), (this.sourceType = 'buffer'), this.autoplay && this.play(), this ); } play(t = 0) { if (!0 === this.isPlaying) return void console.warn('THREE.Audio: Audio is already playing.'); if (!1 === this.hasPlaybackControl) return void console.warn( 'THREE.Audio: this Audio has no playback control.' ); this._startedAt = this.context.currentTime + t; const e = this.context.createBufferSource(); return ( (e.buffer = this.buffer), (e.loop = this.loop), (e.loopStart = this.loopStart), (e.loopEnd = this.loopEnd), (e.onended = this.onEnded.bind(this)), e.start(this._startedAt, this._progress + this.offset, this.duration), (this.isPlaying = !0), (this.source = e), this.setDetune(this.detune), this.setPlaybackRate(this.playbackRate), this.connect() ); } pause() { if (!1 !== this.hasPlaybackControl) return ( !0 === this.isPlaying && ((this._progress += Math.max(this.context.currentTime - this._startedAt, 0) * this.playbackRate), !0 === this.loop && (this._progress = this._progress % (this.duration || this.buffer.duration)), this.source.stop(), (this.source.onended = null), (this.isPlaying = !1)), this ); console.warn('THREE.Audio: this Audio has no playback control.'); } stop() { if (!1 !== this.hasPlaybackControl) return ( (this._progress = 0), this.source.stop(), (this.source.onended = null), (this.isPlaying = !1), this ); console.warn('THREE.Audio: this Audio has no playback control.'); } connect() { if (this.filters.length > 0) { this.source.connect(this.filters[0]); for (let t = 1, e = this.filters.length; t < e; t++) this.filters[t - 1].connect(this.filters[t]); this.filters[this.filters.length - 1].connect(this.getOutput()); } else this.source.connect(this.getOutput()); return (this._connected = !0), this; } disconnect() { if (this.filters.length > 0) { this.source.disconnect(this.filters[0]); for (let t = 1, e = this.filters.length; t < e; t++) this.filters[t - 1].disconnect(this.filters[t]); this.filters[this.filters.length - 1].disconnect(this.getOutput()); } else this.source.disconnect(this.getOutput()); return (this._connected = !1), this; } getFilters() { return this.filters; } setFilters(t) { return ( t || (t = []), !0 === this._connected ? (this.disconnect(), (this.filters = t.slice()), this.connect()) : (this.filters = t.slice()), this ); } setDetune(t) { if (((this.detune = t), void 0 !== this.source.detune)) return ( !0 === this.isPlaying && this.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 ), this ); } getDetune() { return this.detune; } getFilter() { return this.getFilters()[0]; } setFilter(t) { return this.setFilters(t ? [t] : []); } setPlaybackRate(t) { if (!1 !== this.hasPlaybackControl) return ( (this.playbackRate = t), !0 === this.isPlaying && this.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 ), this ); console.warn('THREE.Audio: this Audio has no playback control.'); } getPlaybackRate() { return this.playbackRate; } onEnded() { this.isPlaying = !1; } getLoop() { return !1 === this.hasPlaybackControl ? (console.warn('THREE.Audio: this Audio has no playback control.'), !1) : this.loop; } setLoop(t) { if (!1 !== this.hasPlaybackControl) return ( (this.loop = t), !0 === this.isPlaying && (this.source.loop = this.loop), this ); console.warn('THREE.Audio: this Audio has no playback control.'); } setLoopStart(t) { return (this.loopStart = t), this; } setLoopEnd(t) { return (this.loopEnd = t), this; } getVolume() { return this.gain.gain.value; } setVolume(t) { return ( this.gain.gain.setTargetAtTime(t, this.context.currentTime, 0.01), this ); } } const Rc = new Lt(), Cc = new At(), Pc = new Lt(), Dc = new Lt(); class Ic { constructor(t, e = 2048) { (this.analyser = t.context.createAnalyser()), (this.analyser.fftSize = e), (this.data = new Uint8Array(this.analyser.frequencyBinCount)), t.getOutput().connect(this.analyser); } getFrequencyData() { return this.analyser.getByteFrequencyData(this.data), this.data; } getAverageFrequency() { let t = 0; const e = this.getFrequencyData(); for (let n = 0; n < e.length; n++) t += e[n]; return t / e.length; } } class Nc { constructor(t, e, n) { let i, r, s; switch (((this.binding = t), (this.valueSize = n), e)) { case 'quaternion': (i = this._slerp), (r = this._slerpAdditive), (s = this._setAdditiveIdentityQuaternion), (this.buffer = new Float64Array(6 * n)), (this._workIndex = 5); break; case 'string': case 'bool': (i = this._select), (r = this._select), (s = this._setAdditiveIdentityOther), (this.buffer = new Array(5 * n)); break; default: (i = this._lerp), (r = this._lerpAdditive), (s = this._setAdditiveIdentityNumeric), (this.buffer = new Float64Array(5 * n)); } (this._mixBufferRegion = i), (this._mixBufferRegionAdditive = r), (this._setIdentity = s), (this._origIndex = 3), (this._addIndex = 4), (this.cumulativeWeight = 0), (this.cumulativeWeightAdditive = 0), (this.useCount = 0), (this.referenceCount = 0); } accumulate(t, e) { const n = this.buffer, i = this.valueSize, r = t * i + i; let s = this.cumulativeWeight; if (0 === s) { for (let t = 0; t !== i; ++t) n[r + t] = n[t]; s = e; } else { s += e; const t = e / s; this._mixBufferRegion(n, r, 0, t, i); } this.cumulativeWeight = s; } accumulateAdditive(t) { const e = this.buffer, n = this.valueSize, i = n * this._addIndex; 0 === this.cumulativeWeightAdditive && this._setIdentity(), this._mixBufferRegionAdditive(e, i, 0, t, n), (this.cumulativeWeightAdditive += t); } apply(t) { const e = this.valueSize, n = this.buffer, i = t * e + e, r = this.cumulativeWeight, s = this.cumulativeWeightAdditive, a = this.binding; if ( ((this.cumulativeWeight = 0), (this.cumulativeWeightAdditive = 0), r < 1) ) { const t = e * this._origIndex; this._mixBufferRegion(n, i, t, 1 - r, e); } s > 0 && this._mixBufferRegionAdditive(n, i, this._addIndex * e, 1, e); for (let t = e, r = e + e; t !== r; ++t) if (n[t] !== n[t + e]) { a.setValue(n, i); break; } } saveOriginalState() { const t = this.binding, e = this.buffer, n = this.valueSize, i = n * this._origIndex; t.getValue(e, i); for (let t = n, r = i; t !== r; ++t) e[t] = e[i + (t % n)]; this._setIdentity(), (this.cumulativeWeight = 0), (this.cumulativeWeightAdditive = 0); } restoreOriginalState() { const t = 3 * this.valueSize; this.binding.setValue(this.buffer, t); } _setAdditiveIdentityNumeric() { const t = this._addIndex * this.valueSize, e = t + this.valueSize; for (let n = t; n < e; n++) this.buffer[n] = 0; } _setAdditiveIdentityQuaternion() { this._setAdditiveIdentityNumeric(), (this.buffer[this._addIndex * this.valueSize + 3] = 1); } _setAdditiveIdentityOther() { const t = this._origIndex * this.valueSize, e = this._addIndex * this.valueSize; for (let n = 0; n < this.valueSize; n++) this.buffer[e + n] = this.buffer[t + n]; } _select(t, e, n, i, r) { if (i >= 0.5) for (let i = 0; i !== r; ++i) t[e + i] = t[n + i]; } _slerp(t, e, n, i) { At.slerpFlat(t, e, t, e, t, n, i); } _slerpAdditive(t, e, n, i, r) { const s = this._workIndex * r; At.multiplyQuaternionsFlat(t, s, t, e, t, n), At.slerpFlat(t, e, t, e, t, s, i); } _lerp(t, e, n, i, r) { const s = 1 - i; for (let a = 0; a !== r; ++a) { const r = e + a; t[r] = t[r] * s + t[n + a] * i; } } _lerpAdditive(t, e, n, i, r) { for (let s = 0; s !== r; ++s) { const r = e + s; t[r] = t[r] + t[n + s] * i; } } } const Bc = '\\[\\]\\.:\\/', zc = new RegExp('[\\[\\]\\.:\\/]', 'g'), Fc = '[^\\[\\]\\.:\\/]', Oc = '[^' + Bc.replace('\\.', '') + ']', Hc = /((?:WC+[\/:])*)/.source.replace('WC', Fc), Gc = /(WCOD+)?/.source.replace('WCOD', Oc), Uc = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace('WC', Fc), kc = /\.(WC+)(?:\[(.+)\])?/.source.replace('WC', Fc), Vc = new RegExp('^' + Hc + Gc + Uc + kc + '$'), Wc = ['material', 'materials', 'bones']; class jc { constructor(t, e, n) { (this.path = e), (this.parsedPath = n || jc.parseTrackName(e)), (this.node = jc.findNode(t, this.parsedPath.nodeName) || t), (this.rootNode = t), (this.getValue = this._getValue_unbound), (this.setValue = this._setValue_unbound); } static create(t, e, n) { return t && t.isAnimationObjectGroup ? new jc.Composite(t, e, n) : new jc(t, e, n); } static sanitizeNodeName(t) { return t.replace(/\s/g, '_').replace(zc, ''); } static parseTrackName(t) { const e = Vc.exec(t); if (!e) throw new Error('PropertyBinding: Cannot parse trackName: ' + t); const n = { nodeName: e[2], objectName: e[3], objectIndex: e[4], propertyName: e[5], propertyIndex: e[6], }, i = n.nodeName && n.nodeName.lastIndexOf('.'); if (void 0 !== i && -1 !== i) { const t = n.nodeName.substring(i + 1); -1 !== Wc.indexOf(t) && ((n.nodeName = n.nodeName.substring(0, i)), (n.objectName = t)); } if (null === n.propertyName || 0 === n.propertyName.length) throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + t ); return n; } static findNode(t, e) { if ( !e || '' === e || '.' === e || -1 === e || e === t.name || e === t.uuid ) return t; if (t.skeleton) { const n = t.skeleton.getBoneByName(e); if (void 0 !== n) return n; } if (t.children) { const n = function (t) { for (let i = 0; i < t.length; i++) { const r = t[i]; if (r.name === e || r.uuid === e) return r; const s = n(r.children); if (s) return s; } return null; }, i = n(t.children); if (i) return i; } return null; } _getValue_unavailable() {} _setValue_unavailable() {} _getValue_direct(t, e) { t[e] = this.node[this.propertyName]; } _getValue_array(t, e) { const n = this.resolvedProperty; for (let i = 0, r = n.length; i !== r; ++i) t[e++] = n[i]; } _getValue_arrayElement(t, e) { t[e] = this.resolvedProperty[this.propertyIndex]; } _getValue_toArray(t, e) { this.resolvedProperty.toArray(t, e); } _setValue_direct(t, e) { this.targetObject[this.propertyName] = t[e]; } _setValue_direct_setNeedsUpdate(t, e) { (this.targetObject[this.propertyName] = t[e]), (this.targetObject.needsUpdate = !0); } _setValue_direct_setMatrixWorldNeedsUpdate(t, e) { (this.targetObject[this.propertyName] = t[e]), (this.targetObject.matrixWorldNeedsUpdate = !0); } _setValue_array(t, e) { const n = this.resolvedProperty; for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++]; } _setValue_array_setNeedsUpdate(t, e) { const n = this.resolvedProperty; for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++]; this.targetObject.needsUpdate = !0; } _setValue_array_setMatrixWorldNeedsUpdate(t, e) { const n = this.resolvedProperty; for (let i = 0, r = n.length; i !== r; ++i) n[i] = t[e++]; this.targetObject.matrixWorldNeedsUpdate = !0; } _setValue_arrayElement(t, e) { this.resolvedProperty[this.propertyIndex] = t[e]; } _setValue_arrayElement_setNeedsUpdate(t, e) { (this.resolvedProperty[this.propertyIndex] = t[e]), (this.targetObject.needsUpdate = !0); } _setValue_arrayElement_setMatrixWorldNeedsUpdate(t, e) { (this.resolvedProperty[this.propertyIndex] = t[e]), (this.targetObject.matrixWorldNeedsUpdate = !0); } _setValue_fromArray(t, e) { this.resolvedProperty.fromArray(t, e); } _setValue_fromArray_setNeedsUpdate(t, e) { this.resolvedProperty.fromArray(t, e), (this.targetObject.needsUpdate = !0); } _setValue_fromArray_setMatrixWorldNeedsUpdate(t, e) { this.resolvedProperty.fromArray(t, e), (this.targetObject.matrixWorldNeedsUpdate = !0); } _getValue_unbound(t, e) { this.bind(), this.getValue(t, e); } _setValue_unbound(t, e) { this.bind(), this.setValue(t, e); } bind() { let t = this.node; const e = this.parsedPath, n = e.objectName, i = e.propertyName; let r = e.propertyIndex; if ( (t || ((t = jc.findNode(this.rootNode, e.nodeName) || this.rootNode), (this.node = t)), (this.getValue = this._getValue_unavailable), (this.setValue = this._setValue_unavailable), !t) ) return void console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + " but it wasn't found." ); if (n) { let i = e.objectIndex; switch (n) { case 'materials': if (!t.material) return void console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); if (!t.material.materials) return void console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); t = t.material.materials; break; case 'bones': if (!t.skeleton) return void console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); t = t.skeleton.bones; for (let e = 0; e < t.length; e++) if (t[e].name === i) { i = e; break; } break; default: if (void 0 === t[n]) return void console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); t = t[n]; } if (void 0 !== i) { if (void 0 === t[i]) return void console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, t ); t = t[i]; } } const s = t[i]; if (void 0 === s) { const n = e.nodeName; return void console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + n + '.' + i + " but it wasn't found.", t ); } let a = this.Versioning.None; (this.targetObject = t), void 0 !== t.needsUpdate ? (a = this.Versioning.NeedsUpdate) : void 0 !== t.matrixWorldNeedsUpdate && (a = this.Versioning.MatrixWorldNeedsUpdate); let o = this.BindingType.Direct; if (void 0 !== r) { if ('morphTargetInfluences' === i) { if (!t.geometry) return void console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); if (!t.geometry.isBufferGeometry) return void console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this ); if (!t.geometry.morphAttributes) return void console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); void 0 !== t.morphTargetDictionary[r] && (r = t.morphTargetDictionary[r]); } (o = this.BindingType.ArrayElement), (this.resolvedProperty = s), (this.propertyIndex = r); } else void 0 !== s.fromArray && void 0 !== s.toArray ? ((o = this.BindingType.HasFromToArray), (this.resolvedProperty = s)) : Array.isArray(s) ? ((o = this.BindingType.EntireArray), (this.resolvedProperty = s)) : (this.propertyName = i); (this.getValue = this.GetterByBindingType[o]), (this.setValue = this.SetterByBindingTypeAndVersioning[o][a]); } unbind() { (this.node = null), (this.getValue = this._getValue_unbound), (this.setValue = this._setValue_unbound); } } (jc.Composite = class { constructor(t, e, n) { const i = n || jc.parseTrackName(e); (this._targetGroup = t), (this._bindings = t.subscribe_(e, i)); } getValue(t, e) { this.bind(); const n = this._targetGroup.nCachedObjects_, i = this._bindings[n]; void 0 !== i && i.getValue(t, e); } setValue(t, e) { const n = this._bindings; for ( let i = this._targetGroup.nCachedObjects_, r = n.length; i !== r; ++i ) n[i].setValue(t, e); } bind() { const t = this._bindings; for ( let e = this._targetGroup.nCachedObjects_, n = t.length; e !== n; ++e ) t[e].bind(); } unbind() { const t = this._bindings; for ( let e = this._targetGroup.nCachedObjects_, n = t.length; e !== n; ++e ) t[e].unbind(); } }), (jc.prototype.BindingType = { Direct: 0, EntireArray: 1, ArrayElement: 2, HasFromToArray: 3, }), (jc.prototype.Versioning = { None: 0, NeedsUpdate: 1, MatrixWorldNeedsUpdate: 2, }), (jc.prototype.GetterByBindingType = [ jc.prototype._getValue_direct, jc.prototype._getValue_array, jc.prototype._getValue_arrayElement, jc.prototype._getValue_toArray, ]), (jc.prototype.SetterByBindingTypeAndVersioning = [ [ jc.prototype._setValue_direct, jc.prototype._setValue_direct_setNeedsUpdate, jc.prototype._setValue_direct_setMatrixWorldNeedsUpdate, ], [ jc.prototype._setValue_array, jc.prototype._setValue_array_setNeedsUpdate, jc.prototype._setValue_array_setMatrixWorldNeedsUpdate, ], [ jc.prototype._setValue_arrayElement, jc.prototype._setValue_arrayElement_setNeedsUpdate, jc.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate, ], [ jc.prototype._setValue_fromArray, jc.prototype._setValue_fromArray_setNeedsUpdate, jc.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate, ], ]); class qc { constructor() { (this.uuid = ct()), (this._objects = Array.prototype.slice.call(arguments)), (this.nCachedObjects_ = 0); const t = {}; this._indicesByUUID = t; for (let e = 0, n = arguments.length; e !== n; ++e) t[arguments[e].uuid] = e; (this._paths = []), (this._parsedPaths = []), (this._bindings = []), (this._bindingsIndicesByPath = {}); const e = this; this.stats = { objects: { get total() { return e._objects.length; }, get inUse() { return this.total - e.nCachedObjects_; }, }, get bindingsPerObject() { return e._bindings.length; }, }; } add() { const t = this._objects, e = this._indicesByUUID, n = this._paths, i = this._parsedPaths, r = this._bindings, s = r.length; let a, o = t.length, l = this.nCachedObjects_; for (let c = 0, h = arguments.length; c !== h; ++c) { const h = arguments[c], u = h.uuid; let d = e[u]; if (void 0 === d) { (d = o++), (e[u] = d), t.push(h); for (let t = 0, e = s; t !== e; ++t) r[t].push(new jc(h, n[t], i[t])); } else if (d < l) { a = t[d]; const o = --l, c = t[o]; (e[c.uuid] = d), (t[d] = c), (e[u] = o), (t[o] = h); for (let t = 0, e = s; t !== e; ++t) { const e = r[t], s = e[o]; let a = e[d]; (e[d] = s), void 0 === a && (a = new jc(h, n[t], i[t])), (e[o] = a); } } else t[d] !== a && console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); } this.nCachedObjects_ = l; } remove() { const t = this._objects, e = this._indicesByUUID, n = this._bindings, i = n.length; let r = this.nCachedObjects_; for (let s = 0, a = arguments.length; s !== a; ++s) { const a = arguments[s], o = a.uuid, l = e[o]; if (void 0 !== l && l >= r) { const s = r++, c = t[s]; (e[c.uuid] = l), (t[l] = c), (e[o] = s), (t[s] = a); for (let t = 0, e = i; t !== e; ++t) { const e = n[t], i = e[s], r = e[l]; (e[l] = i), (e[s] = r); } } } this.nCachedObjects_ = r; } uncache() { const t = this._objects, e = this._indicesByUUID, n = this._bindings, i = n.length; let r = this.nCachedObjects_, s = t.length; for (let a = 0, o = arguments.length; a !== o; ++a) { const o = arguments[a].uuid, l = e[o]; if (void 0 !== l) if ((delete e[o], l < r)) { const a = --r, o = t[a], c = --s, h = t[c]; (e[o.uuid] = l), (t[l] = o), (e[h.uuid] = a), (t[a] = h), t.pop(); for (let t = 0, e = i; t !== e; ++t) { const e = n[t], i = e[a], r = e[c]; (e[l] = i), (e[a] = r), e.pop(); } } else { const r = --s, a = t[r]; r > 0 && (e[a.uuid] = l), (t[l] = a), t.pop(); for (let t = 0, e = i; t !== e; ++t) { const e = n[t]; (e[l] = e[r]), e.pop(); } } } this.nCachedObjects_ = r; } subscribe_(t, e) { const n = this._bindingsIndicesByPath; let i = n[t]; const r = this._bindings; if (void 0 !== i) return r[i]; const s = this._paths, a = this._parsedPaths, o = this._objects, l = o.length, c = this.nCachedObjects_, h = new Array(l); (i = r.length), (n[t] = i), s.push(t), a.push(e), r.push(h); for (let n = c, i = o.length; n !== i; ++n) { const i = o[n]; h[n] = new jc(i, t, e); } return h; } unsubscribe_(t) { const e = this._bindingsIndicesByPath, n = e[t]; if (void 0 !== n) { const i = this._paths, r = this._parsedPaths, s = this._bindings, a = s.length - 1, o = s[a]; (e[t[a]] = n), (s[n] = o), s.pop(), (r[n] = r[a]), r.pop(), (i[n] = i[a]), i.pop(); } } } qc.prototype.isAnimationObjectGroup = !0; class Xc { constructor(t, e, n = null, i = e.blendMode) { (this._mixer = t), (this._clip = e), (this._localRoot = n), (this.blendMode = i); const r = e.tracks, s = r.length, a = new Array(s), o = { endingStart: k, endingEnd: k }; for (let t = 0; t !== s; ++t) { const e = r[t].createInterpolant(null); (a[t] = e), (e.settings = o); } (this._interpolantSettings = o), (this._interpolants = a), (this._propertyBindings = new Array(s)), (this._cacheIndex = null), (this._byClipCacheIndex = null), (this._timeScaleInterpolant = null), (this._weightInterpolant = null), (this.loop = 2201), (this._loopCount = -1), (this._startTime = null), (this.time = 0), (this.timeScale = 1), (this._effectiveTimeScale = 1), (this.weight = 1), (this._effectiveWeight = 1), (this.repetitions = 1 / 0), (this.paused = !1), (this.enabled = !0), (this.clampWhenFinished = !1), (this.zeroSlopeAtStart = !0), (this.zeroSlopeAtEnd = !0); } play() { return this._mixer._activateAction(this), this; } stop() { return this._mixer._deactivateAction(this), this.reset(); } reset() { return ( (this.paused = !1), (this.enabled = !0), (this.time = 0), (this._loopCount = -1), (this._startTime = null), this.stopFading().stopWarping() ); } isRunning() { return ( this.enabled && !this.paused && 0 !== this.timeScale && null === this._startTime && this._mixer._isActiveAction(this) ); } isScheduled() { return this._mixer._isActiveAction(this); } startAt(t) { return (this._startTime = t), this; } setLoop(t, e) { return (this.loop = t), (this.repetitions = e), this; } setEffectiveWeight(t) { return ( (this.weight = t), (this._effectiveWeight = this.enabled ? t : 0), this.stopFading() ); } getEffectiveWeight() { return this._effectiveWeight; } fadeIn(t) { return this._scheduleFading(t, 0, 1); } fadeOut(t) { return this._scheduleFading(t, 1, 0); } crossFadeFrom(t, e, n) { if ((t.fadeOut(e), this.fadeIn(e), n)) { const n = this._clip.duration, i = t._clip.duration, r = i / n, s = n / i; t.warp(1, r, e), this.warp(s, 1, e); } return this; } crossFadeTo(t, e, n) { return t.crossFadeFrom(this, e, n); } stopFading() { const t = this._weightInterpolant; return ( null !== t && ((this._weightInterpolant = null), this._mixer._takeBackControlInterpolant(t)), this ); } setEffectiveTimeScale(t) { return ( (this.timeScale = t), (this._effectiveTimeScale = this.paused ? 0 : t), this.stopWarping() ); } getEffectiveTimeScale() { return this._effectiveTimeScale; } setDuration(t) { return (this.timeScale = this._clip.duration / t), this.stopWarping(); } syncWith(t) { return ( (this.time = t.time), (this.timeScale = t.timeScale), this.stopWarping() ); } halt(t) { return this.warp(this._effectiveTimeScale, 0, t); } warp(t, e, n) { const i = this._mixer, r = i.time, s = this.timeScale; let a = this._timeScaleInterpolant; null === a && ((a = i._lendControlInterpolant()), (this._timeScaleInterpolant = a)); const o = a.parameterPositions, l = a.sampleValues; return (o[0] = r), (o[1] = r + n), (l[0] = t / s), (l[1] = e / s), this; } stopWarping() { const t = this._timeScaleInterpolant; return ( null !== t && ((this._timeScaleInterpolant = null), this._mixer._takeBackControlInterpolant(t)), this ); } getMixer() { return this._mixer; } getClip() { return this._clip; } getRoot() { return this._localRoot || this._mixer._root; } _update(t, e, n, i) { if (!this.enabled) return void this._updateWeight(t); const r = this._startTime; if (null !== r) { const i = (t - r) * n; if (i < 0 || 0 === n) return; (this._startTime = null), (e = n * i); } e *= this._updateTimeScale(t); const s = this._updateTime(e), a = this._updateWeight(t); if (a > 0) { const t = this._interpolants, e = this._propertyBindings; switch (this.blendMode) { case q: for (let n = 0, i = t.length; n !== i; ++n) t[n].evaluate(s), e[n].accumulateAdditive(a); break; case j: default: for (let n = 0, r = t.length; n !== r; ++n) t[n].evaluate(s), e[n].accumulate(i, a); } } } _updateWeight(t) { let e = 0; if (this.enabled) { e = this.weight; const n = this._weightInterpolant; if (null !== n) { const i = n.evaluate(t)[0]; (e *= i), t > n.parameterPositions[1] && (this.stopFading(), 0 === i && (this.enabled = !1)); } } return (this._effectiveWeight = e), e; } _updateTimeScale(t) { let e = 0; if (!this.paused) { e = this.timeScale; const n = this._timeScaleInterpolant; if (null !== n) { (e *= n.evaluate(t)[0]), t > n.parameterPositions[1] && (this.stopWarping(), 0 === e ? (this.paused = !0) : (this.timeScale = e)); } } return (this._effectiveTimeScale = e), e; } _updateTime(t) { const e = this._clip.duration, n = this.loop; let i = this.time + t, r = this._loopCount; const s = 2202 === n; if (0 === t) return -1 === r ? i : s && 1 == (1 & r) ? e - i : i; if (2200 === n) { -1 === r && ((this._loopCount = 0), this._setEndings(!0, !0, !1)); t: { if (i >= e) i = e; else { if (!(i < 0)) { this.time = i; break t; } i = 0; } this.clampWhenFinished ? (this.paused = !0) : (this.enabled = !1), (this.time = i), this._mixer.dispatchEvent({ type: 'finished', action: this, direction: t < 0 ? -1 : 1, }); } } else { if ( (-1 === r && (t >= 0 ? ((r = 0), this._setEndings(!0, 0 === this.repetitions, s)) : this._setEndings(0 === this.repetitions, !0, s)), i >= e || i < 0) ) { const n = Math.floor(i / e); (i -= e * n), (r += Math.abs(n)); const a = this.repetitions - r; if (a <= 0) this.clampWhenFinished ? (this.paused = !0) : (this.enabled = !1), (i = t > 0 ? e : 0), (this.time = i), this._mixer.dispatchEvent({ type: 'finished', action: this, direction: t > 0 ? 1 : -1, }); else { if (1 === a) { const e = t < 0; this._setEndings(e, !e, s); } else this._setEndings(!1, !1, s); (this._loopCount = r), (this.time = i), this._mixer.dispatchEvent({ type: 'loop', action: this, loopDelta: n, }); } } else this.time = i; if (s && 1 == (1 & r)) return e - i; } return i; } _setEndings(t, e, n) { const i = this._interpolantSettings; n ? ((i.endingStart = V), (i.endingEnd = V)) : ((i.endingStart = t ? (this.zeroSlopeAtStart ? V : k) : W), (i.endingEnd = e ? (this.zeroSlopeAtEnd ? V : k) : W)); } _scheduleFading(t, e, n) { const i = this._mixer, r = i.time; let s = this._weightInterpolant; null === s && ((s = i._lendControlInterpolant()), (this._weightInterpolant = s)); const a = s.parameterPositions, o = s.sampleValues; return (a[0] = r), (o[0] = e), (a[1] = r + t), (o[1] = n), this; } } class Yc extends rt { constructor(t) { super(), (this._root = t), this._initMemoryManager(), (this._accuIndex = 0), (this.time = 0), (this.timeScale = 1); } _bindAction(t, e) { const n = t._localRoot || this._root, i = t._clip.tracks, r = i.length, s = t._propertyBindings, a = t._interpolants, o = n.uuid, l = this._bindingsByRootAndName; let c = l[o]; void 0 === c && ((c = {}), (l[o] = c)); for (let t = 0; t !== r; ++t) { const r = i[t], l = r.name; let h = c[l]; if (void 0 !== h) s[t] = h; else { if (((h = s[t]), void 0 !== h)) { null === h._cacheIndex && (++h.referenceCount, this._addInactiveBinding(h, o, l)); continue; } const i = e && e._propertyBindings[t].binding.parsedPath; (h = new Nc(jc.create(n, l, i), r.ValueTypeName, r.getValueSize())), ++h.referenceCount, this._addInactiveBinding(h, o, l), (s[t] = h); } a[t].resultBuffer = h.buffer; } } _activateAction(t) { if (!this._isActiveAction(t)) { if (null === t._cacheIndex) { const e = (t._localRoot || this._root).uuid, n = t._clip.uuid, i = this._actionsByClip[n]; this._bindAction(t, i && i.knownActions[0]), this._addInactiveAction(t, n, e); } const e = t._propertyBindings; for (let t = 0, n = e.length; t !== n; ++t) { const n = e[t]; 0 == n.useCount++ && (this._lendBinding(n), n.saveOriginalState()); } this._lendAction(t); } } _deactivateAction(t) { if (this._isActiveAction(t)) { const e = t._propertyBindings; for (let t = 0, n = e.length; t !== n; ++t) { const n = e[t]; 0 == --n.useCount && (n.restoreOriginalState(), this._takeBackBinding(n)); } this._takeBackAction(t); } } _initMemoryManager() { (this._actions = []), (this._nActiveActions = 0), (this._actionsByClip = {}), (this._bindings = []), (this._nActiveBindings = 0), (this._bindingsByRootAndName = {}), (this._controlInterpolants = []), (this._nActiveControlInterpolants = 0); const t = this; this.stats = { actions: { get total() { return t._actions.length; }, get inUse() { return t._nActiveActions; }, }, bindings: { get total() { return t._bindings.length; }, get inUse() { return t._nActiveBindings; }, }, controlInterpolants: { get total() { return t._controlInterpolants.length; }, get inUse() { return t._nActiveControlInterpolants; }, }, }; } _isActiveAction(t) { const e = t._cacheIndex; return null !== e && e < this._nActiveActions; } _addInactiveAction(t, e, n) { const i = this._actions, r = this._actionsByClip; let s = r[e]; if (void 0 === s) (s = { knownActions: [t], actionByRoot: {} }), (t._byClipCacheIndex = 0), (r[e] = s); else { const e = s.knownActions; (t._byClipCacheIndex = e.length), e.push(t); } (t._cacheIndex = i.length), i.push(t), (s.actionByRoot[n] = t); } _removeInactiveAction(t) { const e = this._actions, n = e[e.length - 1], i = t._cacheIndex; (n._cacheIndex = i), (e[i] = n), e.pop(), (t._cacheIndex = null); const r = t._clip.uuid, s = this._actionsByClip, a = s[r], o = a.knownActions, l = o[o.length - 1], c = t._byClipCacheIndex; (l._byClipCacheIndex = c), (o[c] = l), o.pop(), (t._byClipCacheIndex = null); delete a.actionByRoot[(t._localRoot || this._root).uuid], 0 === o.length && delete s[r], this._removeInactiveBindingsForAction(t); } _removeInactiveBindingsForAction(t) { const e = t._propertyBindings; for (let t = 0, n = e.length; t !== n; ++t) { const n = e[t]; 0 == --n.referenceCount && this._removeInactiveBinding(n); } } _lendAction(t) { const e = this._actions, n = t._cacheIndex, i = this._nActiveActions++, r = e[i]; (t._cacheIndex = i), (e[i] = t), (r._cacheIndex = n), (e[n] = r); } _takeBackAction(t) { const e = this._actions, n = t._cacheIndex, i = --this._nActiveActions, r = e[i]; (t._cacheIndex = i), (e[i] = t), (r._cacheIndex = n), (e[n] = r); } _addInactiveBinding(t, e, n) { const i = this._bindingsByRootAndName, r = this._bindings; let s = i[e]; void 0 === s && ((s = {}), (i[e] = s)), (s[n] = t), (t._cacheIndex = r.length), r.push(t); } _removeInactiveBinding(t) { const e = this._bindings, n = t.binding, i = n.rootNode.uuid, r = n.path, s = this._bindingsByRootAndName, a = s[i], o = e[e.length - 1], l = t._cacheIndex; (o._cacheIndex = l), (e[l] = o), e.pop(), delete a[r], 0 === Object.keys(a).length && delete s[i]; } _lendBinding(t) { const e = this._bindings, n = t._cacheIndex, i = this._nActiveBindings++, r = e[i]; (t._cacheIndex = i), (e[i] = t), (r._cacheIndex = n), (e[n] = r); } _takeBackBinding(t) { const e = this._bindings, n = t._cacheIndex, i = --this._nActiveBindings, r = e[i]; (t._cacheIndex = i), (e[i] = t), (r._cacheIndex = n), (e[n] = r); } _lendControlInterpolant() { const t = this._controlInterpolants, e = this._nActiveControlInterpolants++; let n = t[e]; return ( void 0 === n && ((n = new qo( new Float32Array(2), new Float32Array(2), 1, this._controlInterpolantsResultBuffer )), (n.__cacheIndex = e), (t[e] = n)), n ); } _takeBackControlInterpolant(t) { const e = this._controlInterpolants, n = t.__cacheIndex, i = --this._nActiveControlInterpolants, r = e[i]; (t.__cacheIndex = i), (e[i] = t), (r.__cacheIndex = n), (e[n] = r); } clipAction(t, e, n) { const i = e || this._root, r = i.uuid; let s = 'string' == typeof t ? nl.findByName(i, t) : t; const a = null !== s ? s.uuid : t, o = this._actionsByClip[a]; let l = null; if ((void 0 === n && (n = null !== s ? s.blendMode : j), void 0 !== o)) { const t = o.actionByRoot[r]; if (void 0 !== t && t.blendMode === n) return t; (l = o.knownActions[0]), null === s && (s = l._clip); } if (null === s) return null; const c = new Xc(this, s, e, n); return this._bindAction(c, l), this._addInactiveAction(c, a, r), c; } existingAction(t, e) { const n = e || this._root, i = n.uuid, r = 'string' == typeof t ? nl.findByName(n, t) : t, s = r ? r.uuid : t, a = this._actionsByClip[s]; return (void 0 !== a && a.actionByRoot[i]) || null; } stopAllAction() { const t = this._actions; for (let e = this._nActiveActions - 1; e >= 0; --e) t[e].stop(); return this; } update(t) { t *= this.timeScale; const e = this._actions, n = this._nActiveActions, i = (this.time += t), r = Math.sign(t), s = (this._accuIndex ^= 1); for (let a = 0; a !== n; ++a) { e[a]._update(i, t, r, s); } const a = this._bindings, o = this._nActiveBindings; for (let t = 0; t !== o; ++t) a[t].apply(s); return this; } setTime(t) { this.time = 0; for (let t = 0; t < this._actions.length; t++) this._actions[t].time = 0; return this.update(t); } getRoot() { return this._root; } uncacheClip(t) { const e = this._actions, n = t.uuid, i = this._actionsByClip, r = i[n]; if (void 0 !== r) { const t = r.knownActions; for (let n = 0, i = t.length; n !== i; ++n) { const i = t[n]; this._deactivateAction(i); const r = i._cacheIndex, s = e[e.length - 1]; (i._cacheIndex = null), (i._byClipCacheIndex = null), (s._cacheIndex = r), (e[r] = s), e.pop(), this._removeInactiveBindingsForAction(i); } delete i[n]; } } uncacheRoot(t) { const e = t.uuid, n = this._actionsByClip; for (const t in n) { const i = n[t].actionByRoot[e]; void 0 !== i && (this._deactivateAction(i), this._removeInactiveAction(i)); } const i = this._bindingsByRootAndName[e]; if (void 0 !== i) for (const t in i) { const e = i[t]; e.restoreOriginalState(), this._removeInactiveBinding(e); } } uncacheAction(t, e) { const n = this.existingAction(t, e); null !== n && (this._deactivateAction(n), this._removeInactiveAction(n)); } } Yc.prototype._controlInterpolantsResultBuffer = new Float32Array(1); class Zc { constructor(t) { 'string' == typeof t && (console.warn('THREE.Uniform: Type parameter is no longer needed.'), (t = arguments[1])), (this.value = t); } clone() { return new Zc( void 0 === this.value.clone ? this.value : this.value.clone() ); } } class Jc extends Es { constructor(t, e, n = 1) { super(t, e), (this.meshPerAttribute = n || 1); } copy(t) { return super.copy(t), (this.meshPerAttribute = t.meshPerAttribute), this; } clone(t) { const e = super.clone(t); return (e.meshPerAttribute = this.meshPerAttribute), e; } toJSON(t) { const e = super.toJSON(t); return ( (e.isInstancedInterleavedBuffer = !0), (e.meshPerAttribute = this.meshPerAttribute), e ); } } Jc.prototype.isInstancedInterleavedBuffer = !0; class Qc { constructor(t, e, n, i, r) { (this.buffer = t), (this.type = e), (this.itemSize = n), (this.elementSize = i), (this.count = r), (this.version = 0); } set needsUpdate(t) { !0 === t && this.version++; } setBuffer(t) { return (this.buffer = t), this; } setType(t, e) { return (this.type = t), (this.elementSize = e), this; } setItemSize(t) { return (this.itemSize = t), this; } setCount(t) { return (this.count = t), this; } } Qc.prototype.isGLBufferAttribute = !0; function Kc(t, e) { return t.distance - e.distance; } function $c(t, e, n, i) { if ((t.layers.test(e.layers) && t.raycast(e, n), !0 === i)) { const i = t.children; for (let t = 0, r = i.length; t < r; t++) $c(i[t], e, n, !0); } } const th = new vt(); class eh { constructor(t = new vt(1 / 0, 1 / 0), e = new vt(-1 / 0, -1 / 0)) { (this.min = t), (this.max = e); } set(t, e) { return this.min.copy(t), this.max.copy(e), this; } setFromPoints(t) { this.makeEmpty(); for (let e = 0, n = t.length; e < n; e++) this.expandByPoint(t[e]); return this; } setFromCenterAndSize(t, e) { const n = th.copy(e).multiplyScalar(0.5); return this.min.copy(t).sub(n), this.max.copy(t).add(n), this; } clone() { return new this.constructor().copy(this); } copy(t) { return this.min.copy(t.min), this.max.copy(t.max), this; } makeEmpty() { return ( (this.min.x = this.min.y = 1 / 0), (this.max.x = this.max.y = -1 / 0), this ); } isEmpty() { return this.max.x < this.min.x || this.max.y < this.min.y; } getCenter(t) { return ( void 0 === t && (console.warn('THREE.Box2: .getCenter() target is now required'), (t = new vt())), this.isEmpty() ? t.set(0, 0) : t.addVectors(this.min, this.max).multiplyScalar(0.5) ); } getSize(t) { return ( void 0 === t && (console.warn('THREE.Box2: .getSize() target is now required'), (t = new vt())), this.isEmpty() ? t.set(0, 0) : t.subVectors(this.max, this.min) ); } expandByPoint(t) { return this.min.min(t), this.max.max(t), this; } expandByVector(t) { return this.min.sub(t), this.max.add(t), this; } expandByScalar(t) { return this.min.addScalar(-t), this.max.addScalar(t), this; } containsPoint(t) { return !( t.x < this.min.x || t.x > this.max.x || t.y < this.min.y || t.y > this.max.y ); } containsBox(t) { return ( this.min.x <= t.min.x && t.max.x <= this.max.x && this.min.y <= t.min.y && t.max.y <= this.max.y ); } getParameter(t, e) { return ( void 0 === e && (console.warn('THREE.Box2: .getParameter() target is now required'), (e = new vt())), e.set( (t.x - this.min.x) / (this.max.x - this.min.x), (t.y - this.min.y) / (this.max.y - this.min.y) ) ); } intersectsBox(t) { return !( t.max.x < this.min.x || t.min.x > this.max.x || t.max.y < this.min.y || t.min.y > this.max.y ); } clampPoint(t, e) { return ( void 0 === e && (console.warn('THREE.Box2: .clampPoint() target is now required'), (e = new vt())), e.copy(t).clamp(this.min, this.max) ); } distanceToPoint(t) { return th.copy(t).clamp(this.min, this.max).sub(t).length(); } intersect(t) { return this.min.max(t.min), this.max.min(t.max), this; } union(t) { return this.min.min(t.min), this.max.max(t.max), this; } translate(t) { return this.min.add(t), this.max.add(t), this; } equals(t) { return t.min.equals(this.min) && t.max.equals(this.max); } } eh.prototype.isBox2 = !0; const nh = new Lt(), ih = new Lt(); class rh { constructor(t = new Lt(), e = new Lt()) { (this.start = t), (this.end = e); } set(t, e) { return this.start.copy(t), this.end.copy(e), this; } copy(t) { return this.start.copy(t.start), this.end.copy(t.end), this; } getCenter(t) { return ( void 0 === t && (console.warn('THREE.Line3: .getCenter() target is now required'), (t = new Lt())), t.addVectors(this.start, this.end).multiplyScalar(0.5) ); } delta(t) { return ( void 0 === t && (console.warn('THREE.Line3: .delta() target is now required'), (t = new Lt())), t.subVectors(this.end, this.start) ); } distanceSq() { return this.start.distanceToSquared(this.end); } distance() { return this.start.distanceTo(this.end); } at(t, e) { return ( void 0 === e && (console.warn('THREE.Line3: .at() target is now required'), (e = new Lt())), this.delta(e).multiplyScalar(t).add(this.start) ); } closestPointToPointParameter(t, e) { nh.subVectors(t, this.start), ih.subVectors(this.end, this.start); const n = ih.dot(ih); let i = ih.dot(nh) / n; return e && (i = ht(i, 0, 1)), i; } closestPointToPoint(t, e, n) { const i = this.closestPointToPointParameter(t, e); return ( void 0 === n && (console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' ), (n = new Lt())), this.delta(n).multiplyScalar(i).add(this.start) ); } applyMatrix4(t) { return this.start.applyMatrix4(t), this.end.applyMatrix4(t), this; } equals(t) { return t.start.equals(this.start) && t.end.equals(this.end); } clone() { return new this.constructor().copy(this); } } class sh extends Ce { constructor(t) { super(), (this.material = t), (this.render = function () {}), (this.hasPositions = !1), (this.hasNormals = !1), (this.hasColors = !1), (this.hasUvs = !1), (this.positionArray = null), (this.normalArray = null), (this.colorArray = null), (this.uvArray = null), (this.count = 0); } } sh.prototype.isImmediateRenderObject = !0; const ah = new Lt(); const oh = new Lt(), lh = new se(), ch = new se(); class hh extends ya { constructor(t) { const e = uh(t), n = new En(), i = [], r = [], s = new tn(0, 0, 1), a = new tn(0, 1, 0); for (let t = 0; t < e.length; t++) { const n = e[t]; n.parent && n.parent.isBone && (i.push(0, 0, 0), i.push(0, 0, 0), r.push(s.r, s.g, s.b), r.push(a.r, a.g, a.b)); } n.setAttribute('position', new mn(i, 3)), n.setAttribute('color', new mn(r, 3)); super( n, new ca({ vertexColors: !0, depthTest: !1, depthWrite: !1, toneMapped: !1, transparent: !0, }) ), (this.type = 'SkeletonHelper'), (this.isSkeletonHelper = !0), (this.root = t), (this.bones = e), (this.matrix = t.matrixWorld), (this.matrixAutoUpdate = !1); } updateMatrixWorld(t) { const e = this.bones, n = this.geometry, i = n.getAttribute('position'); ch.copy(this.root.matrixWorld).invert(); for (let t = 0, n = 0; t < e.length; t++) { const r = e[t]; r.parent && r.parent.isBone && (lh.multiplyMatrices(ch, r.matrixWorld), oh.setFromMatrixPosition(lh), i.setXYZ(n, oh.x, oh.y, oh.z), lh.multiplyMatrices(ch, r.parent.matrixWorld), oh.setFromMatrixPosition(lh), i.setXYZ(n + 1, oh.x, oh.y, oh.z), (n += 2)); } (n.getAttribute('position').needsUpdate = !0), super.updateMatrixWorld(t); } } function uh(t) { const e = []; t && t.isBone && e.push(t); for (let n = 0; n < t.children.length; n++) e.push.apply(e, uh(t.children[n])); return e; } const dh = new Lt(), ph = new tn(), mh = new tn(); class fh extends ya { constructor(t = 10, e = 10, n = 4473924, i = 8947848) { (n = new tn(n)), (i = new tn(i)); const r = e / 2, s = t / e, a = t / 2, o = [], l = []; for (let t = 0, c = 0, h = -a; t <= e; t++, h += s) { o.push(-a, 0, h, a, 0, h), o.push(h, 0, -a, h, 0, a); const e = t === r ? n : i; e.toArray(l, c), (c += 3), e.toArray(l, c), (c += 3), e.toArray(l, c), (c += 3), e.toArray(l, c), (c += 3); } const c = new En(); c.setAttribute('position', new mn(o, 3)), c.setAttribute('color', new mn(l, 3)); super(c, new ca({ vertexColors: !0, toneMapped: !1 })), (this.type = 'GridHelper'); } } const gh = new Lt(), vh = new Lt(), yh = new Lt(); const xh = new Lt(), _h = new Qn(); function wh(t, e, n, i, r, s, a) { xh.set(r, s, a).unproject(i); const o = e[t]; if (void 0 !== o) { const t = n.getAttribute('position'); for (let e = 0, n = o.length; e < n; e++) t.setXYZ(o[e], xh.x, xh.y, xh.z); } } const bh = new Pt(); class Mh extends ya { constructor(t, e = 16776960) { const n = 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, ]), i = new Float32Array(24), r = new En(); r.setIndex(new sn(n, 1)), r.setAttribute('position', new sn(i, 3)), super(r, new ca({ color: e, toneMapped: !1 })), (this.object = t), (this.type = 'BoxHelper'), (this.matrixAutoUpdate = !1), this.update(); } update(t) { if ( (void 0 !== t && console.warn('THREE.BoxHelper: .update() has no longer arguments.'), void 0 !== this.object && bh.setFromObject(this.object), bh.isEmpty()) ) return; const e = bh.min, n = bh.max, i = this.geometry.attributes.position, r = i.array; (r[0] = n.x), (r[1] = n.y), (r[2] = n.z), (r[3] = e.x), (r[4] = n.y), (r[5] = n.z), (r[6] = e.x), (r[7] = e.y), (r[8] = n.z), (r[9] = n.x), (r[10] = e.y), (r[11] = n.z), (r[12] = n.x), (r[13] = n.y), (r[14] = e.z), (r[15] = e.x), (r[16] = n.y), (r[17] = e.z), (r[18] = e.x), (r[19] = e.y), (r[20] = e.z), (r[21] = n.x), (r[22] = e.y), (r[23] = e.z), (i.needsUpdate = !0), this.geometry.computeBoundingSphere(); } setFromObject(t) { return (this.object = t), this.update(), this; } copy(t) { return ya.prototype.copy.call(this, t), (this.object = t.object), this; } } const Sh = new Lt(); let Th, Eh; class Ah extends ya { constructor(t = 1) { const e = [0, 0, 0, t, 0, 0, 0, 0, 0, 0, t, 0, 0, 0, 0, 0, 0, t], n = new En(); n.setAttribute('position', new mn(e, 3)), n.setAttribute( 'color', new mn( [1, 0, 0, 1, 0.6, 0, 0, 1, 0, 0.6, 1, 0, 0, 0, 1, 0, 0.6, 1], 3 ) ); super(n, new ca({ vertexColors: !0, toneMapped: !1 })), (this.type = 'AxesHelper'); } dispose() { this.geometry.dispose(), this.material.dispose(); } } const Lh = new Float32Array(1), Rh = new Int32Array(Lh.buffer); const Ch = Math.pow(2, 8), Ph = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582], Dh = 5 + Ph.length, Ih = 20, Nh = { [X]: 0, [Y]: 1, [J]: 2, [Q]: 3, [K]: 4, [$]: 5, [Z]: 6 }, Bh = new en({ side: 1, depthWrite: !1, depthTest: !1 }), zh = new Wn(new qn(), Bh), Fh = new Jl(), { _lodPlanes: Oh, _sizeLods: Hh, _sigmas: Gh } = Yh(), Uh = new tn(); let kh = null; const Vh = (1 + Math.sqrt(5)) / 2, Wh = 1 / Vh, jh = [ new Lt(1, 1, 1), new Lt(-1, 1, 1), new Lt(1, 1, -1), new Lt(-1, 1, -1), new Lt(0, Vh, Wh), new Lt(0, Vh, -Wh), new Lt(Wh, 0, Vh), new Lt(-Wh, 0, Vh), new Lt(Vh, Wh, 0), new Lt(-Vh, Wh, 0), ]; function qh(t) { const e = Math.max(t.r, t.g, t.b), n = Math.min(Math.max(Math.ceil(Math.log2(e)), -128), 127); t.multiplyScalar(Math.pow(2, -n)); return (n + 128) / 255; } function Xh(t) { return ( void 0 !== t && t.type === x && (t.encoding === X || t.encoding === Y || t.encoding === Z) ); } function Yh() { const t = [], e = [], n = []; let i = 8; for (let r = 0; r < Dh; r++) { const s = Math.pow(2, i); e.push(s); let a = 1 / s; r > 4 ? (a = Ph[r - 8 + 4 - 1]) : 0 == r && (a = 0), n.push(a); const o = 1 / (s - 1), l = -o / 2, c = 1 + o / 2, h = [l, l, c, l, c, c, l, l, c, c, l, c], u = 6, d = 6, p = 3, m = 2, f = 1, g = new Float32Array(p * d * u), v = new Float32Array(m * d * u), y = new Float32Array(f * d * u); for (let t = 0; t < u; t++) { const e = ((t % 3) * 2) / 3 - 1, n = t > 2 ? 0 : -1, i = [ e, n, 0, e + 2 / 3, n, 0, e + 2 / 3, n + 1, 0, e, n, 0, e + 2 / 3, n + 1, 0, e, n + 1, 0, ]; g.set(i, p * d * t), v.set(h, m * d * t); const r = [t, t, t, t, t, t]; y.set(r, f * d * t); } const x = new En(); x.setAttribute('position', new sn(g, p)), x.setAttribute('uv', new sn(v, m)), x.setAttribute('faceIndex', new sn(y, f)), t.push(x), i > 4 && i--; } return { _lodPlanes: t, _sizeLods: e, _sigmas: n }; } function Zh(t) { const e = new Tt(3 * Ch, 3 * Ch, t); return ( (e.texture.mapping = l), (e.texture.name = 'PMREM.cubeUv'), (e.scissorTest = !0), e ); } function Jh(t, e, n, i, r) { t.viewport.set(e, n, i, r), t.scissor.set(e, n, i, r); } function Qh() { const t = new vt(1, 1); return new Io({ name: 'EquirectangularToCubeUV', uniforms: { envMap: { value: null }, texelSize: { value: t }, inputEncoding: { value: Nh[3e3] }, outputEncoding: { value: Nh[3e3] }, }, vertexShader: $h(), fragmentShader: `\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${tu()}\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`, blending: 0, depthTest: !1, depthWrite: !1, }); } function Kh() { return new Io({ name: 'CubemapToCubeUV', uniforms: { envMap: { value: null }, inputEncoding: { value: Nh[3e3] }, outputEncoding: { value: Nh[3e3] }, }, vertexShader: $h(), fragmentShader: `\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${tu()}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`, blending: 0, depthTest: !1, depthWrite: !1, }); } function $h() { return '\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t'; } function tu() { return '\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t'; } (ml.create = function (t, e) { return ( console.log('THREE.Curve.create() has been deprecated'), (t.prototype = Object.create(ml.prototype)), (t.prototype.constructor = t), (t.prototype.getPoint = e), t ); }), (Bl.prototype.fromPoints = function (t) { return ( console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ), this.setFromPoints(t) ); }), (fh.prototype.setColors = function () { console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); }), (hh.prototype.update = function () { console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); }), (ol.prototype.extractUrlBase = function (t) { return ( console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ), rc.extractUrlBase(t) ); }), (ol.Handlers = { add: function () { console.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' ); }, get: function () { console.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' ); }, }), (eh.prototype.center = function (t) { return ( console.warn('THREE.Box2: .center() has been renamed to .getCenter().'), this.getCenter(t) ); }), (eh.prototype.empty = function () { return ( console.warn('THREE.Box2: .empty() has been renamed to .isEmpty().'), this.isEmpty() ); }), (eh.prototype.isIntersectionBox = function (t) { return ( console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ), this.intersectsBox(t) ); }), (eh.prototype.size = function (t) { return ( console.warn('THREE.Box2: .size() has been renamed to .getSize().'), this.getSize(t) ); }), (Pt.prototype.center = function (t) { return ( console.warn('THREE.Box3: .center() has been renamed to .getCenter().'), this.getCenter(t) ); }), (Pt.prototype.empty = function () { return ( console.warn('THREE.Box3: .empty() has been renamed to .isEmpty().'), this.isEmpty() ); }), (Pt.prototype.isIntersectionBox = function (t) { return ( console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ), this.intersectsBox(t) ); }), (Pt.prototype.isIntersectionSphere = function (t) { return ( console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ), this.intersectsSphere(t) ); }), (Pt.prototype.size = function (t) { return ( console.warn('THREE.Box3: .size() has been renamed to .getSize().'), this.getSize(t) ); }), (Jt.prototype.empty = function () { return ( console.warn('THREE.Sphere: .empty() has been renamed to .isEmpty().'), this.isEmpty() ); }), (ai.prototype.setFromMatrix = function (t) { return ( console.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' ), this.setFromProjectionMatrix(t) ); }), (rh.prototype.center = function (t) { return ( console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ), this.getCenter(t) ); }), (yt.prototype.flattenToArrayOffset = function (t, e) { return ( console.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' ), this.toArray(t, e) ); }), (yt.prototype.multiplyVector3 = function (t) { return ( console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ), t.applyMatrix3(this) ); }), (yt.prototype.multiplyVector3Array = function () { console.error('THREE.Matrix3: .multiplyVector3Array() has been removed.'); }), (yt.prototype.applyToBufferAttribute = function (t) { return ( console.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' ), t.applyMatrix3(this) ); }), (yt.prototype.applyToVector3Array = function () { console.error('THREE.Matrix3: .applyToVector3Array() has been removed.'); }), (yt.prototype.getInverse = function (t) { return ( console.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' ), this.copy(t).invert() ); }), (se.prototype.extractPosition = function (t) { return ( console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ), this.copyPosition(t) ); }), (se.prototype.flattenToArrayOffset = function (t, e) { return ( console.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' ), this.toArray(t, e) ); }), (se.prototype.getPosition = function () { return ( console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ), new Lt().setFromMatrixColumn(this, 3) ); }), (se.prototype.setRotationFromQuaternion = function (t) { return ( console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ), this.makeRotationFromQuaternion(t) ); }), (se.prototype.multiplyToArray = function () { console.warn('THREE.Matrix4: .multiplyToArray() has been removed.'); }), (se.prototype.multiplyVector3 = function (t) { return ( console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ), t.applyMatrix4(this) ); }), (se.prototype.multiplyVector4 = function (t) { return ( console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ), t.applyMatrix4(this) ); }), (se.prototype.multiplyVector3Array = function () { console.error('THREE.Matrix4: .multiplyVector3Array() has been removed.'); }), (se.prototype.rotateAxis = function (t) { console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ), t.transformDirection(this); }), (se.prototype.crossVector = function (t) { return ( console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ), t.applyMatrix4(this) ); }), (se.prototype.translate = function () { console.error('THREE.Matrix4: .translate() has been removed.'); }), (se.prototype.rotateX = function () { console.error('THREE.Matrix4: .rotateX() has been removed.'); }), (se.prototype.rotateY = function () { console.error('THREE.Matrix4: .rotateY() has been removed.'); }), (se.prototype.rotateZ = function () { console.error('THREE.Matrix4: .rotateZ() has been removed.'); }), (se.prototype.rotateByAxis = function () { console.error('THREE.Matrix4: .rotateByAxis() has been removed.'); }), (se.prototype.applyToBufferAttribute = function (t) { return ( console.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' ), t.applyMatrix4(this) ); }), (se.prototype.applyToVector3Array = function () { console.error('THREE.Matrix4: .applyToVector3Array() has been removed.'); }), (se.prototype.makeFrustum = function (t, e, n, i, r, s) { return ( console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ), this.makePerspective(t, e, i, n, r, s) ); }), (se.prototype.getInverse = function (t) { return ( console.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' ), this.copy(t).invert() ); }), (Ne.prototype.isIntersectionLine = function (t) { return ( console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ), this.intersectsLine(t) ); }), (At.prototype.multiplyVector3 = function (t) { return ( console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ), t.applyQuaternion(this) ); }), (At.prototype.inverse = function () { return ( console.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' ), this.invert() ); }), (re.prototype.isIntersectionBox = function (t) { return ( console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ), this.intersectsBox(t) ); }), (re.prototype.isIntersectionPlane = function (t) { return ( console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ), this.intersectsPlane(t) ); }), (re.prototype.isIntersectionSphere = function (t) { return ( console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ), this.intersectsSphere(t) ); }), (je.prototype.area = function () { return ( console.warn('THREE.Triangle: .area() has been renamed to .getArea().'), this.getArea() ); }), (je.prototype.barycoordFromPoint = function (t, e) { return ( console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ), this.getBarycoord(t, e) ); }), (je.prototype.midpoint = function (t) { return ( console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ), this.getMidpoint(t) ); }), (je.prototypenormal = function (t) { return ( console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ), this.getNormal(t) ); }), (je.prototype.plane = function (t) { return ( console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ), this.getPlane(t) ); }), (je.barycoordFromPoint = function (t, e, n, i, r) { return ( console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ), je.getBarycoord(t, e, n, i, r) ); }), (je.normal = function (t, e, n, i) { return ( console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ), je.getNormal(t, e, n, i) ); }), (zl.prototype.extractAllPoints = function (t) { return ( console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ), this.extractPoints(t) ); }), (zl.prototype.extrude = function (t) { return ( console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ), new go(this, t) ); }), (zl.prototype.makeGeometry = function (t) { return ( console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ), new Mo(this, t) ); }), (vt.prototype.fromAttribute = function (t, e, n) { return ( console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ), this.fromBufferAttribute(t, e, n) ); }), (vt.prototype.distanceToManhattan = function (t) { return ( console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ), this.manhattanDistanceTo(t) ); }), (vt.prototype.lengthManhattan = function () { return ( console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ), this.manhattanLength() ); }), (Lt.prototype.setEulerFromRotationMatrix = function () { console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); }), (Lt.prototype.setEulerFromQuaternion = function () { console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); }), (Lt.prototype.getPositionFromMatrix = function (t) { return ( console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ), this.setFromMatrixPosition(t) ); }), (Lt.prototype.getScaleFromMatrix = function (t) { return ( console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ), this.setFromMatrixScale(t) ); }), (Lt.prototype.getColumnFromMatrix = function (t, e) { return ( console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ), this.setFromMatrixColumn(e, t) ); }), (Lt.prototype.applyProjection = function (t) { return ( console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ), this.applyMatrix4(t) ); }), (Lt.prototype.fromAttribute = function (t, e, n) { return ( console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ), this.fromBufferAttribute(t, e, n) ); }), (Lt.prototype.distanceToManhattan = function (t) { return ( console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ), this.manhattanDistanceTo(t) ); }), (Lt.prototype.lengthManhattan = function () { return ( console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ), this.manhattanLength() ); }), (St.prototype.fromAttribute = function (t, e, n) { return ( console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ), this.fromBufferAttribute(t, e, n) ); }), (St.prototype.lengthManhattan = function () { return ( console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ), this.manhattanLength() ); }), (Ce.prototype.getChildByName = function (t) { return ( console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ), this.getObjectByName(t) ); }), (Ce.prototype.renderDepth = function () { console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); }), (Ce.prototype.translate = function (t, e) { return ( console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ), this.translateOnAxis(e, t) ); }), (Ce.prototype.getWorldRotation = function () { console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); }), (Ce.prototype.applyMatrix = function (t) { return ( console.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' ), this.applyMatrix4(t) ); }), Object.defineProperties(Ce.prototype, { eulerOrder: { get: function () { return ( console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.'), this.rotation.order ); }, set: function (t) { console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.'), (this.rotation.order = t); }, }, useQuaternion: { get: function () { console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); }, set: function () { console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); }, }, }), (Wn.prototype.setDrawMode = function () { console.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' ); }), Object.defineProperties(Wn.prototype, { drawMode: { get: function () { return ( console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' ), 0 ); }, set: function () { console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' ); }, }, }), ($s.prototype.initBones = function () { console.error('THREE.SkinnedMesh: initBones() has been removed.'); }), (Kn.prototype.setLens = function (t, e) { console.warn( 'THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.' ), void 0 !== e && (this.filmGauge = e), this.setFocalLength(t); }), Object.defineProperties(Fl.prototype, { onlyShadow: { set: function () { console.warn('THREE.Light: .onlyShadow has been removed.'); }, }, shadowCameraFov: { set: function (t) { console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ), (this.shadow.camera.fov = t); }, }, shadowCameraLeft: { set: function (t) { console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ), (this.shadow.camera.left = t); }, }, shadowCameraRight: { set: function (t) { console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ), (this.shadow.camera.right = t); }, }, shadowCameraTop: { set: function (t) { console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ), (this.shadow.camera.top = t); }, }, shadowCameraBottom: { set: function (t) { console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ), (this.shadow.camera.bottom = t); }, }, shadowCameraNear: { set: function (t) { console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ), (this.shadow.camera.near = t); }, }, shadowCameraFar: { set: function (t) { console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ), (this.shadow.camera.far = t); }, }, shadowCameraVisible: { set: function () { console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); }, }, shadowBias: { set: function (t) { console.warn('THREE.Light: .shadowBias is now .shadow.bias.'), (this.shadow.bias = t); }, }, shadowDarkness: { set: function () { console.warn('THREE.Light: .shadowDarkness has been removed.'); }, }, shadowMapWidth: { set: function (t) { console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ), (this.shadow.mapSize.width = t); }, }, shadowMapHeight: { set: function (t) { console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ), (this.shadow.mapSize.height = t); }, }, }), Object.defineProperties(sn.prototype, { length: { get: function () { return ( console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ), this.array.length ); }, }, dynamic: { get: function () { return ( console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' ), this.usage === nt ); }, set: function () { console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' ), this.setUsage(nt); }, }, }), (sn.prototype.setDynamic = function (t) { return ( console.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' ), this.setUsage(!0 === t ? nt : et), this ); }), (sn.prototype.copyIndicesArray = function () { console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); }), (sn.prototype.setArray = function () { console.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' ); }), (En.prototype.addIndex = function (t) { console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ), this.setIndex(t); }), (En.prototype.addAttribute = function (t, e) { return ( console.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' ), (e && e.isBufferAttribute) || (e && e.isInterleavedBufferAttribute) ? 'index' === t ? (console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ), this.setIndex(e), this) : this.setAttribute(t, e) : (console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ), this.setAttribute(t, new sn(arguments[1], arguments[2]))) ); }), (En.prototype.addDrawCall = function (t, e, n) { void 0 !== n && console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ), console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ), this.addGroup(t, e); }), (En.prototype.clearDrawCalls = function () { console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ), this.clearGroups(); }), (En.prototype.computeOffsets = function () { console.warn('THREE.BufferGeometry: .computeOffsets() has been removed.'); }), (En.prototype.removeAttribute = function (t) { return ( console.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' ), this.deleteAttribute(t) ); }), (En.prototype.applyMatrix = function (t) { return ( console.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' ), this.applyMatrix4(t) ); }), Object.defineProperties(En.prototype, { drawcalls: { get: function () { return ( console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ), this.groups ); }, }, offsets: { get: function () { return ( console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ), this.groups ); }, }, }), (Es.prototype.setDynamic = function (t) { return ( console.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' ), this.setUsage(!0 === t ? nt : et), this ); }), (Es.prototype.setArray = function () { console.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' ); }), (go.prototype.getArrays = function () { console.error('THREE.ExtrudeGeometry: .getArrays() has been removed.'); }), (go.prototype.addShapeList = function () { console.error('THREE.ExtrudeGeometry: .addShapeList() has been removed.'); }), (go.prototype.addShape = function () { console.error('THREE.ExtrudeGeometry: .addShape() has been removed.'); }), (Ts.prototype.dispose = function () { console.error('THREE.Scene: .dispose() has been removed.'); }), (Zc.prototype.onUpdate = function () { return ( console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ), this ); }), Object.defineProperties(Xe.prototype, { wrapAround: { get: function () { console.warn('THREE.Material: .wrapAround has been removed.'); }, set: function () { console.warn('THREE.Material: .wrapAround has been removed.'); }, }, overdraw: { get: function () { console.warn('THREE.Material: .overdraw has been removed.'); }, set: function () { console.warn('THREE.Material: .overdraw has been removed.'); }, }, wrapRGB: { get: function () { return ( console.warn('THREE.Material: .wrapRGB has been removed.'), new tn() ); }, }, shading: { get: function () { console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); }, set: function (t) { console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ), (this.flatShading = 1 === t); }, }, stencilMask: { get: function () { return ( console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' ), this.stencilFuncMask ); }, set: function (t) { console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' ), (this.stencilFuncMask = t); }, }, }), Object.defineProperties(Jn.prototype, { derivatives: { get: function () { return ( console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ), this.extensions.derivatives ); }, set: function (t) { console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ), (this.extensions.derivatives = t); }, }, }), (ws.prototype.clearTarget = function (t, e, n, i) { console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' ), this.setRenderTarget(t), this.clear(e, n, i); }), (ws.prototype.animate = function (t) { console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' ), this.setAnimationLoop(t); }), (ws.prototype.getCurrentRenderTarget = function () { return ( console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ), this.getRenderTarget() ); }), (ws.prototype.getMaxAnisotropy = function () { return ( console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ), this.capabilities.getMaxAnisotropy() ); }), (ws.prototype.getPrecision = function () { return ( console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ), this.capabilities.precision ); }), (ws.prototype.resetGLState = function () { return ( console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ), this.state.reset() ); }), (ws.prototype.supportsFloatTextures = function () { return ( console.warn( "THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )." ), this.extensions.get('OES_texture_float') ); }), (ws.prototype.supportsHalfFloatTextures = function () { return ( console.warn( "THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )." ), this.extensions.get('OES_texture_half_float') ); }), (ws.prototype.supportsStandardDerivatives = function () { return ( console.warn( "THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )." ), this.extensions.get('OES_standard_derivatives') ); }), (ws.prototype.supportsCompressedTextureS3TC = function () { return ( console.warn( "THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )." ), this.extensions.get('WEBGL_compressed_texture_s3tc') ); }), (ws.prototype.supportsCompressedTexturePVRTC = function () { return ( console.warn( "THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )." ), this.extensions.get('WEBGL_compressed_texture_pvrtc') ); }), (ws.prototype.supportsBlendMinMax = function () { return ( console.warn( "THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )." ), this.extensions.get('EXT_blend_minmax') ); }), (ws.prototype.supportsVertexTextures = function () { return ( console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ), this.capabilities.vertexTextures ); }), (ws.prototype.supportsInstancedArrays = function () { return ( console.warn( "THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )." ), this.extensions.get('ANGLE_instanced_arrays') ); }), (ws.prototype.enableScissorTest = function (t) { console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ), this.setScissorTest(t); }), (ws.prototype.initMaterial = function () { console.warn('THREE.WebGLRenderer: .initMaterial() has been removed.'); }), (ws.prototype.addPrePlugin = function () { console.warn('THREE.WebGLRenderer: .addPrePlugin() has been removed.'); }), (ws.prototype.addPostPlugin = function () { console.warn('THREE.WebGLRenderer: .addPostPlugin() has been removed.'); }), (ws.prototype.updateShadowMap = function () { console.warn('THREE.WebGLRenderer: .updateShadowMap() has been removed.'); }), (ws.prototype.setFaceCulling = function () { console.warn('THREE.WebGLRenderer: .setFaceCulling() has been removed.'); }), (ws.prototype.allocTextureUnit = function () { console.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' ); }), (ws.prototype.setTexture = function () { console.warn('THREE.WebGLRenderer: .setTexture() has been removed.'); }), (ws.prototype.setTexture2D = function () { console.warn('THREE.WebGLRenderer: .setTexture2D() has been removed.'); }), (ws.prototype.setTextureCube = function () { console.warn('THREE.WebGLRenderer: .setTextureCube() has been removed.'); }), (ws.prototype.getActiveMipMapLevel = function () { return ( console.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' ), this.getActiveMipmapLevel() ); }), Object.defineProperties(ws.prototype, { shadowMapEnabled: { get: function () { return this.shadowMap.enabled; }, set: function (t) { console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ), (this.shadowMap.enabled = t); }, }, shadowMapType: { get: function () { return this.shadowMap.type; }, set: function (t) { console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ), (this.shadowMap.type = t); }, }, shadowMapCullFace: { get: function () { console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); }, set: function () { console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); }, }, context: { get: function () { return ( console.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' ), this.getContext() ); }, }, vr: { get: function () { return ( console.warn('THREE.WebGLRenderer: .vr has been renamed to .xr'), this.xr ); }, }, gammaInput: { get: function () { return ( console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' ), !1 ); }, set: function () { console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' ); }, }, gammaOutput: { get: function () { return ( console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' ), !1 ); }, set: function (t) { console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' ), (this.outputEncoding = !0 === t ? Y : X); }, }, toneMappingWhitePoint: { get: function () { return ( console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' ), 1 ); }, set: function () { console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' ); }, }, }), Object.defineProperties(us.prototype, { cullFace: { get: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); }, set: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); }, }, renderReverseSided: { get: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); }, set: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); }, }, renderSingleSided: { get: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); }, set: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); }, }, }), Object.defineProperties(Tt.prototype, { wrapS: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ), this.texture.wrapS ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ), (this.texture.wrapS = t); }, }, wrapT: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ), this.texture.wrapT ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ), (this.texture.wrapT = t); }, }, magFilter: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ), this.texture.magFilter ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ), (this.texture.magFilter = t); }, }, minFilter: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ), this.texture.minFilter ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ), (this.texture.minFilter = t); }, }, anisotropy: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ), this.texture.anisotropy ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ), (this.texture.anisotropy = t); }, }, offset: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ), this.texture.offset ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ), (this.texture.offset = t); }, }, repeat: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ), this.texture.repeat ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ), (this.texture.repeat = t); }, }, format: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ), this.texture.format ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ), (this.texture.format = t); }, }, type: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ), this.texture.type ); }, set: function (t) { console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.'), (this.texture.type = t); }, }, generateMipmaps: { get: function () { return ( console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ), this.texture.generateMipmaps ); }, set: function (t) { console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ), (this.texture.generateMipmaps = t); }, }, }), (Lc.prototype.load = function (t) { console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); const e = this; return ( new vc().load(t, function (t) { e.setBuffer(t); }), this ); }), (Ic.prototype.getData = function () { return ( console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ), this.getFrequencyData() ); }), (ti.prototype.updateCubeMap = function (t, e) { return ( console.warn('THREE.CubeCamera: .updateCubeMap() is now .update().'), this.update(t, e) ); }), (ti.prototype.clear = function (t, e, n, i) { return ( console.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' ), this.renderTarget.clear(t, e, n, i) ); }), (_t.crossOrigin = void 0), (_t.loadTexture = function (t, e, n, i) { console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); const r = new pl(); r.setCrossOrigin(this.crossOrigin); const s = r.load(t, n, void 0, i); return e && (s.mapping = e), s; }), (_t.loadTextureCube = function (t, e, n, i) { console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); const r = new ul(); r.setCrossOrigin(this.crossOrigin); const s = r.load(t, n, void 0, i); return e && (s.mapping = e), s; }), (_t.loadCompressedTexture = function () { console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); }), (_t.loadCompressedTextureCube = function () { console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); }); const eu = { createMultiMaterialObject: function () { console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); }, detach: function () { console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); }, attach: function () { console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); }, }; 'undefined' != typeof __THREE_DEVTOOLS__ && __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent('register', { detail: { revision: e } }) ), 'undefined' != typeof window && (window.__THREE__ ? console.warn( 'WARNING: Multiple instances of Three.js being imported.' ) : (window.__THREE__ = e)), (t.ACESFilmicToneMapping = 4), (t.AddEquation = n), (t.AddOperation = 2), (t.AdditiveAnimationBlendMode = q), (t.AdditiveBlending = 2), (t.AlphaFormat = 1021), (t.AlwaysDepth = 1), (t.AlwaysStencilFunc = 519), (t.AmbientLight = $l), (t.AmbientLightProbe = xc), (t.AnimationClip = nl), (t.AnimationLoader = class extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = this, s = new cl(this.manager); s.setPath(this.path), s.setRequestHeader(this.requestHeader), s.setWithCredentials(this.withCredentials), s.load( t, function (n) { try { e(r.parse(JSON.parse(n))); } catch (e) { i ? i(e) : console.error(e), r.manager.itemError(t); } }, n, i ); } parse(t) { const e = []; for (let n = 0; n < t.length; n++) { const i = nl.parse(t[n]); e.push(i); } return e; } }), (t.AnimationMixer = Yc), (t.AnimationObjectGroup = qc), (t.AnimationUtils = Vo), (t.ArcCurve = gl), (t.ArrayCamera = fs), (t.ArrowHelper = class extends Ce { constructor( t = new Lt(0, 0, 1), e = new Lt(0, 0, 0), n = 1, i = 16776960, r = 0.2 * n, s = 0.2 * r ) { super(), (this.type = 'ArrowHelper'), void 0 === Th && ((Th = new En()), Th.setAttribute('position', new mn([0, 0, 0, 0, 1, 0], 3)), (Eh = new Da(0, 0.5, 1, 5, 1)), Eh.translate(0, -0.5, 0)), this.position.copy(e), (this.line = new fa(Th, new ca({ color: i, toneMapped: !1 }))), (this.line.matrixAutoUpdate = !1), this.add(this.line), (this.cone = new Wn(Eh, new en({ color: i, toneMapped: !1 }))), (this.cone.matrixAutoUpdate = !1), this.add(this.cone), this.setDirection(t), this.setLength(n, r, s); } setDirection(t) { if (t.y > 0.99999) this.quaternion.set(0, 0, 0, 1); else if (t.y < -0.99999) this.quaternion.set(1, 0, 0, 0); else { Sh.set(t.z, 0, -t.x).normalize(); const e = Math.acos(t.y); this.quaternion.setFromAxisAngle(Sh, e); } } setLength(t, e = 0.2 * t, n = 0.2 * e) { this.line.scale.set(1, Math.max(1e-4, t - e), 1), this.line.updateMatrix(), this.cone.scale.set(n, e, n), (this.cone.position.y = t), this.cone.updateMatrix(); } setColor(t) { this.line.material.color.set(t), this.cone.material.color.set(t); } copy(t) { return ( super.copy(t, !1), this.line.copy(t.line), this.cone.copy(t.cone), this ); } }), (t.Audio = Lc), (t.AudioAnalyser = Ic), (t.AudioContext = gc), (t.AudioListener = class extends Ce { constructor() { super(), (this.type = 'AudioListener'), (this.context = gc.getContext()), (this.gain = this.context.createGain()), this.gain.connect(this.context.destination), (this.filter = null), (this.timeDelta = 0), (this._clock = new bc()); } getInput() { return this.gain; } removeFilter() { return ( null !== this.filter && (this.gain.disconnect(this.filter), this.filter.disconnect(this.context.destination), this.gain.connect(this.context.destination), (this.filter = null)), this ); } getFilter() { return this.filter; } setFilter(t) { return ( null !== this.filter ? (this.gain.disconnect(this.filter), this.filter.disconnect(this.context.destination)) : this.gain.disconnect(this.context.destination), (this.filter = t), this.gain.connect(this.filter), this.filter.connect(this.context.destination), this ); } getMasterVolume() { return this.gain.gain.value; } setMasterVolume(t) { return ( this.gain.gain.setTargetAtTime(t, this.context.currentTime, 0.01), this ); } updateMatrixWorld(t) { super.updateMatrixWorld(t); const e = this.context.listener, n = this.up; if ( ((this.timeDelta = this._clock.getDelta()), this.matrixWorld.decompose(Sc, Tc, Ec), Ac.set(0, 0, -1).applyQuaternion(Tc), e.positionX) ) { const t = this.context.currentTime + this.timeDelta; e.positionX.linearRampToValueAtTime(Sc.x, t), e.positionY.linearRampToValueAtTime(Sc.y, t), e.positionZ.linearRampToValueAtTime(Sc.z, t), e.forwardX.linearRampToValueAtTime(Ac.x, t), e.forwardY.linearRampToValueAtTime(Ac.y, t), e.forwardZ.linearRampToValueAtTime(Ac.z, t), e.upX.linearRampToValueAtTime(n.x, t), e.upY.linearRampToValueAtTime(n.y, t), e.upZ.linearRampToValueAtTime(n.z, t); } else e.setPosition(Sc.x, Sc.y, Sc.z), e.setOrientation(Ac.x, Ac.y, Ac.z, n.x, n.y, n.z); } }), (t.AudioLoader = vc), (t.AxesHelper = Ah), (t.AxisHelper = function (t) { return ( console.warn('THREE.AxisHelper has been renamed to THREE.AxesHelper.'), new Ah(t) ); }), (t.BackSide = 1), (t.BasicDepthPacking = 3200), (t.BasicShadowMap = 0), (t.BinaryTextureLoader = function (t) { return ( console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ), new dl(t) ); }), (t.Bone = ta), (t.BooleanKeyframeTrack = Zo), (t.BoundingBoxHelper = function (t, e) { return ( console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ), new Mh(t, e) ); }), (t.Box2 = eh), (t.Box3 = Pt), (t.Box3Helper = class extends ya { constructor(t, e = 16776960) { const n = 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, ]), i = new En(); i.setIndex(new sn(n, 1)), i.setAttribute( 'position', new mn( [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, ], 3 ) ), super(i, new ca({ color: e, toneMapped: !1 })), (this.box = t), (this.type = 'Box3Helper'), this.geometry.computeBoundingSphere(); } updateMatrixWorld(t) { const e = this.box; e.isEmpty() || (e.getCenter(this.position), e.getSize(this.scale), this.scale.multiplyScalar(0.5), super.updateMatrixWorld(t)); } }), (t.BoxBufferGeometry = qn), (t.BoxGeometry = qn), (t.BoxHelper = Mh), (t.BufferAttribute = sn), (t.BufferGeometry = En), (t.BufferGeometryLoader = oc), (t.ByteType = 1010), (t.Cache = rl), (t.Camera = Qn), (t.CameraHelper = class extends ya { constructor(t) { const e = new En(), n = new ca({ color: 16777215, vertexColors: !0, toneMapped: !1 }), i = [], r = [], s = {}, a = new tn(16755200), o = new tn(16711680), l = new tn(43775), c = new tn(16777215), h = new tn(3355443); function u(t, e, n) { d(t, n), d(e, n); } function d(t, e) { i.push(0, 0, 0), r.push(e.r, e.g, e.b), void 0 === s[t] && (s[t] = []), s[t].push(i.length / 3 - 1); } u('n1', 'n2', a), u('n2', 'n4', a), u('n4', 'n3', a), u('n3', 'n1', a), u('f1', 'f2', a), u('f2', 'f4', a), u('f4', 'f3', a), u('f3', 'f1', a), u('n1', 'f1', a), u('n2', 'f2', a), u('n3', 'f3', a), u('n4', 'f4', a), u('p', 'n1', o), u('p', 'n2', o), u('p', 'n3', o), u('p', 'n4', o), u('u1', 'u2', l), u('u2', 'u3', l), u('u3', 'u1', l), u('c', 't', c), u('p', 'c', h), u('cn1', 'cn2', h), u('cn3', 'cn4', h), u('cf1', 'cf2', h), u('cf3', 'cf4', h), e.setAttribute('position', new mn(i, 3)), e.setAttribute('color', new mn(r, 3)), super(e, n), (this.type = 'CameraHelper'), (this.camera = t), this.camera.updateProjectionMatrix && this.camera.updateProjectionMatrix(), (this.matrix = t.matrixWorld), (this.matrixAutoUpdate = !1), (this.pointMap = s), this.update(); } update() { const t = this.geometry, e = this.pointMap; _h.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse), wh('c', e, t, _h, 0, 0, -1), wh('t', e, t, _h, 0, 0, 1), wh('n1', e, t, _h, -1, -1, -1), wh('n2', e, t, _h, 1, -1, -1), wh('n3', e, t, _h, -1, 1, -1), wh('n4', e, t, _h, 1, 1, -1), wh('f1', e, t, _h, -1, -1, 1), wh('f2', e, t, _h, 1, -1, 1), wh('f3', e, t, _h, -1, 1, 1), wh('f4', e, t, _h, 1, 1, 1), wh('u1', e, t, _h, 0.7, 1.1, -1), wh('u2', e, t, _h, -0.7, 1.1, -1), wh('u3', e, t, _h, 0, 2, -1), wh('cf1', e, t, _h, -1, 0, 1), wh('cf2', e, t, _h, 1, 0, 1), wh('cf3', e, t, _h, 0, -1, 1), wh('cf4', e, t, _h, 0, 1, 1), wh('cn1', e, t, _h, -1, 0, -1), wh('cn2', e, t, _h, 1, 0, -1), wh('cn3', e, t, _h, 0, -1, -1), wh('cn4', e, t, _h, 0, 1, -1), (t.getAttribute('position').needsUpdate = !0); } dispose() { this.geometry.dispose(), this.material.dispose(); } }), (t.CanvasRenderer = function () { console.error('THREE.CanvasRenderer has been removed'); }), (t.CanvasTexture = Ra), (t.CatmullRomCurve3 = bl), (t.CineonToneMapping = 3), (t.CircleBufferGeometry = Pa), (t.CircleGeometry = Pa), (t.ClampToEdgeWrapping = u), (t.Clock = bc), (t.Color = tn), (t.ColorKeyframeTrack = Jo), (t.CompressedTexture = La), (t.CompressedTextureLoader = class extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = this, s = [], a = new La(), o = new cl(this.manager); o.setPath(this.path), o.setResponseType('arraybuffer'), o.setRequestHeader(this.requestHeader), o.setWithCredentials(r.withCredentials); let l = 0; function c(c) { o.load( t[c], function (t) { const n = r.parse(t, !0); (s[c] = { width: n.width, height: n.height, format: n.format, mipmaps: n.mipmaps, }), (l += 1), 6 === l && (1 === n.mipmapCount && (a.minFilter = g), (a.image = s), (a.format = n.format), (a.needsUpdate = !0), e && e(a)); }, n, i ); } if (Array.isArray(t)) for (let e = 0, n = t.length; e < n; ++e) c(e); else o.load( t, function (t) { const n = r.parse(t, !0); if (n.isCubemap) { const t = n.mipmaps.length / n.mipmapCount; for (let e = 0; e < t; e++) { s[e] = { mipmaps: [] }; for (let t = 0; t < n.mipmapCount; t++) s[e].mipmaps.push(n.mipmaps[e * n.mipmapCount + t]), (s[e].format = n.format), (s[e].width = n.width), (s[e].height = n.height); } a.image = s; } else (a.image.width = n.width), (a.image.height = n.height), (a.mipmaps = n.mipmaps); 1 === n.mipmapCount && (a.minFilter = g), (a.format = n.format), (a.needsUpdate = !0), e && e(a); }, n, i ); return a; } }), (t.ConeBufferGeometry = Ia), (t.ConeGeometry = Ia), (t.CubeCamera = ti), (t.CubeReflectionMapping = r), (t.CubeRefractionMapping = s), (t.CubeTexture = ei), (t.CubeTextureLoader = ul), (t.CubeUVReflectionMapping = l), (t.CubeUVRefractionMapping = c), (t.CubicBezierCurve = El), (t.CubicBezierCurve3 = Al), (t.CubicInterpolant = jo), (t.CullFaceBack = 1), (t.CullFaceFront = 2), (t.CullFaceFrontBack = 3), (t.CullFaceNone = 0), (t.Curve = ml), (t.CurvePath = Nl), (t.CustomBlending = 5), (t.CustomToneMapping = 5), (t.CylinderBufferGeometry = Da), (t.CylinderGeometry = Da), (t.Cylindrical = class { constructor(t = 1, e = 0, n = 0) { return (this.radius = t), (this.theta = e), (this.y = n), this; } set(t, e, n) { return (this.radius = t), (this.theta = e), (this.y = n), this; } copy(t) { return ( (this.radius = t.radius), (this.theta = t.theta), (this.y = t.y), this ); } setFromVector3(t) { return this.setFromCartesianCoords(t.x, t.y, t.z); } setFromCartesianCoords(t, e, n) { return ( (this.radius = Math.sqrt(t * t + n * n)), (this.theta = Math.atan2(t, n)), (this.y = e), this ); } clone() { return new this.constructor().copy(this); } }), (t.DataTexture = ii), (t.DataTexture2DArray = Ai), (t.DataTexture3D = Li), (t.DataTextureLoader = dl), (t.DataUtils = class { static toHalfFloat(t) { Lh[0] = t; const e = Rh[0]; let n = (e >> 16) & 32768, i = (e >> 12) & 2047; const r = (e >> 23) & 255; return r < 103 ? n : r > 142 ? ((n |= 31744), (n |= (255 == r ? 0 : 1) && 8388607 & e), n) : r < 113 ? ((i |= 2048), (n |= (i >> (114 - r)) + ((i >> (113 - r)) & 1)), n) : ((n |= ((r - 112) << 10) | (i >> 1)), (n += 1 & i), n); } }), (t.DecrementStencilOp = 7683), (t.DecrementWrapStencilOp = 34056), (t.DefaultLoadingManager = al), (t.DepthFormat = A), (t.DepthStencilFormat = L), (t.DepthTexture = Ca), (t.DirectionalLight = Kl), (t.DirectionalLightHelper = class extends Ce { constructor(t, e, n) { super(), (this.light = t), this.light.updateMatrixWorld(), (this.matrix = t.matrixWorld), (this.matrixAutoUpdate = !1), (this.color = n), void 0 === e && (e = 1); let i = new En(); i.setAttribute( 'position', new mn([-e, e, 0, e, e, 0, e, -e, 0, -e, -e, 0, -e, e, 0], 3) ); const r = new ca({ fog: !1, toneMapped: !1 }); (this.lightPlane = new fa(i, r)), this.add(this.lightPlane), (i = new En()), i.setAttribute('position', new mn([0, 0, 0, 0, 0, 1], 3)), (this.targetLine = new fa(i, r)), this.add(this.targetLine), this.update(); } dispose() { this.lightPlane.geometry.dispose(), this.lightPlane.material.dispose(), this.targetLine.geometry.dispose(), this.targetLine.material.dispose(); } update() { gh.setFromMatrixPosition(this.light.matrixWorld), vh.setFromMatrixPosition(this.light.target.matrixWorld), yh.subVectors(vh, gh), this.lightPlane.lookAt(vh), void 0 !== this.color ? (this.lightPlane.material.color.set(this.color), this.targetLine.material.color.set(this.color)) : (this.lightPlane.material.color.copy(this.light.color), this.targetLine.material.color.copy(this.light.color)), this.targetLine.lookAt(vh), (this.targetLine.scale.z = yh.length()); } }), (t.DiscreteInterpolant = Xo), (t.DodecahedronBufferGeometry = Ba), (t.DodecahedronGeometry = Ba), (t.DoubleSide = 2), (t.DstAlphaFactor = 206), (t.DstColorFactor = 208), (t.DynamicBufferAttribute = function (t, e) { return ( console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' ), new sn(t, e).setUsage(nt) ); }), (t.DynamicCopyUsage = 35050), (t.DynamicDrawUsage = nt), (t.DynamicReadUsage = 35049), (t.EdgesGeometry = Ga), (t.EdgesHelper = function (t, e) { return ( console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ), new ya( new Ga(t.geometry), new ca({ color: void 0 !== e ? e : 16777215 }) ) ); }), (t.EllipseCurve = fl), (t.EqualDepth = 4), (t.EqualStencilFunc = 514), (t.EquirectangularReflectionMapping = a), (t.EquirectangularRefractionMapping = o), (t.Euler = fe), (t.EventDispatcher = rt), (t.ExtrudeBufferGeometry = go), (t.ExtrudeGeometry = go), (t.FaceColors = 1), (t.FileLoader = cl), (t.FlatShading = 1), (t.Float16BufferAttribute = pn), (t.Float32Attribute = function (t, e) { return ( console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ), new mn(t, e) ); }), (t.Float32BufferAttribute = mn), (t.Float64Attribute = function (t, e) { return ( console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ), new fn(t, e) ); }), (t.Float64BufferAttribute = fn), (t.FloatType = b), (t.Fog = Ss), (t.FogExp2 = Ms), (t.Font = pc), (t.FontLoader = class extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = this, s = new cl(this.manager); s.setPath(this.path), s.setRequestHeader(this.requestHeader), s.setWithCredentials(r.withCredentials), s.load( t, function (t) { let n; try { n = JSON.parse(t); } catch (e) { console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ), (n = JSON.parse(t.substring(65, t.length - 2))); } const i = r.parse(n); e && e(i); }, n, i ); } parse(t) { return new pc(t); } }), (t.FrontSide = 0), (t.Frustum = ai), (t.GLBufferAttribute = Qc), (t.GLSL1 = '100'), (t.GLSL3 = it), (t.GammaEncoding = Z), (t.GreaterDepth = 6), (t.GreaterEqualDepth = 5), (t.GreaterEqualStencilFunc = 518), (t.GreaterStencilFunc = 516), (t.GridHelper = fh), (t.Group = gs), (t.HalfFloatType = M), (t.HemisphereLight = Ol), (t.HemisphereLightHelper = class extends Ce { constructor(t, e, n) { super(), (this.light = t), this.light.updateMatrixWorld(), (this.matrix = t.matrixWorld), (this.matrixAutoUpdate = !1), (this.color = n); const i = new _o(e); i.rotateY(0.5 * Math.PI), (this.material = new en({ wireframe: !0, fog: !1, toneMapped: !1 })), void 0 === this.color && (this.material.vertexColors = !0); const r = i.getAttribute('position'), s = new Float32Array(3 * r.count); i.setAttribute('color', new sn(s, 3)), this.add(new Wn(i, this.material)), this.update(); } dispose() { this.children[0].geometry.dispose(), this.children[0].material.dispose(); } update() { const t = this.children[0]; if (void 0 !== this.color) this.material.color.set(this.color); else { const e = t.geometry.getAttribute('color'); ph.copy(this.light.color), mh.copy(this.light.groundColor); for (let t = 0, n = e.count; t < n; t++) { const i = t < n / 2 ? ph : mh; e.setXYZ(t, i.r, i.g, i.b); } e.needsUpdate = !0; } t.lookAt(dh.setFromMatrixPosition(this.light.matrixWorld).negate()); } }), (t.HemisphereLightProbe = yc), (t.IcosahedronBufferGeometry = yo), (t.IcosahedronGeometry = yo), (t.ImageBitmapLoader = uc), (t.ImageLoader = hl), (t.ImageUtils = _t), (t.ImmediateRenderObject = sh), (t.IncrementStencilOp = 7682), (t.IncrementWrapStencilOp = 34055), (t.InstancedBufferAttribute = ac), (t.InstancedBufferGeometry = sc), (t.InstancedInterleavedBuffer = Jc), (t.InstancedMesh = la), (t.Int16Attribute = function (t, e) { return ( console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ), new cn(t, e) ); }), (t.Int16BufferAttribute = cn), (t.Int32Attribute = function (t, e) { return ( console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ), new un(t, e) ); }), (t.Int32BufferAttribute = un), (t.Int8Attribute = function (t, e) { return ( console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ), new an(t, e) ); }), (t.Int8BufferAttribute = an), (t.IntType = 1013), (t.InterleavedBuffer = Es), (t.InterleavedBufferAttribute = Ls), (t.Interpolant = Wo), (t.InterpolateDiscrete = H), (t.InterpolateLinear = G), (t.InterpolateSmooth = U), (t.InvertStencilOp = 5386), (t.JSONLoader = function () { console.error('THREE.JSONLoader has been removed.'); }), (t.KeepStencilOp = tt), (t.KeyframeTrack = Yo), (t.LOD = Xs), (t.LatheBufferGeometry = xo), (t.LatheGeometry = xo), (t.Layers = ge), (t.LensFlare = function () { console.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' ); }), (t.LessDepth = 2), (t.LessEqualDepth = 3), (t.LessEqualStencilFunc = 515), (t.LessStencilFunc = 513), (t.Light = Fl), (t.LightProbe = nc), (t.Line = fa), (t.Line3 = rh), (t.LineBasicMaterial = ca), (t.LineCurve = Ll), (t.LineCurve3 = Rl), (t.LineDashedMaterial = Uo), (t.LineLoop = xa), (t.LinePieces = 1), (t.LineSegments = ya), (t.LineStrip = 0), (t.LinearEncoding = X), (t.LinearFilter = g), (t.LinearInterpolant = qo), (t.LinearMipMapLinearFilter = 1008), (t.LinearMipMapNearestFilter = 1007), (t.LinearMipmapLinearFilter = y), (t.LinearMipmapNearestFilter = v), (t.LinearToneMapping = 1), (t.Loader = ol), (t.LoaderUtils = rc), (t.LoadingManager = sl), (t.LogLuvEncoding = 3003), (t.LoopOnce = 2200), (t.LoopPingPong = 2202), (t.LoopRepeat = 2201), (t.LuminanceAlphaFormat = 1025), (t.LuminanceFormat = 1024), (t.MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }), (t.Material = Xe), (t.MaterialLoader = ic), (t.Math = gt), (t.MathUtils = gt), (t.Matrix3 = yt), (t.Matrix4 = se), (t.MaxEquation = 104), (t.Mesh = Wn), (t.MeshBasicMaterial = en), (t.MeshDepthMaterial = cs), (t.MeshDistanceMaterial = hs), (t.MeshFaceMaterial = function (t) { return ( console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ), t ); }), (t.MeshLambertMaterial = Ho), (t.MeshMatcapMaterial = Go), (t.MeshNormalMaterial = Oo), (t.MeshPhongMaterial = zo), (t.MeshPhysicalMaterial = Bo), (t.MeshStandardMaterial = No), (t.MeshToonMaterial = Fo), (t.MinEquation = 103), (t.MirroredRepeatWrapping = d), (t.MixOperation = 1), (t.MultiMaterial = function (t = []) { return ( console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ), (t.isMultiMaterial = !0), (t.materials = t), (t.clone = function () { return t.slice(); }), t ); }), (t.MultiplyBlending = 4), (t.MultiplyOperation = 0), (t.NearestFilter = p), (t.NearestMipMapLinearFilter = 1005), (t.NearestMipMapNearestFilter = 1004), (t.NearestMipmapLinearFilter = f), (t.NearestMipmapNearestFilter = m), (t.NeverDepth = 0), (t.NeverStencilFunc = 512), (t.NoBlending = 0), (t.NoColors = 0), (t.NoToneMapping = 0), (t.NormalAnimationBlendMode = j), (t.NormalBlending = 1), (t.NotEqualDepth = 7), (t.NotEqualStencilFunc = 517), (t.NumberKeyframeTrack = Qo), (t.Object3D = Ce), (t.ObjectLoader = class extends ol { constructor(t) { super(t); } load(t, e, n, i) { const r = this, s = '' === this.path ? rc.extractUrlBase(t) : this.path; this.resourcePath = this.resourcePath || s; const a = new cl(this.manager); a.setPath(this.path), a.setRequestHeader(this.requestHeader), a.setWithCredentials(this.withCredentials), a.load( t, function (n) { let s = null; try { s = JSON.parse(n); } catch (e) { return ( void 0 !== i && i(e), void console.error( "THREE:ObjectLoader: Can't parse " + t + '.', e.message ) ); } const a = s.metadata; void 0 !== a && void 0 !== a.type && 'geometry' !== a.type.toLowerCase() ? r.parse(s, e) : console.error("THREE.ObjectLoader: Can't load " + t); }, n, i ); } parse(t, e) { const n = this.parseAnimations(t.animations), i = this.parseShapes(t.shapes), r = this.parseGeometries(t.geometries, i), s = this.parseImages(t.images, function () { void 0 !== e && e(l); }), a = this.parseTextures(t.textures, s), o = this.parseMaterials(t.materials, a), l = this.parseObject(t.object, r, o, n), c = this.parseSkeletons(t.skeletons, l); if ((this.bindSkeletons(l, c), void 0 !== e)) { let t = !1; for (const e in s) if (s[e] instanceof HTMLImageElement) { t = !0; break; } !1 === t && e(l); } return l; } parseShapes(t) { const e = {}; if (void 0 !== t) for (let n = 0, i = t.length; n < i; n++) { const i = new zl().fromJSON(t[n]); e[i.uuid] = i; } return e; } parseSkeletons(t, e) { const n = {}, i = {}; if ( (e.traverse(function (t) { t.isBone && (i[t.uuid] = t); }), void 0 !== t) ) for (let e = 0, r = t.length; e < r; e++) { const r = new ia().fromJSON(t[e], i); n[r.uuid] = r; } return n; } parseGeometries(t, e) { const n = {}; let i; if (void 0 !== t) { const r = new oc(); for (let s = 0, a = t.length; s < a; s++) { let a; const o = t[s]; switch (o.type) { case 'PlaneGeometry': case 'PlaneBufferGeometry': a = new Po[o.type]( o.width, o.height, o.widthSegments, o.heightSegments ); break; case 'BoxGeometry': case 'BoxBufferGeometry': a = new Po[o.type]( o.width, o.height, o.depth, o.widthSegments, o.heightSegments, o.depthSegments ); break; case 'CircleGeometry': case 'CircleBufferGeometry': a = new Po[o.type]( o.radius, o.segments, o.thetaStart, o.thetaLength ); break; case 'CylinderGeometry': case 'CylinderBufferGeometry': a = new Po[o.type]( o.radiusTop, o.radiusBottom, o.height, o.radialSegments, o.heightSegments, o.openEnded, o.thetaStart, o.thetaLength ); break; case 'ConeGeometry': case 'ConeBufferGeometry': a = new Po[o.type]( o.radius, o.height, o.radialSegments, o.heightSegments, o.openEnded, o.thetaStart, o.thetaLength ); break; case 'SphereGeometry': case 'SphereBufferGeometry': a = new Po[o.type]( o.radius, o.widthSegments, o.heightSegments, o.phiStart, o.phiLength, o.thetaStart, o.thetaLength ); break; case 'DodecahedronGeometry': case 'DodecahedronBufferGeometry': case 'IcosahedronGeometry': case 'IcosahedronBufferGeometry': case 'OctahedronGeometry': case 'OctahedronBufferGeometry': case 'TetrahedronGeometry': case 'TetrahedronBufferGeometry': a = new Po[o.type](o.radius, o.detail); break; case 'RingGeometry': case 'RingBufferGeometry': a = new Po[o.type]( o.innerRadius, o.outerRadius, o.thetaSegments, o.phiSegments, o.thetaStart, o.thetaLength ); break; case 'TorusGeometry': case 'TorusBufferGeometry': a = new Po[o.type]( o.radius, o.tube, o.radialSegments, o.tubularSegments, o.arc ); break; case 'TorusKnotGeometry': case 'TorusKnotBufferGeometry': a = new Po[o.type]( o.radius, o.tube, o.tubularSegments, o.radialSegments, o.p, o.q ); break; case 'TubeGeometry': case 'TubeBufferGeometry': a = new Po[o.type]( new Il[o.path.type]().fromJSON(o.path), o.tubularSegments, o.radius, o.radialSegments, o.closed ); break; case 'LatheGeometry': case 'LatheBufferGeometry': a = new Po[o.type]( o.points, o.segments, o.phiStart, o.phiLength ); break; case 'PolyhedronGeometry': case 'PolyhedronBufferGeometry': a = new Po[o.type](o.vertices, o.indices, o.radius, o.details); break; case 'ShapeGeometry': case 'ShapeBufferGeometry': i = []; for (let t = 0, n = o.shapes.length; t < n; t++) { const n = e[o.shapes[t]]; i.push(n); } a = new Po[o.type](i, o.curveSegments); break; case 'ExtrudeGeometry': case 'ExtrudeBufferGeometry': i = []; for (let t = 0, n = o.shapes.length; t < n; t++) { const n = e[o.shapes[t]]; i.push(n); } const t = o.options.extrudePath; void 0 !== t && (o.options.extrudePath = new Il[t.type]().fromJSON(t)), (a = new Po[o.type](i, o.options)); break; case 'BufferGeometry': case 'InstancedBufferGeometry': a = r.parse(o); break; case 'Geometry': console.error( 'THREE.ObjectLoader: Loading "Geometry" is not supported anymore.' ); break; default: console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + o.type + '"' ); continue; } (a.uuid = o.uuid), void 0 !== o.name && (a.name = o.name), !0 === a.isBufferGeometry && void 0 !== o.userData && (a.userData = o.userData), (n[o.uuid] = a); } } return n; } parseMaterials(t, e) { const n = {}, i = {}; if (void 0 !== t) { const r = new ic(); r.setTextures(e); for (let e = 0, s = t.length; e < s; e++) { const s = t[e]; if ('MultiMaterial' === s.type) { const t = []; for (let e = 0; e < s.materials.length; e++) { const i = s.materials[e]; void 0 === n[i.uuid] && (n[i.uuid] = r.parse(i)), t.push(n[i.uuid]); } i[s.uuid] = t; } else void 0 === n[s.uuid] && (n[s.uuid] = r.parse(s)), (i[s.uuid] = n[s.uuid]); } } return i; } parseAnimations(t) { const e = {}; if (void 0 !== t) for (let n = 0; n < t.length; n++) { const i = t[n], r = nl.parse(i); e[r.uuid] = r; } return e; } parseImages(t, e) { const n = this, i = {}; let r; function s(t) { if ('string' == typeof t) { const e = t; return (function (t) { return ( n.manager.itemStart(t), r.load( t, function () { n.manager.itemEnd(t); }, void 0, function () { n.manager.itemError(t), n.manager.itemEnd(t); } ) ); })(/^(\/\/)|([a-z]+:(\/\/)?)/i.test(e) ? e : n.resourcePath + e); } return t.data ? { data: yn(t.type, t.data), width: t.width, height: t.height } : null; } if (void 0 !== t && t.length > 0) { const n = new sl(e); (r = new hl(n)), r.setCrossOrigin(this.crossOrigin); for (let e = 0, n = t.length; e < n; e++) { const n = t[e], r = n.url; if (Array.isArray(r)) { i[n.uuid] = []; for (let t = 0, e = r.length; t < e; t++) { const e = s(r[t]); null !== e && (e instanceof HTMLImageElement ? i[n.uuid].push(e) : i[n.uuid].push(new ii(e.data, e.width, e.height))); } } else { const t = s(n.url); null !== t && (i[n.uuid] = t); } } } return i; } parseTextures(t, e) { function n(t, e) { return 'number' == typeof t ? t : (console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', t ), e[t]); } const i = {}; if (void 0 !== t) for (let r = 0, s = t.length; r < s; r++) { const s = t[r]; let a; void 0 === s.image && console.warn( 'THREE.ObjectLoader: No "image" specified for', s.uuid ), void 0 === e[s.image] && console.warn('THREE.ObjectLoader: Undefined image', s.image); const o = e[s.image]; Array.isArray(o) ? ((a = new ei(o)), 6 === o.length && (a.needsUpdate = !0)) : ((a = o && o.data ? new ii(o.data, o.width, o.height) : new bt(o)), o && (a.needsUpdate = !0)), (a.uuid = s.uuid), void 0 !== s.name && (a.name = s.name), void 0 !== s.mapping && (a.mapping = n(s.mapping, lc)), void 0 !== s.offset && a.offset.fromArray(s.offset), void 0 !== s.repeat && a.repeat.fromArray(s.repeat), void 0 !== s.center && a.center.fromArray(s.center), void 0 !== s.rotation && (a.rotation = s.rotation), void 0 !== s.wrap && ((a.wrapS = n(s.wrap[0], cc)), (a.wrapT = n(s.wrap[1], cc))), void 0 !== s.format && (a.format = s.format), void 0 !== s.type && (a.type = s.type), void 0 !== s.encoding && (a.encoding = s.encoding), void 0 !== s.minFilter && (a.minFilter = n(s.minFilter, hc)), void 0 !== s.magFilter && (a.magFilter = n(s.magFilter, hc)), void 0 !== s.anisotropy && (a.anisotropy = s.anisotropy), void 0 !== s.flipY && (a.flipY = s.flipY), void 0 !== s.premultiplyAlpha && (a.premultiplyAlpha = s.premultiplyAlpha), void 0 !== s.unpackAlignment && (a.unpackAlignment = s.unpackAlignment), (i[s.uuid] = a); } return i; } parseObject(t, e, n, i) { let r, s, a; function o(t) { return ( void 0 === e[t] && console.warn('THREE.ObjectLoader: Undefined geometry', t), e[t] ); } function l(t) { if (void 0 !== t) { if (Array.isArray(t)) { const e = []; for (let i = 0, r = t.length; i < r; i++) { const r = t[i]; void 0 === n[r] && console.warn('THREE.ObjectLoader: Undefined material', r), e.push(n[r]); } return e; } return ( void 0 === n[t] && console.warn('THREE.ObjectLoader: Undefined material', t), n[t] ); } } switch (t.type) { case 'Scene': (r = new Ts()), void 0 !== t.background && Number.isInteger(t.background) && (r.background = new tn(t.background)), void 0 !== t.fog && ('Fog' === t.fog.type ? (r.fog = new Ss(t.fog.color, t.fog.near, t.fog.far)) : 'FogExp2' === t.fog.type && (r.fog = new Ms(t.fog.color, t.fog.density))); break; case 'PerspectiveCamera': (r = new Kn(t.fov, t.aspect, t.near, t.far)), void 0 !== t.focus && (r.focus = t.focus), void 0 !== t.zoom && (r.zoom = t.zoom), void 0 !== t.filmGauge && (r.filmGauge = t.filmGauge), void 0 !== t.filmOffset && (r.filmOffset = t.filmOffset), void 0 !== t.view && (r.view = Object.assign({}, t.view)); break; case 'OrthographicCamera': (r = new Jl(t.left, t.right, t.top, t.bottom, t.near, t.far)), void 0 !== t.zoom && (r.zoom = t.zoom), void 0 !== t.view && (r.view = Object.assign({}, t.view)); break; case 'AmbientLight': r = new $l(t.color, t.intensity); break; case 'DirectionalLight': r = new Kl(t.color, t.intensity); break; case 'PointLight': r = new Zl(t.color, t.intensity, t.distance, t.decay); break; case 'RectAreaLight': r = new tc(t.color, t.intensity, t.width, t.height); break; case 'SpotLight': r = new Wl( t.color, t.intensity, t.distance, t.angle, t.penumbra, t.decay ); break; case 'HemisphereLight': r = new Ol(t.color, t.groundColor, t.intensity); break; case 'LightProbe': r = new nc().fromJSON(t); break; case 'SkinnedMesh': (s = o(t.geometry)), (a = l(t.material)), (r = new $s(s, a)), void 0 !== t.bindMode && (r.bindMode = t.bindMode), void 0 !== t.bindMatrix && r.bindMatrix.fromArray(t.bindMatrix), void 0 !== t.skeleton && (r.skeleton = t.skeleton); break; case 'Mesh': (s = o(t.geometry)), (a = l(t.material)), (r = new Wn(s, a)); break; case 'InstancedMesh': (s = o(t.geometry)), (a = l(t.material)); const e = t.count, n = t.instanceMatrix, i = t.instanceColor; (r = new la(s, a, e)), (r.instanceMatrix = new sn(new Float32Array(n.array), 16)), void 0 !== i && (r.instanceColor = new sn( new Float32Array(i.array), i.itemSize )); break; case 'LOD': r = new Xs(); break; case 'Line': r = new fa(o(t.geometry), l(t.material)); break; case 'LineLoop': r = new xa(o(t.geometry), l(t.material)); break; case 'LineSegments': r = new ya(o(t.geometry), l(t.material)); break; case 'PointCloud': case 'Points': r = new Ta(o(t.geometry), l(t.material)); break; case 'Sprite': r = new Vs(l(t.material)); break; case 'Group': r = new gs(); break; case 'Bone': r = new ta(); break; default: r = new Ce(); } if ( ((r.uuid = t.uuid), void 0 !== t.name && (r.name = t.name), void 0 !== t.matrix ? (r.matrix.fromArray(t.matrix), void 0 !== t.matrixAutoUpdate && (r.matrixAutoUpdate = t.matrixAutoUpdate), r.matrixAutoUpdate && r.matrix.decompose(r.position, r.quaternion, r.scale)) : (void 0 !== t.position && r.position.fromArray(t.position), void 0 !== t.rotation && r.rotation.fromArray(t.rotation), void 0 !== t.quaternion && r.quaternion.fromArray(t.quaternion), void 0 !== t.scale && r.scale.fromArray(t.scale)), void 0 !== t.castShadow && (r.castShadow = t.castShadow), void 0 !== t.receiveShadow && (r.receiveShadow = t.receiveShadow), t.shadow && (void 0 !== t.shadow.bias && (r.shadow.bias = t.shadow.bias), void 0 !== t.shadow.normalBias && (r.shadow.normalBias = t.shadow.normalBias), void 0 !== t.shadow.radius && (r.shadow.radius = t.shadow.radius), void 0 !== t.shadow.mapSize && r.shadow.mapSize.fromArray(t.shadow.mapSize), void 0 !== t.shadow.camera && (r.shadow.camera = this.parseObject(t.shadow.camera))), void 0 !== t.visible && (r.visible = t.visible), void 0 !== t.frustumCulled && (r.frustumCulled = t.frustumCulled), void 0 !== t.renderOrder && (r.renderOrder = t.renderOrder), void 0 !== t.userData && (r.userData = t.userData), void 0 !== t.layers && (r.layers.mask = t.layers), void 0 !== t.children) ) { const s = t.children; for (let t = 0; t < s.length; t++) r.add(this.parseObject(s[t], e, n, i)); } if (void 0 !== t.animations) { const e = t.animations; for (let t = 0; t < e.length; t++) { const n = e[t]; r.animations.push(i[n]); } } if ('LOD' === t.type) { void 0 !== t.autoUpdate && (r.autoUpdate = t.autoUpdate); const e = t.levels; for (let t = 0; t < e.length; t++) { const n = e[t], i = r.getObjectByProperty('uuid', n.object); void 0 !== i && r.addLevel(i, n.distance); } } return r; } bindSkeletons(t, e) { 0 !== Object.keys(e).length && t.traverse(function (t) { if (!0 === t.isSkinnedMesh && void 0 !== t.skeleton) { const n = e[t.skeleton]; void 0 === n ? console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', t.skeleton ) : t.bind(n, t.bindMatrix); } }); } setTexturePath(t) { return ( console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' ), this.setResourcePath(t) ); } }), (t.ObjectSpaceNormalMap = 1), (t.OctahedronBufferGeometry = _o), (t.OctahedronGeometry = _o), (t.OneFactor = 201), (t.OneMinusDstAlphaFactor = 207), (t.OneMinusDstColorFactor = 209), (t.OneMinusSrcAlphaFactor = 205), (t.OneMinusSrcColorFactor = 203), (t.OrthographicCamera = Jl), (t.PCFShadowMap = 1), (t.PCFSoftShadowMap = 2), (t.PMREMGenerator = class { constructor(t) { (this._renderer = t), (this._pingPongRenderTarget = null), (this._blurMaterial = (function (t) { const e = new Float32Array(t), n = new Lt(0, 1, 0); return new Io({ name: 'SphericalGaussianBlur', defines: { n: t }, uniforms: { envMap: { value: null }, samples: { value: 1 }, weights: { value: e }, latitudinal: { value: !1 }, dTheta: { value: 0 }, mipInt: { value: 0 }, poleAxis: { value: n }, inputEncoding: { value: Nh[3e3] }, outputEncoding: { value: Nh[3e3] }, }, vertexShader: $h(), fragmentShader: `\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t${tu()}\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`, blending: 0, depthTest: !1, depthWrite: !1, }); })(Ih)), (this._equirectShader = null), (this._cubemapShader = null), this._compileMaterial(this._blurMaterial); } fromScene(t, e = 0, n = 0.1, i = 100) { kh = this._renderer.getRenderTarget(); const r = this._allocateTargets(); return ( this._sceneToCubeUV(t, n, i, r), e > 0 && this._blur(r, 0, 0, e), this._applyPMREM(r), this._cleanup(r), r ); } fromEquirectangular(t) { return this._fromTexture(t); } fromCubemap(t) { return this._fromTexture(t); } compileCubemapShader() { null === this._cubemapShader && ((this._cubemapShader = Kh()), this._compileMaterial(this._cubemapShader)); } compileEquirectangularShader() { null === this._equirectShader && ((this._equirectShader = Qh()), this._compileMaterial(this._equirectShader)); } dispose() { this._blurMaterial.dispose(), null !== this._cubemapShader && this._cubemapShader.dispose(), null !== this._equirectShader && this._equirectShader.dispose(); for (let t = 0; t < Oh.length; t++) Oh[t].dispose(); } _cleanup(t) { this._pingPongRenderTarget.dispose(), this._renderer.setRenderTarget(kh), (t.scissorTest = !1), Jh(t, 0, 0, t.width, t.height); } _fromTexture(t) { kh = this._renderer.getRenderTarget(); const e = this._allocateTargets(t); return ( this._textureToCubeUV(t, e), this._applyPMREM(e), this._cleanup(e), e ); } _allocateTargets(t) { const e = { magFilter: p, minFilter: p, generateMipmaps: !1, type: x, format: 1023, encoding: Xh(t) ? t.encoding : J, depthBuffer: !1, }, n = Zh(e); return (n.depthBuffer = !t), (this._pingPongRenderTarget = Zh(e)), n; } _compileMaterial(t) { const e = new Wn(Oh[0], t); this._renderer.compile(e, Fh); } _sceneToCubeUV(t, e, n, i) { const r = new Kn(90, 1, e, n), s = [1, -1, 1, 1, 1, 1], a = [1, 1, 1, -1, -1, -1], o = this._renderer, l = o.autoClear, c = o.outputEncoding, h = o.toneMapping; o.getClearColor(Uh), (o.toneMapping = 0), (o.outputEncoding = X), (o.autoClear = !1); let u = !1; const d = t.background; if (d) { if (d.isColor) { Bh.color.copy(d).convertSRGBToLinear(), (t.background = null); const e = qh(Bh.color); (Bh.opacity = e), (u = !0); } } else { Bh.color.copy(Uh).convertSRGBToLinear(); const t = qh(Bh.color); (Bh.opacity = t), (u = !0); } for (let e = 0; e < 6; e++) { const n = e % 3; 0 == n ? (r.up.set(0, s[e], 0), r.lookAt(a[e], 0, 0)) : 1 == n ? (r.up.set(0, 0, s[e]), r.lookAt(0, a[e], 0)) : (r.up.set(0, s[e], 0), r.lookAt(0, 0, a[e])), Jh(i, n * Ch, e > 2 ? Ch : 0, Ch, Ch), o.setRenderTarget(i), u && o.render(zh, r), o.render(t, r); } (o.toneMapping = h), (o.outputEncoding = c), (o.autoClear = l); } _textureToCubeUV(t, e) { const n = this._renderer; t.isCubeTexture ? null == this._cubemapShader && (this._cubemapShader = Kh()) : null == this._equirectShader && (this._equirectShader = Qh()); const i = t.isCubeTexture ? this._cubemapShader : this._equirectShader, r = new Wn(Oh[0], i), s = i.uniforms; (s.envMap.value = t), t.isCubeTexture || s.texelSize.value.set(1 / t.image.width, 1 / t.image.height), (s.inputEncoding.value = Nh[t.encoding]), (s.outputEncoding.value = Nh[e.texture.encoding]), Jh(e, 0, 0, 3 * Ch, 2 * Ch), n.setRenderTarget(e), n.render(r, Fh); } _applyPMREM(t) { const e = this._renderer, n = e.autoClear; e.autoClear = !1; for (let e = 1; e < Dh; e++) { const n = Math.sqrt(Gh[e] * Gh[e] - Gh[e - 1] * Gh[e - 1]), i = jh[(e - 1) % jh.length]; this._blur(t, e - 1, e, n, i); } e.autoClear = n; } _blur(t, e, n, i, r) { const s = this._pingPongRenderTarget; this._halfBlur(t, s, e, n, i, 'latitudinal', r), this._halfBlur(s, t, n, n, i, 'longitudinal', r); } _halfBlur(t, e, n, i, r, s, a) { const o = this._renderer, l = this._blurMaterial; 'latitudinal' !== s && 'longitudinal' !== s && console.error( 'blur direction must be either latitudinal or longitudinal!' ); const c = new Wn(Oh[i], l), h = l.uniforms, u = Hh[n] - 1, d = isFinite(r) ? Math.PI / (2 * u) : (2 * Math.PI) / 39, p = r / d, m = isFinite(r) ? 1 + Math.floor(3 * p) : Ih; m > Ih && console.warn( `sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20` ); const f = []; let g = 0; for (let t = 0; t < Ih; ++t) { const e = t / p, n = Math.exp((-e * e) / 2); f.push(n), 0 == t ? (g += n) : t < m && (g += 2 * n); } for (let t = 0; t < f.length; t++) f[t] = f[t] / g; (h.envMap.value = t.texture), (h.samples.value = m), (h.weights.value = f), (h.latitudinal.value = 'latitudinal' === s), a && (h.poleAxis.value = a), (h.dTheta.value = d), (h.mipInt.value = 8 - n), (h.inputEncoding.value = Nh[t.texture.encoding]), (h.outputEncoding.value = Nh[t.texture.encoding]); const v = Hh[i]; Jh( e, 3 * Math.max(0, Ch - 2 * v), (0 === i ? 0 : 2 * Ch) + 2 * v * (i > 4 ? i - 8 + 4 : 0), 3 * v, 2 * v ), o.setRenderTarget(e), o.render(c, Fh); } }), (t.ParametricBufferGeometry = wo), (t.ParametricGeometry = wo), (t.Particle = function (t) { return ( console.warn('THREE.Particle has been renamed to THREE.Sprite.'), new Vs(t) ); }), (t.ParticleBasicMaterial = function (t) { return ( console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ), new _a(t) ); }), (t.ParticleSystem = function (t, e) { return ( console.warn('THREE.ParticleSystem has been renamed to THREE.Points.'), new Ta(t, e) ); }), (t.ParticleSystemMaterial = function (t) { return ( console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ), new _a(t) ); }), (t.Path = Bl), (t.PerspectiveCamera = Kn), (t.Plane = Ne), (t.PlaneBufferGeometry = ci), (t.PlaneGeometry = ci), (t.PlaneHelper = class extends fa { constructor(t, e = 1, n = 16776960) { const i = n, r = new En(); r.setAttribute( 'position', new mn( [ 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, 0, 1, 0, 0, 0, ], 3 ) ), r.computeBoundingSphere(), super(r, new ca({ color: i, toneMapped: !1 })), (this.type = 'PlaneHelper'), (this.plane = t), (this.size = e); const s = new En(); s.setAttribute( 'position', new mn( [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1], 3 ) ), s.computeBoundingSphere(), this.add( new Wn( s, new en({ color: i, opacity: 0.2, transparent: !0, depthWrite: !1, toneMapped: !1, }) ) ); } updateMatrixWorld(t) { let e = -this.plane.constant; Math.abs(e) < 1e-8 && (e = 1e-8), this.scale.set(0.5 * this.size, 0.5 * this.size, e), (this.children[0].material.side = e < 0 ? 1 : 0), this.lookAt(this.plane.normal), super.updateMatrixWorld(t); } }), (t.PointCloud = function (t, e) { return ( console.warn('THREE.PointCloud has been renamed to THREE.Points.'), new Ta(t, e) ); }), (t.PointCloudMaterial = function (t) { return ( console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ), new _a(t) ); }), (t.PointLight = Zl), (t.PointLightHelper = class extends Wn { constructor(t, e, n) { super( new So(e, 4, 2), new en({ wireframe: !0, fog: !1, toneMapped: !1 }) ), (this.light = t), this.light.updateMatrixWorld(), (this.color = n), (this.type = 'PointLightHelper'), (this.matrix = this.light.matrixWorld), (this.matrixAutoUpdate = !1), this.update(); } dispose() { this.geometry.dispose(), this.material.dispose(); } update() { void 0 !== this.color ? this.material.color.set(this.color) : this.material.color.copy(this.light.color); } }), (t.Points = Ta), (t.PointsMaterial = _a), (t.PolarGridHelper = class extends ya { constructor(t = 10, e = 16, n = 8, i = 64, r = 4473924, s = 8947848) { (r = new tn(r)), (s = new tn(s)); const a = [], o = []; for (let n = 0; n <= e; n++) { const i = (n / e) * (2 * Math.PI), l = Math.sin(i) * t, c = Math.cos(i) * t; a.push(0, 0, 0), a.push(l, 0, c); const h = 1 & n ? r : s; o.push(h.r, h.g, h.b), o.push(h.r, h.g, h.b); } for (let e = 0; e <= n; e++) { const l = 1 & e ? r : s, c = t - (t / n) * e; for (let t = 0; t < i; t++) { let e = (t / i) * (2 * Math.PI), n = Math.sin(e) * c, r = Math.cos(e) * c; a.push(n, 0, r), o.push(l.r, l.g, l.b), (e = ((t + 1) / i) * (2 * Math.PI)), (n = Math.sin(e) * c), (r = Math.cos(e) * c), a.push(n, 0, r), o.push(l.r, l.g, l.b); } } const l = new En(); l.setAttribute('position', new mn(a, 3)), l.setAttribute('color', new mn(o, 3)); super(l, new ca({ vertexColors: !0, toneMapped: !1 })), (this.type = 'PolarGridHelper'); } }), (t.PolyhedronBufferGeometry = Na), (t.PolyhedronGeometry = Na), (t.PositionalAudio = class extends Lc { constructor(t) { super(t), (this.panner = this.context.createPanner()), (this.panner.panningModel = 'HRTF'), this.panner.connect(this.gain); } getOutput() { return this.panner; } getRefDistance() { return this.panner.refDistance; } setRefDistance(t) { return (this.panner.refDistance = t), this; } getRolloffFactor() { return this.panner.rolloffFactor; } setRolloffFactor(t) { return (this.panner.rolloffFactor = t), this; } getDistanceModel() { return this.panner.distanceModel; } setDistanceModel(t) { return (this.panner.distanceModel = t), this; } getMaxDistance() { return this.panner.maxDistance; } setMaxDistance(t) { return (this.panner.maxDistance = t), this; } setDirectionalCone(t, e, n) { return ( (this.panner.coneInnerAngle = t), (this.panner.coneOuterAngle = e), (this.panner.coneOuterGain = n), this ); } updateMatrixWorld(t) { if ( (super.updateMatrixWorld(t), !0 === this.hasPlaybackControl && !1 === this.isPlaying) ) return; this.matrixWorld.decompose(Rc, Cc, Pc), Dc.set(0, 0, 1).applyQuaternion(Cc); const e = this.panner; if (e.positionX) { const t = this.context.currentTime + this.listener.timeDelta; e.positionX.linearRampToValueAtTime(Rc.x, t), e.positionY.linearRampToValueAtTime(Rc.y, t), e.positionZ.linearRampToValueAtTime(Rc.z, t), e.orientationX.linearRampToValueAtTime(Dc.x, t), e.orientationY.linearRampToValueAtTime(Dc.y, t), e.orientationZ.linearRampToValueAtTime(Dc.z, t); } else e.setPosition(Rc.x, Rc.y, Rc.z), e.setOrientation(Dc.x, Dc.y, Dc.z); } }), (t.PropertyBinding = jc), (t.PropertyMixer = Nc), (t.QuadraticBezierCurve = Cl), (t.QuadraticBezierCurve3 = Pl), (t.Quaternion = At), (t.QuaternionKeyframeTrack = $o), (t.QuaternionLinearInterpolant = Ko), (t.REVISION = e), (t.RGBADepthPacking = 3201), (t.RGBAFormat = E), (t.RGBAIntegerFormat = 1033), (t.RGBA_ASTC_10x10_Format = 37819), (t.RGBA_ASTC_10x5_Format = 37816), (t.RGBA_ASTC_10x6_Format = 37817), (t.RGBA_ASTC_10x8_Format = 37818), (t.RGBA_ASTC_12x10_Format = 37820), (t.RGBA_ASTC_12x12_Format = 37821), (t.RGBA_ASTC_4x4_Format = 37808), (t.RGBA_ASTC_5x4_Format = 37809), (t.RGBA_ASTC_5x5_Format = 37810), (t.RGBA_ASTC_6x5_Format = 37811), (t.RGBA_ASTC_6x6_Format = 37812), (t.RGBA_ASTC_8x5_Format = 37813), (t.RGBA_ASTC_8x6_Format = 37814), (t.RGBA_ASTC_8x8_Format = 37815), (t.RGBA_BPTC_Format = 36492), (t.RGBA_ETC2_EAC_Format = O), (t.RGBA_PVRTC_2BPPV1_Format = z), (t.RGBA_PVRTC_4BPPV1_Format = B), (t.RGBA_S3TC_DXT1_Format = C), (t.RGBA_S3TC_DXT3_Format = P), (t.RGBA_S3TC_DXT5_Format = D), (t.RGBDEncoding = $), (t.RGBEEncoding = J), (t.RGBEFormat = 1023), (t.RGBFormat = T), (t.RGBIntegerFormat = 1032), (t.RGBM16Encoding = K), (t.RGBM7Encoding = Q), (t.RGB_ETC1_Format = 36196), (t.RGB_ETC2_Format = F), (t.RGB_PVRTC_2BPPV1_Format = N), (t.RGB_PVRTC_4BPPV1_Format = I), (t.RGB_S3TC_DXT1_Format = R), (t.RGFormat = 1030), (t.RGIntegerFormat = 1031), (t.RawShaderMaterial = Io), (t.Ray = re), (t.Raycaster = class { constructor(t, e, n = 0, i = 1 / 0) { (this.ray = new re(t, e)), (this.near = n), (this.far = i), (this.camera = null), (this.layers = new ge()), (this.params = { Mesh: {}, Line: { threshold: 1 }, LOD: {}, Points: { threshold: 1 }, Sprite: {}, }); } set(t, e) { this.ray.set(t, e); } setFromCamera(t, e) { e && e.isPerspectiveCamera ? (this.ray.origin.setFromMatrixPosition(e.matrixWorld), this.ray.direction .set(t.x, t.y, 0.5) .unproject(e) .sub(this.ray.origin) .normalize(), (this.camera = e)) : e && e.isOrthographicCamera ? (this.ray.origin .set(t.x, t.y, (e.near + e.far) / (e.near - e.far)) .unproject(e), this.ray.direction .set(0, 0, -1) .transformDirection(e.matrixWorld), (this.camera = e)) : console.error( 'THREE.Raycaster: Unsupported camera type: ' + e.type ); } intersectObject(t, e = !1, n = []) { return $c(t, this, n, e), n.sort(Kc), n; } intersectObjects(t, e = !1, n = []) { for (let i = 0, r = t.length; i < r; i++) $c(t[i], this, n, e); return n.sort(Kc), n; } }), (t.RectAreaLight = tc), (t.RedFormat = 1028), (t.RedIntegerFormat = 1029), (t.ReinhardToneMapping = 2), (t.RepeatWrapping = h), (t.ReplaceStencilOp = 7681), (t.ReverseSubtractEquation = 102), (t.RingBufferGeometry = bo), (t.RingGeometry = bo), (t.SRGB8_ALPHA8_ASTC_10x10_Format = 37851), (t.SRGB8_ALPHA8_ASTC_10x5_Format = 37848), (t.SRGB8_ALPHA8_ASTC_10x6_Format = 37849), (t.SRGB8_ALPHA8_ASTC_10x8_Format = 37850), (t.SRGB8_ALPHA8_ASTC_12x10_Format = 37852), (t.SRGB8_ALPHA8_ASTC_12x12_Format = 37853), (t.SRGB8_ALPHA8_ASTC_4x4_Format = 37840), (t.SRGB8_ALPHA8_ASTC_5x4_Format = 37841), (t.SRGB8_ALPHA8_ASTC_5x5_Format = 37842), (t.SRGB8_ALPHA8_ASTC_6x5_Format = 37843), (t.SRGB8_ALPHA8_ASTC_6x6_Format = 37844), (t.SRGB8_ALPHA8_ASTC_8x5_Format = 37845), (t.SRGB8_ALPHA8_ASTC_8x6_Format = 37846), (t.SRGB8_ALPHA8_ASTC_8x8_Format = 37847), (t.Scene = Ts), (t.SceneUtils = eu), (t.ShaderChunk = hi), (t.ShaderLib = di), (t.ShaderMaterial = Jn), (t.ShadowMaterial = Do), (t.Shape = zl), (t.ShapeBufferGeometry = Mo), (t.ShapeGeometry = Mo), (t.ShapePath = dc), (t.ShapeUtils = po), (t.ShortType = 1011), (t.Skeleton = ia), (t.SkeletonHelper = hh), (t.SkinnedMesh = $s), (t.SmoothShading = 2), (t.Sphere = Jt), (t.SphereBufferGeometry = So), (t.SphereGeometry = So), (t.Spherical = class { constructor(t = 1, e = 0, n = 0) { return (this.radius = t), (this.phi = e), (this.theta = n), this; } set(t, e, n) { return (this.radius = t), (this.phi = e), (this.theta = n), this; } copy(t) { return ( (this.radius = t.radius), (this.phi = t.phi), (this.theta = t.theta), this ); } makeSafe() { const t = 1e-6; return (this.phi = Math.max(t, Math.min(Math.PI - t, this.phi))), this; } setFromVector3(t) { return this.setFromCartesianCoords(t.x, t.y, t.z); } setFromCartesianCoords(t, e, n) { return ( (this.radius = Math.sqrt(t * t + e * e + n * n)), 0 === this.radius ? ((this.theta = 0), (this.phi = 0)) : ((this.theta = Math.atan2(t, n)), (this.phi = Math.acos(ht(e / this.radius, -1, 1)))), this ); } clone() { return new this.constructor().copy(this); } }), (t.SphericalHarmonics3 = ec), (t.SplineCurve = Dl), (t.SpotLight = Wl), (t.SpotLightHelper = class extends Ce { constructor(t, e) { super(), (this.light = t), this.light.updateMatrixWorld(), (this.matrix = t.matrixWorld), (this.matrixAutoUpdate = !1), (this.color = e); const n = new En(), i = [ 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, ]; for (let t = 0, e = 1, n = 32; t < n; t++, e++) { const r = (t / n) * Math.PI * 2, s = (e / n) * Math.PI * 2; i.push(Math.cos(r), Math.sin(r), 1, Math.cos(s), Math.sin(s), 1); } n.setAttribute('position', new mn(i, 3)); const r = new ca({ fog: !1, toneMapped: !1 }); (this.cone = new ya(n, r)), this.add(this.cone), this.update(); } dispose() { this.cone.geometry.dispose(), this.cone.material.dispose(); } update() { this.light.updateMatrixWorld(); const t = this.light.distance ? this.light.distance : 1e3, e = t * Math.tan(this.light.angle); this.cone.scale.set(e, e, t), ah.setFromMatrixPosition(this.light.target.matrixWorld), this.cone.lookAt(ah), void 0 !== this.color ? this.cone.material.color.set(this.color) : this.cone.material.color.copy(this.light.color); } }), (t.Sprite = Vs), (t.SpriteMaterial = Rs), (t.SrcAlphaFactor = 204), (t.SrcAlphaSaturateFactor = 210), (t.SrcColorFactor = 202), (t.StaticCopyUsage = 35046), (t.StaticDrawUsage = et), (t.StaticReadUsage = 35045), (t.StereoCamera = class { constructor() { (this.type = 'StereoCamera'), (this.aspect = 1), (this.eyeSep = 0.064), (this.cameraL = new Kn()), this.cameraL.layers.enable(1), (this.cameraL.matrixAutoUpdate = !1), (this.cameraR = new Kn()), this.cameraR.layers.enable(2), (this.cameraR.matrixAutoUpdate = !1), (this._cache = { focus: null, fov: null, aspect: null, near: null, far: null, zoom: null, eyeSep: null, }); } update(t) { const e = this._cache; if ( e.focus !== t.focus || e.fov !== t.fov || e.aspect !== t.aspect * this.aspect || e.near !== t.near || e.far !== t.far || e.zoom !== t.zoom || e.eyeSep !== this.eyeSep ) { (e.focus = t.focus), (e.fov = t.fov), (e.aspect = t.aspect * this.aspect), (e.near = t.near), (e.far = t.far), (e.zoom = t.zoom), (e.eyeSep = this.eyeSep); const n = t.projectionMatrix.clone(), i = e.eyeSep / 2, r = (i * e.near) / e.focus, s = (e.near * Math.tan(ot * e.fov * 0.5)) / e.zoom; let a, o; (wc.elements[12] = -i), (_c.elements[12] = i), (a = -s * e.aspect + r), (o = s * e.aspect + r), (n.elements[0] = (2 * e.near) / (o - a)), (n.elements[8] = (o + a) / (o - a)), this.cameraL.projectionMatrix.copy(n), (a = -s * e.aspect - r), (o = s * e.aspect - r), (n.elements[0] = (2 * e.near) / (o - a)), (n.elements[8] = (o + a) / (o - a)), this.cameraR.projectionMatrix.copy(n); } this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(wc), this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(_c); } }), (t.StreamCopyUsage = 35042), (t.StreamDrawUsage = 35040), (t.StreamReadUsage = 35041), (t.StringKeyframeTrack = tl), (t.SubtractEquation = 101), (t.SubtractiveBlending = 3), (t.TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }), (t.TangentSpaceNormalMap = 0), (t.TetrahedronBufferGeometry = To), (t.TetrahedronGeometry = To), (t.TextBufferGeometry = Eo), (t.TextGeometry = Eo), (t.Texture = bt), (t.TextureLoader = pl), (t.TorusBufferGeometry = Ao), (t.TorusGeometry = Ao), (t.TorusKnotBufferGeometry = Lo), (t.TorusKnotGeometry = Lo), (t.Triangle = je), (t.TriangleFanDrawMode = 2), (t.TriangleStripDrawMode = 1), (t.TrianglesDrawMode = 0), (t.TubeBufferGeometry = Ro), (t.TubeGeometry = Ro), (t.UVMapping = i), (t.Uint16Attribute = function (t, e) { return ( console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ), new hn(t, e) ); }), (t.Uint16BufferAttribute = hn), (t.Uint32Attribute = function (t, e) { return ( console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ), new dn(t, e) ); }), (t.Uint32BufferAttribute = dn), (t.Uint8Attribute = function (t, e) { return ( console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ), new on(t, e) ); }), (t.Uint8BufferAttribute = on), (t.Uint8ClampedAttribute = function (t, e) { return ( console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ), new ln(t, e) ); }), (t.Uint8ClampedBufferAttribute = ln), (t.Uniform = Zc), (t.UniformsLib = ui), (t.UniformsUtils = Zn), (t.UnsignedByteType = x), (t.UnsignedInt248Type = S), (t.UnsignedIntType = w), (t.UnsignedShort4444Type = 1017), (t.UnsignedShort5551Type = 1018), (t.UnsignedShort565Type = 1019), (t.UnsignedShortType = _), (t.VSMShadowMap = 3), (t.Vector2 = vt), (t.Vector3 = Lt), (t.Vector4 = St), (t.VectorKeyframeTrack = el), (t.Vertex = function (t, e, n) { return ( console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ), new Lt(t, e, n) ); }), (t.VertexColors = 2), (t.VideoTexture = Aa), (t.WebGL1Renderer = bs), (t.WebGLCubeRenderTarget = ni), (t.WebGLMultisampleRenderTarget = Et), (t.WebGLRenderTarget = Tt), (t.WebGLRenderTargetCube = function (t, e, n) { return ( console.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' ), new ni(t, n) ); }), (t.WebGLRenderer = ws), (t.WebGLUtils = ms), (t.WireframeGeometry = Co), (t.WireframeHelper = function (t, e) { return ( console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ), new ya( new Co(t.geometry), new ca({ color: void 0 !== e ? e : 16777215 }) ) ); }), (t.WrapAroundEnding = W), (t.XHRLoader = function (t) { return ( console.warn('THREE.XHRLoader has been renamed to THREE.FileLoader.'), new cl(t) ); }), (t.ZeroCurvatureEnding = k), (t.ZeroFactor = 200), (t.ZeroSlopeEnding = V), (t.ZeroStencilOp = 0), (t.sRGBEncoding = Y), Object.defineProperty(t, '__esModule', { value: !0 }); });