From ad5b025a8be81dbb717133b41549932e652d6178 Mon Sep 17 00:00:00 2001 From: eliazarw Date: Sat, 3 Jan 2026 07:09:19 +0000 Subject: [PATCH] feat: Migrate to Vite build system, update dependencies, and refine graphics setup with debugging aids. --- .vscode/launch.json | 12 + index.html | 1 + node_modules/.package-lock.json | 49 +- node_modules/.vite/deps/_metadata.json | 34 + node_modules/.vite/deps/chunk-PIN6L3XG.js | 125 + node_modules/.vite/deps/chunk-PIN6L3XG.js.map | 7 + node_modules/.vite/deps/chunk-XSTVJSXX.js | 43003 ++++++++++++++++ node_modules/.vite/deps/chunk-XSTVJSXX.js.map | 7 + node_modules/.vite/deps/package.json | 3 + node_modules/.vite/deps/three.js | 876 + node_modules/.vite/deps/three.js.map | 7 + ...addons_controls_PointerLockControls__js.js | 7 + ...ns_controls_PointerLockControls__js.js.map | 7 + ...es_jsm_controls_PointerLockControls__js.js | 7 + ...sm_controls_PointerLockControls__js.js.map | 7 + .../{darwin-x64 => linux-x64}/README.md | 2 +- .../{darwin-x64 => linux-x64}/bin/esbuild | Bin 11320512 -> 11100344 bytes .../{darwin-x64 => linux-x64}/package.json | 6 +- .../@rollup/rollup-darwin-x64/README.md | 3 - .../rollup-darwin-x64/rollup.darwin-x64.node | Bin 1934520 -> 0 bytes .../@rollup/rollup-linux-x64-gnu/README.md | 3 + .../package.json | 11 +- .../rollup.linux-x64-gnu.node | Bin 0 -> 2092184 bytes node_modules/esbuild/bin/esbuild | Bin 11320512 -> 11100344 bytes node_modules/fsevents/LICENSE | 22 - node_modules/fsevents/README.md | 89 - node_modules/fsevents/fsevents.d.ts | 46 - node_modules/fsevents/fsevents.js | 83 - node_modules/fsevents/fsevents.node | Bin 163626 -> 0 bytes node_modules/fsevents/package.json | 62 - package-lock.json | 67 +- src/Game.js | 2 +- src/Graphics.js | 45 +- src/Player.js | 31 +- src/World.js | 17 +- src/main.js | 8 + vite.config.js | 8 + 37 files changed, 44297 insertions(+), 360 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 node_modules/.vite/deps/_metadata.json create mode 100644 node_modules/.vite/deps/chunk-PIN6L3XG.js create mode 100644 node_modules/.vite/deps/chunk-PIN6L3XG.js.map create mode 100644 node_modules/.vite/deps/chunk-XSTVJSXX.js create mode 100644 node_modules/.vite/deps/chunk-XSTVJSXX.js.map create mode 100644 node_modules/.vite/deps/package.json create mode 100644 node_modules/.vite/deps/three.js create mode 100644 node_modules/.vite/deps/three.js.map create mode 100644 node_modules/.vite/deps/three_addons_controls_PointerLockControls__js.js create mode 100644 node_modules/.vite/deps/three_addons_controls_PointerLockControls__js.js.map create mode 100644 node_modules/.vite/deps/three_examples_jsm_controls_PointerLockControls__js.js create mode 100644 node_modules/.vite/deps/three_examples_jsm_controls_PointerLockControls__js.js.map rename node_modules/@esbuild/{darwin-x64 => linux-x64}/README.md (54%) rename node_modules/@esbuild/{darwin-x64 => linux-x64}/bin/esbuild (65%) rename node_modules/@esbuild/{darwin-x64 => linux-x64}/package.json (70%) delete mode 100644 node_modules/@rollup/rollup-darwin-x64/README.md delete mode 100644 node_modules/@rollup/rollup-darwin-x64/rollup.darwin-x64.node create mode 100644 node_modules/@rollup/rollup-linux-x64-gnu/README.md rename node_modules/@rollup/{rollup-darwin-x64 => rollup-linux-x64-gnu}/package.json (67%) create mode 100644 node_modules/@rollup/rollup-linux-x64-gnu/rollup.linux-x64-gnu.node delete mode 100644 node_modules/fsevents/LICENSE delete mode 100644 node_modules/fsevents/README.md delete mode 100644 node_modules/fsevents/fsevents.d.ts delete mode 100644 node_modules/fsevents/fsevents.js delete mode 100755 node_modules/fsevents/fsevents.node delete mode 100644 node_modules/fsevents/package.json create mode 100644 vite.config.js diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..a83424b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/index.html b/index.html index 8fc117f..5c01308 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,7 @@
+
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 3973926..154afd9 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -4,43 +4,47 @@ "lockfileVersion": 3, "requires": true, "packages": { - "node_modules/@esbuild/darwin-x64": { + "node_modules/@esbuild/linux-x64": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@rollup/rollup-darwin-x64": { + "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.54.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", - "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ] }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" }, "node_modules/esbuild": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -80,6 +84,7 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -92,19 +97,6 @@ } } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -115,6 +107,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -125,12 +118,14 @@ "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -156,6 +151,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -169,6 +165,7 @@ "version": "4.54.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", + "license": "MIT", "dependencies": { "@types/estree": "1.0.8" }, @@ -209,6 +206,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -216,12 +214,14 @@ "node_modules/three": { "version": "0.182.0", "resolved": "https://registry.npmjs.org/three/-/three-0.182.0.tgz", - "integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==" + "integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==", + "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" @@ -237,6 +237,7 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "license": "MIT", "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", diff --git a/node_modules/.vite/deps/_metadata.json b/node_modules/.vite/deps/_metadata.json new file mode 100644 index 0000000..d29f3e6 --- /dev/null +++ b/node_modules/.vite/deps/_metadata.json @@ -0,0 +1,34 @@ +{ + "hash": "77190db0", + "configHash": "0fdb68c8", + "lockfileHash": "fe3966e1", + "browserHash": "bfeec663", + "optimized": { + "three": { + "src": "../../three/build/three.module.js", + "file": "three.js", + "fileHash": "3e7017a4", + "needsInterop": false + }, + "three/addons/controls/PointerLockControls.js": { + "src": "../../three/examples/jsm/controls/PointerLockControls.js", + "file": "three_addons_controls_PointerLockControls__js.js", + "fileHash": "185d9100", + "needsInterop": false + }, + "three/examples/jsm/controls/PointerLockControls.js": { + "src": "../../three/examples/jsm/controls/PointerLockControls.js", + "file": "three_examples_jsm_controls_PointerLockControls__js.js", + "fileHash": "98cdccce", + "needsInterop": false + } + }, + "chunks": { + "chunk-PIN6L3XG": { + "file": "chunk-PIN6L3XG.js" + }, + "chunk-XSTVJSXX": { + "file": "chunk-XSTVJSXX.js" + } + } +} \ No newline at end of file diff --git a/node_modules/.vite/deps/chunk-PIN6L3XG.js b/node_modules/.vite/deps/chunk-PIN6L3XG.js new file mode 100644 index 0000000..746992e --- /dev/null +++ b/node_modules/.vite/deps/chunk-PIN6L3XG.js @@ -0,0 +1,125 @@ +import { + Controls, + Euler, + Vector3 +} from "./chunk-XSTVJSXX.js"; + +// node_modules/three/examples/jsm/controls/PointerLockControls.js +var _euler = new Euler(0, 0, 0, "YXZ"); +var _vector = new Vector3(); +var _changeEvent = { type: "change" }; +var _lockEvent = { type: "lock" }; +var _unlockEvent = { type: "unlock" }; +var _MOUSE_SENSITIVITY = 2e-3; +var _PI_2 = Math.PI / 2; +var PointerLockControls = class extends Controls { + /** + * Constructs a new controls instance. + * + * @param {Camera} camera - The camera that is managed by the controls. + * @param {?HTMLElement} domElement - The HTML element used for event listeners. + */ + constructor(camera, domElement = null) { + super(camera, domElement); + this.isLocked = false; + this.minPolarAngle = 0; + this.maxPolarAngle = Math.PI; + this.pointerSpeed = 1; + this._onMouseMove = onMouseMove.bind(this); + this._onPointerlockChange = onPointerlockChange.bind(this); + this._onPointerlockError = onPointerlockError.bind(this); + if (this.domElement !== null) { + this.connect(this.domElement); + } + } + connect(element) { + super.connect(element); + this.domElement.ownerDocument.addEventListener("mousemove", this._onMouseMove); + this.domElement.ownerDocument.addEventListener("pointerlockchange", this._onPointerlockChange); + this.domElement.ownerDocument.addEventListener("pointerlockerror", this._onPointerlockError); + } + disconnect() { + this.domElement.ownerDocument.removeEventListener("mousemove", this._onMouseMove); + this.domElement.ownerDocument.removeEventListener("pointerlockchange", this._onPointerlockChange); + this.domElement.ownerDocument.removeEventListener("pointerlockerror", this._onPointerlockError); + } + dispose() { + this.disconnect(); + } + /** + * Returns the look direction of the camera. + * + * @param {Vector3} v - The target vector that is used to store the method's result. + * @return {Vector3} The normalized direction vector. + */ + getDirection(v) { + return v.set(0, 0, -1).applyQuaternion(this.object.quaternion); + } + /** + * Moves the camera forward parallel to the xz-plane. Assumes camera.up is y-up. + * + * @param {number} distance - The signed distance. + */ + moveForward(distance) { + if (this.enabled === false) return; + const camera = this.object; + _vector.setFromMatrixColumn(camera.matrix, 0); + _vector.crossVectors(camera.up, _vector); + camera.position.addScaledVector(_vector, distance); + } + /** + * Moves the camera sidewards parallel to the xz-plane. + * + * @param {number} distance - The signed distance. + */ + moveRight(distance) { + if (this.enabled === false) return; + const camera = this.object; + _vector.setFromMatrixColumn(camera.matrix, 0); + camera.position.addScaledVector(_vector, distance); + } + /** + * Activates the pointer lock. + * + * @param {boolean} [unadjustedMovement=false] - Disables OS-level adjustment for mouse acceleration, and accesses raw mouse input instead. + * Setting it to true will disable mouse acceleration. + */ + lock(unadjustedMovement = false) { + this.domElement.requestPointerLock({ + unadjustedMovement + }); + } + /** + * Exits the pointer lock. + */ + unlock() { + this.domElement.ownerDocument.exitPointerLock(); + } +}; +function onMouseMove(event) { + if (this.enabled === false || this.isLocked === false) return; + const camera = this.object; + _euler.setFromQuaternion(camera.quaternion); + _euler.y -= event.movementX * _MOUSE_SENSITIVITY * this.pointerSpeed; + _euler.x -= event.movementY * _MOUSE_SENSITIVITY * this.pointerSpeed; + _euler.x = Math.max(_PI_2 - this.maxPolarAngle, Math.min(_PI_2 - this.minPolarAngle, _euler.x)); + camera.quaternion.setFromEuler(_euler); + this.dispatchEvent(_changeEvent); +} +function onPointerlockChange() { + if (this.domElement.ownerDocument.pointerLockElement === this.domElement) { + this.dispatchEvent(_lockEvent); + this.isLocked = true; + } else { + this.dispatchEvent(_unlockEvent); + this.isLocked = false; + } +} +function onPointerlockError() { + console.error("THREE.PointerLockControls: Unable to use Pointer Lock API"); +} + +export { + PointerLockControls +}; +//# sourceMappingURL=chunk-PIN6L3XG.js.map diff --git a/node_modules/.vite/deps/chunk-PIN6L3XG.js.map b/node_modules/.vite/deps/chunk-PIN6L3XG.js.map new file mode 100644 index 0000000..ab8fde6 --- /dev/null +++ b/node_modules/.vite/deps/chunk-PIN6L3XG.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../three/examples/jsm/controls/PointerLockControls.js"], + "sourcesContent": ["import {\n\tControls,\n\tEuler,\n\tVector3\n} from 'three';\n\nconst _euler = new Euler( 0, 0, 0, 'YXZ' );\nconst _vector = new Vector3();\n\n/**\n * Fires when the user moves the mouse.\n *\n * @event PointerLockControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\n/**\n * Fires when the pointer lock status is \"locked\" (in other words: the mouse is captured).\n *\n * @event PointerLockControls#lock\n * @type {Object}\n */\nconst _lockEvent = { type: 'lock' };\n\n/**\n * Fires when the pointer lock status is \"unlocked\" (in other words: the mouse is not captured anymore).\n *\n * @event PointerLockControls#unlock\n * @type {Object}\n */\nconst _unlockEvent = { type: 'unlock' };\n\nconst _MOUSE_SENSITIVITY = 0.002;\nconst _PI_2 = Math.PI / 2;\n\n/**\n * The implementation of this class is based on the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API).\n * `PointerLockControls` is a perfect choice for first person 3D games.\n *\n * ```js\n * const controls = new PointerLockControls( camera, document.body );\n *\n * // add event listener to show/hide a UI (e.g. the game's menu)\n * controls.addEventListener( 'lock', function () {\n *\n * \tmenu.style.display = 'none';\n *\n * } );\n *\n * controls.addEventListener( 'unlock', function () {\n *\n * \tmenu.style.display = 'block';\n *\n * } );\n * ```\n *\n * @augments Controls\n * @three_import import { PointerLockControls } from 'three/addons/controls/PointerLockControls.js';\n */\nclass PointerLockControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Camera} camera - The camera that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( camera, domElement = null ) {\n\n\t\tsuper( camera, domElement );\n\n\t\t/**\n\t\t * Whether the controls are locked or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isLocked = false;\n\n\t\t/**\n\t\t * Camera pitch, lower limit. Range is '[0, Math.PI]' in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minPolarAngle = 0;\n\n\t\t/**\n\t\t * Camera pitch, upper limit. Range is '[0, Math.PI]' in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI\n\t\t */\n\t\tthis.maxPolarAngle = Math.PI;\n\n\t\t/**\n\t\t * Multiplier for how much the pointer movement influences the camera rotation.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.pointerSpeed = 1.0;\n\n\t\t// event listeners\n\n\t\tthis._onMouseMove = onMouseMove.bind( this );\n\t\tthis._onPointerlockChange = onPointerlockChange.bind( this );\n\t\tthis._onPointerlockError = onPointerlockError.bind( this );\n\n\t\tif ( this.domElement !== null ) {\n\n\t\t\tthis.connect( this.domElement );\n\n\t\t}\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\tthis.domElement.ownerDocument.addEventListener( 'mousemove', this._onMouseMove );\n\t\tthis.domElement.ownerDocument.addEventListener( 'pointerlockchange', this._onPointerlockChange );\n\t\tthis.domElement.ownerDocument.addEventListener( 'pointerlockerror', this._onPointerlockError );\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.ownerDocument.removeEventListener( 'mousemove', this._onMouseMove );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointerlockchange', this._onPointerlockChange );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointerlockerror', this._onPointerlockError );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Returns the look direction of the camera.\n\t *\n\t * @param {Vector3} v - The target vector that is used to store the method's result.\n\t * @return {Vector3} The normalized direction vector.\n\t */\n\tgetDirection( v ) {\n\n\t\treturn v.set( 0, 0, - 1 ).applyQuaternion( this.object.quaternion );\n\n\t}\n\n\t/**\n\t * Moves the camera forward parallel to the xz-plane. Assumes camera.up is y-up.\n\t *\n\t * @param {number} distance - The signed distance.\n\t */\n\tmoveForward( distance ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// move forward parallel to the xz-plane\n\t\t// assumes camera.up is y-up\n\n\t\tconst camera = this.object;\n\n\t\t_vector.setFromMatrixColumn( camera.matrix, 0 );\n\n\t\t_vector.crossVectors( camera.up, _vector );\n\n\t\tcamera.position.addScaledVector( _vector, distance );\n\n\t}\n\n\t/**\n\t * Moves the camera sidewards parallel to the xz-plane.\n\t *\n\t * @param {number} distance - The signed distance.\n\t */\n\tmoveRight( distance ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\tconst camera = this.object;\n\n\t\t_vector.setFromMatrixColumn( camera.matrix, 0 );\n\n\t\tcamera.position.addScaledVector( _vector, distance );\n\n\t}\n\n\t/**\n\t * Activates the pointer lock.\n\t *\n\t * @param {boolean} [unadjustedMovement=false] - Disables OS-level adjustment for mouse acceleration, and accesses raw mouse input instead.\n\t * Setting it to true will disable mouse acceleration.\n\t */\n\tlock( unadjustedMovement = false ) {\n\n\t\tthis.domElement.requestPointerLock( {\n\t\t\tunadjustedMovement\n\t\t} );\n\n\t}\n\n\t/**\n\t * Exits the pointer lock.\n\t */\n\tunlock() {\n\n\t\tthis.domElement.ownerDocument.exitPointerLock();\n\n\t}\n\n}\n\n// event listeners\n\nfunction onMouseMove( event ) {\n\n\tif ( this.enabled === false || this.isLocked === false ) return;\n\n\tconst camera = this.object;\n\t_euler.setFromQuaternion( camera.quaternion );\n\n\t_euler.y -= event.movementX * _MOUSE_SENSITIVITY * this.pointerSpeed;\n\t_euler.x -= event.movementY * _MOUSE_SENSITIVITY * this.pointerSpeed;\n\n\t_euler.x = Math.max( _PI_2 - this.maxPolarAngle, Math.min( _PI_2 - this.minPolarAngle, _euler.x ) );\n\n\tcamera.quaternion.setFromEuler( _euler );\n\n\tthis.dispatchEvent( _changeEvent );\n\n}\n\nfunction onPointerlockChange() {\n\n\tif ( this.domElement.ownerDocument.pointerLockElement === this.domElement ) {\n\n\t\tthis.dispatchEvent( _lockEvent );\n\n\t\tthis.isLocked = true;\n\n\t} else {\n\n\t\tthis.dispatchEvent( _unlockEvent );\n\n\t\tthis.isLocked = false;\n\n\t}\n\n}\n\nfunction onPointerlockError() {\n\n\tconsole.error( 'THREE.PointerLockControls: Unable to use Pointer Lock API' );\n\n}\n\nexport { PointerLockControls };\n"], + "mappings": ";;;;;;;AAMA,IAAM,SAAS,IAAI,MAAO,GAAG,GAAG,GAAG,KAAM;AACzC,IAAM,UAAU,IAAI,QAAQ;AAQ5B,IAAM,eAAe,EAAE,MAAM,SAAS;AAQtC,IAAM,aAAa,EAAE,MAAM,OAAO;AAQlC,IAAM,eAAe,EAAE,MAAM,SAAS;AAEtC,IAAM,qBAAqB;AAC3B,IAAM,QAAQ,KAAK,KAAK;AA0BxB,IAAM,sBAAN,cAAkC,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ1C,YAAa,QAAQ,aAAa,MAAO;AAExC,UAAO,QAAQ,UAAW;AAS1B,SAAK,WAAW;AAQhB,SAAK,gBAAgB;AAQrB,SAAK,gBAAgB,KAAK;AAQ1B,SAAK,eAAe;AAIpB,SAAK,eAAe,YAAY,KAAM,IAAK;AAC3C,SAAK,uBAAuB,oBAAoB,KAAM,IAAK;AAC3D,SAAK,sBAAsB,mBAAmB,KAAM,IAAK;AAEzD,QAAK,KAAK,eAAe,MAAO;AAE/B,WAAK,QAAS,KAAK,UAAW;AAAA,IAE/B;AAAA,EAED;AAAA,EAEA,QAAS,SAAU;AAElB,UAAM,QAAS,OAAQ;AAEvB,SAAK,WAAW,cAAc,iBAAkB,aAAa,KAAK,YAAa;AAC/E,SAAK,WAAW,cAAc,iBAAkB,qBAAqB,KAAK,oBAAqB;AAC/F,SAAK,WAAW,cAAc,iBAAkB,oBAAoB,KAAK,mBAAoB;AAAA,EAE9F;AAAA,EAEA,aAAa;AAEZ,SAAK,WAAW,cAAc,oBAAqB,aAAa,KAAK,YAAa;AAClF,SAAK,WAAW,cAAc,oBAAqB,qBAAqB,KAAK,oBAAqB;AAClG,SAAK,WAAW,cAAc,oBAAqB,oBAAoB,KAAK,mBAAoB;AAAA,EAEjG;AAAA,EAEA,UAAU;AAET,SAAK,WAAW;AAAA,EAEjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAc,GAAI;AAEjB,WAAO,EAAE,IAAK,GAAG,GAAG,EAAI,EAAE,gBAAiB,KAAK,OAAO,UAAW;AAAA,EAEnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAa,UAAW;AAEvB,QAAK,KAAK,YAAY,MAAQ;AAK9B,UAAM,SAAS,KAAK;AAEpB,YAAQ,oBAAqB,OAAO,QAAQ,CAAE;AAE9C,YAAQ,aAAc,OAAO,IAAI,OAAQ;AAEzC,WAAO,SAAS,gBAAiB,SAAS,QAAS;AAAA,EAEpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAW,UAAW;AAErB,QAAK,KAAK,YAAY,MAAQ;AAE9B,UAAM,SAAS,KAAK;AAEpB,YAAQ,oBAAqB,OAAO,QAAQ,CAAE;AAE9C,WAAO,SAAS,gBAAiB,SAAS,QAAS;AAAA,EAEpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAM,qBAAqB,OAAQ;AAElC,SAAK,WAAW,mBAAoB;AAAA,MACnC;AAAA,IACD,CAAE;AAAA,EAEH;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AAER,SAAK,WAAW,cAAc,gBAAgB;AAAA,EAE/C;AAED;AAIA,SAAS,YAAa,OAAQ;AAE7B,MAAK,KAAK,YAAY,SAAS,KAAK,aAAa,MAAQ;AAEzD,QAAM,SAAS,KAAK;AACpB,SAAO,kBAAmB,OAAO,UAAW;AAE5C,SAAO,KAAK,MAAM,YAAY,qBAAqB,KAAK;AACxD,SAAO,KAAK,MAAM,YAAY,qBAAqB,KAAK;AAExD,SAAO,IAAI,KAAK,IAAK,QAAQ,KAAK,eAAe,KAAK,IAAK,QAAQ,KAAK,eAAe,OAAO,CAAE,CAAE;AAElG,SAAO,WAAW,aAAc,MAAO;AAEvC,OAAK,cAAe,YAAa;AAElC;AAEA,SAAS,sBAAsB;AAE9B,MAAK,KAAK,WAAW,cAAc,uBAAuB,KAAK,YAAa;AAE3E,SAAK,cAAe,UAAW;AAE/B,SAAK,WAAW;AAAA,EAEjB,OAAO;AAEN,SAAK,cAAe,YAAa;AAEjC,SAAK,WAAW;AAAA,EAEjB;AAED;AAEA,SAAS,qBAAqB;AAE7B,UAAQ,MAAO,2DAA4D;AAE5E;", + "names": [] +} diff --git a/node_modules/.vite/deps/chunk-XSTVJSXX.js b/node_modules/.vite/deps/chunk-XSTVJSXX.js new file mode 100644 index 0000000..2cab24b --- /dev/null +++ b/node_modules/.vite/deps/chunk-XSTVJSXX.js @@ -0,0 +1,43003 @@ +// node_modules/three/build/three.core.js +var REVISION = "182"; +var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }; +var TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }; +var CullFaceNone = 0; +var CullFaceBack = 1; +var CullFaceFront = 2; +var CullFaceFrontBack = 3; +var BasicShadowMap = 0; +var PCFShadowMap = 1; +var PCFSoftShadowMap = 2; +var VSMShadowMap = 3; +var FrontSide = 0; +var BackSide = 1; +var DoubleSide = 2; +var NoBlending = 0; +var NormalBlending = 1; +var AdditiveBlending = 2; +var SubtractiveBlending = 3; +var MultiplyBlending = 4; +var CustomBlending = 5; +var AddEquation = 100; +var SubtractEquation = 101; +var ReverseSubtractEquation = 102; +var MinEquation = 103; +var MaxEquation = 104; +var ZeroFactor = 200; +var OneFactor = 201; +var SrcColorFactor = 202; +var OneMinusSrcColorFactor = 203; +var SrcAlphaFactor = 204; +var OneMinusSrcAlphaFactor = 205; +var DstAlphaFactor = 206; +var OneMinusDstAlphaFactor = 207; +var DstColorFactor = 208; +var OneMinusDstColorFactor = 209; +var SrcAlphaSaturateFactor = 210; +var ConstantColorFactor = 211; +var OneMinusConstantColorFactor = 212; +var ConstantAlphaFactor = 213; +var OneMinusConstantAlphaFactor = 214; +var NeverDepth = 0; +var AlwaysDepth = 1; +var LessDepth = 2; +var LessEqualDepth = 3; +var EqualDepth = 4; +var GreaterEqualDepth = 5; +var GreaterDepth = 6; +var NotEqualDepth = 7; +var MultiplyOperation = 0; +var MixOperation = 1; +var AddOperation = 2; +var NoToneMapping = 0; +var LinearToneMapping = 1; +var ReinhardToneMapping = 2; +var CineonToneMapping = 3; +var ACESFilmicToneMapping = 4; +var CustomToneMapping = 5; +var AgXToneMapping = 6; +var NeutralToneMapping = 7; +var AttachedBindMode = "attached"; +var DetachedBindMode = "detached"; +var UVMapping = 300; +var CubeReflectionMapping = 301; +var CubeRefractionMapping = 302; +var EquirectangularReflectionMapping = 303; +var EquirectangularRefractionMapping = 304; +var CubeUVReflectionMapping = 306; +var RepeatWrapping = 1e3; +var ClampToEdgeWrapping = 1001; +var MirroredRepeatWrapping = 1002; +var NearestFilter = 1003; +var NearestMipmapNearestFilter = 1004; +var NearestMipMapNearestFilter = 1004; +var NearestMipmapLinearFilter = 1005; +var NearestMipMapLinearFilter = 1005; +var LinearFilter = 1006; +var LinearMipmapNearestFilter = 1007; +var LinearMipMapNearestFilter = 1007; +var LinearMipmapLinearFilter = 1008; +var LinearMipMapLinearFilter = 1008; +var UnsignedByteType = 1009; +var ByteType = 1010; +var ShortType = 1011; +var UnsignedShortType = 1012; +var IntType = 1013; +var UnsignedIntType = 1014; +var FloatType = 1015; +var HalfFloatType = 1016; +var UnsignedShort4444Type = 1017; +var UnsignedShort5551Type = 1018; +var UnsignedInt248Type = 1020; +var UnsignedInt5999Type = 35902; +var UnsignedInt101111Type = 35899; +var AlphaFormat = 1021; +var RGBFormat = 1022; +var RGBAFormat = 1023; +var DepthFormat = 1026; +var DepthStencilFormat = 1027; +var RedFormat = 1028; +var RedIntegerFormat = 1029; +var RGFormat = 1030; +var RGIntegerFormat = 1031; +var RGBIntegerFormat = 1032; +var RGBAIntegerFormat = 1033; +var RGB_S3TC_DXT1_Format = 33776; +var RGBA_S3TC_DXT1_Format = 33777; +var RGBA_S3TC_DXT3_Format = 33778; +var RGBA_S3TC_DXT5_Format = 33779; +var RGB_PVRTC_4BPPV1_Format = 35840; +var RGB_PVRTC_2BPPV1_Format = 35841; +var RGBA_PVRTC_4BPPV1_Format = 35842; +var RGBA_PVRTC_2BPPV1_Format = 35843; +var RGB_ETC1_Format = 36196; +var RGB_ETC2_Format = 37492; +var RGBA_ETC2_EAC_Format = 37496; +var R11_EAC_Format = 37488; +var SIGNED_R11_EAC_Format = 37489; +var RG11_EAC_Format = 37490; +var SIGNED_RG11_EAC_Format = 37491; +var RGBA_ASTC_4x4_Format = 37808; +var RGBA_ASTC_5x4_Format = 37809; +var RGBA_ASTC_5x5_Format = 37810; +var RGBA_ASTC_6x5_Format = 37811; +var RGBA_ASTC_6x6_Format = 37812; +var RGBA_ASTC_8x5_Format = 37813; +var RGBA_ASTC_8x6_Format = 37814; +var RGBA_ASTC_8x8_Format = 37815; +var RGBA_ASTC_10x5_Format = 37816; +var RGBA_ASTC_10x6_Format = 37817; +var RGBA_ASTC_10x8_Format = 37818; +var RGBA_ASTC_10x10_Format = 37819; +var RGBA_ASTC_12x10_Format = 37820; +var RGBA_ASTC_12x12_Format = 37821; +var RGBA_BPTC_Format = 36492; +var RGB_BPTC_SIGNED_Format = 36494; +var RGB_BPTC_UNSIGNED_Format = 36495; +var RED_RGTC1_Format = 36283; +var SIGNED_RED_RGTC1_Format = 36284; +var RED_GREEN_RGTC2_Format = 36285; +var SIGNED_RED_GREEN_RGTC2_Format = 36286; +var LoopOnce = 2200; +var LoopRepeat = 2201; +var LoopPingPong = 2202; +var InterpolateDiscrete = 2300; +var InterpolateLinear = 2301; +var InterpolateSmooth = 2302; +var ZeroCurvatureEnding = 2400; +var ZeroSlopeEnding = 2401; +var WrapAroundEnding = 2402; +var NormalAnimationBlendMode = 2500; +var AdditiveAnimationBlendMode = 2501; +var TrianglesDrawMode = 0; +var TriangleStripDrawMode = 1; +var TriangleFanDrawMode = 2; +var BasicDepthPacking = 3200; +var RGBADepthPacking = 3201; +var RGBDepthPacking = 3202; +var RGDepthPacking = 3203; +var TangentSpaceNormalMap = 0; +var ObjectSpaceNormalMap = 1; +var NoColorSpace = ""; +var SRGBColorSpace = "srgb"; +var LinearSRGBColorSpace = "srgb-linear"; +var LinearTransfer = "linear"; +var SRGBTransfer = "srgb"; +var NoNormalPacking = ""; +var NormalRGPacking = "rg"; +var NormalGAPacking = "ga"; +var ZeroStencilOp = 0; +var KeepStencilOp = 7680; +var ReplaceStencilOp = 7681; +var IncrementStencilOp = 7682; +var DecrementStencilOp = 7683; +var IncrementWrapStencilOp = 34055; +var DecrementWrapStencilOp = 34056; +var InvertStencilOp = 5386; +var NeverStencilFunc = 512; +var LessStencilFunc = 513; +var EqualStencilFunc = 514; +var LessEqualStencilFunc = 515; +var GreaterStencilFunc = 516; +var NotEqualStencilFunc = 517; +var GreaterEqualStencilFunc = 518; +var AlwaysStencilFunc = 519; +var NeverCompare = 512; +var LessCompare = 513; +var EqualCompare = 514; +var LessEqualCompare = 515; +var GreaterCompare = 516; +var NotEqualCompare = 517; +var GreaterEqualCompare = 518; +var AlwaysCompare = 519; +var StaticDrawUsage = 35044; +var DynamicDrawUsage = 35048; +var StreamDrawUsage = 35040; +var StaticReadUsage = 35045; +var DynamicReadUsage = 35049; +var StreamReadUsage = 35041; +var StaticCopyUsage = 35046; +var DynamicCopyUsage = 35050; +var StreamCopyUsage = 35042; +var GLSL1 = "100"; +var GLSL3 = "300 es"; +var WebGLCoordinateSystem = 2e3; +var WebGPUCoordinateSystem = 2001; +var TimestampQuery = { + COMPUTE: "compute", + RENDER: "render" +}; +var InterpolationSamplingType = { + PERSPECTIVE: "perspective", + LINEAR: "linear", + FLAT: "flat" +}; +var InterpolationSamplingMode = { + NORMAL: "normal", + CENTROID: "centroid", + SAMPLE: "sample", + FIRST: "first", + EITHER: "either" +}; +function arrayNeedsUint32(array) { + for (let i = array.length - 1; i >= 0; --i) { + if (array[i] >= 65535) return true; + } + return false; +} +var TYPED_ARRAYS = { + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array +}; +function getTypedArray(type, buffer) { + return new TYPED_ARRAYS[type](buffer); +} +function isTypedArray(array) { + return ArrayBuffer.isView(array) && !(array instanceof DataView); +} +function createElementNS(name) { + return document.createElementNS("http://www.w3.org/1999/xhtml", name); +} +function createCanvasElement() { + const canvas = createElementNS("canvas"); + canvas.style.display = "block"; + return canvas; +} +var _cache = {}; +var _setConsoleFunction = null; +function setConsoleFunction(fn) { + _setConsoleFunction = fn; +} +function getConsoleFunction() { + return _setConsoleFunction; +} +function log(...params) { + const message = "THREE." + params.shift(); + if (_setConsoleFunction) { + _setConsoleFunction("log", message, ...params); + } else { + console.log(message, ...params); + } +} +function warn(...params) { + const message = "THREE." + params.shift(); + if (_setConsoleFunction) { + _setConsoleFunction("warn", message, ...params); + } else { + console.warn(message, ...params); + } +} +function error(...params) { + const message = "THREE." + params.shift(); + if (_setConsoleFunction) { + _setConsoleFunction("error", message, ...params); + } else { + console.error(message, ...params); + } +} +function warnOnce(...params) { + const message = params.join(" "); + if (message in _cache) return; + _cache[message] = true; + warn(...params); +} +function probeAsync(gl, sync, interval) { + return new Promise(function(resolve, reject) { + function probe() { + switch (gl.clientWaitSync(sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0)) { + case gl.WAIT_FAILED: + reject(); + break; + case gl.TIMEOUT_EXPIRED: + setTimeout(probe, interval); + break; + default: + resolve(); + } + } + setTimeout(probe, interval); + }); +} +var EventDispatcher = class { + /** + * Adds the given event listener to the given event type. + * + * @param {string} type - The type of event to listen to. + * @param {Function} listener - The function that gets called when the event is fired. + */ + addEventListener(type, listener) { + if (this._listeners === void 0) this._listeners = {}; + const listeners = this._listeners; + if (listeners[type] === void 0) { + listeners[type] = []; + } + if (listeners[type].indexOf(listener) === -1) { + listeners[type].push(listener); + } + } + /** + * Returns `true` if the given event listener has been added to the given event type. + * + * @param {string} type - The type of event. + * @param {Function} listener - The listener to check. + * @return {boolean} Whether the given event listener has been added to the given event type. + */ + hasEventListener(type, listener) { + const listeners = this._listeners; + if (listeners === void 0) return false; + return listeners[type] !== void 0 && listeners[type].indexOf(listener) !== -1; + } + /** + * Removes the given event listener from the given event type. + * + * @param {string} type - The type of event. + * @param {Function} listener - The listener to remove. + */ + removeEventListener(type, listener) { + const listeners = this._listeners; + if (listeners === void 0) return; + const listenerArray = listeners[type]; + if (listenerArray !== void 0) { + const index = listenerArray.indexOf(listener); + if (index !== -1) { + listenerArray.splice(index, 1); + } + } + } + /** + * Dispatches an event object. + * + * @param {Object} event - The event that gets fired. + */ + dispatchEvent(event) { + const listeners = this._listeners; + if (listeners === void 0) return; + const listenerArray = listeners[event.type]; + if (listenerArray !== void 0) { + event.target = this; + const array = listenerArray.slice(0); + for (let i = 0, l = array.length; i < l; i++) { + array[i].call(this, event); + } + event.target = null; + } + } +}; +var _lut = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf", "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df", "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff"]; +var _seed = 1234567; +var DEG2RAD = Math.PI / 180; +var RAD2DEG = 180 / Math.PI; +function generateUUID() { + const d0 = Math.random() * 4294967295 | 0; + const d1 = Math.random() * 4294967295 | 0; + const d2 = Math.random() * 4294967295 | 0; + const d3 = Math.random() * 4294967295 | 0; + const uuid = _lut[d0 & 255] + _lut[d0 >> 8 & 255] + _lut[d0 >> 16 & 255] + _lut[d0 >> 24 & 255] + "-" + _lut[d1 & 255] + _lut[d1 >> 8 & 255] + "-" + _lut[d1 >> 16 & 15 | 64] + _lut[d1 >> 24 & 255] + "-" + _lut[d2 & 63 | 128] + _lut[d2 >> 8 & 255] + "-" + _lut[d2 >> 16 & 255] + _lut[d2 >> 24 & 255] + _lut[d3 & 255] + _lut[d3 >> 8 & 255] + _lut[d3 >> 16 & 255] + _lut[d3 >> 24 & 255]; + return uuid.toLowerCase(); +} +function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); +} +function euclideanModulo(n, m) { + return (n % m + m) % m; +} +function mapLinear(x, a1, a2, b1, b2) { + return b1 + (x - a1) * (b2 - b1) / (a2 - a1); +} +function inverseLerp(x, y, value) { + if (x !== y) { + return (value - x) / (y - x); + } else { + return 0; + } +} +function lerp(x, y, t) { + return (1 - t) * x + t * y; +} +function damp(x, y, lambda, dt) { + return lerp(x, y, 1 - Math.exp(-lambda * dt)); +} +function pingpong(x, length = 1) { + return length - Math.abs(euclideanModulo(x, length * 2) - length); +} +function smoothstep(x, min, max) { + if (x <= min) return 0; + if (x >= max) return 1; + x = (x - min) / (max - min); + return x * x * (3 - 2 * x); +} +function smootherstep(x, min, max) { + if (x <= min) return 0; + if (x >= max) return 1; + x = (x - min) / (max - min); + return x * x * x * (x * (x * 6 - 15) + 10); +} +function randInt(low, high) { + return low + Math.floor(Math.random() * (high - low + 1)); +} +function randFloat(low, high) { + return low + Math.random() * (high - low); +} +function randFloatSpread(range) { + return range * (0.5 - Math.random()); +} +function seededRandom(s) { + if (s !== void 0) _seed = s; + let t = _seed += 1831565813; + t = Math.imul(t ^ t >>> 15, t | 1); + t ^= t + Math.imul(t ^ t >>> 7, t | 61); + return ((t ^ t >>> 14) >>> 0) / 4294967296; +} +function degToRad(degrees) { + return degrees * DEG2RAD; +} +function radToDeg(radians) { + return radians * RAD2DEG; +} +function isPowerOfTwo(value) { + return (value & value - 1) === 0 && value !== 0; +} +function ceilPowerOfTwo(value) { + return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); +} +function floorPowerOfTwo(value) { + return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)); +} +function setQuaternionFromProperEuler(q, a, b, c, order) { + const cos = Math.cos; + const sin = Math.sin; + const c2 = cos(b / 2); + const s2 = sin(b / 2); + const c13 = cos((a + c) / 2); + const s13 = sin((a + c) / 2); + const c1_3 = cos((a - c) / 2); + const s1_3 = sin((a - c) / 2); + const c3_1 = cos((c - a) / 2); + const s3_1 = sin((c - a) / 2); + switch (order) { + case "XYX": + q.set(c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13); + break; + case "YZY": + q.set(s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13); + break; + case "ZXZ": + q.set(s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13); + break; + case "XZX": + q.set(c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13); + break; + case "YXY": + q.set(s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13); + break; + case "ZYZ": + q.set(s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13); + break; + default: + warn("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: " + order); + } +} +function denormalize(value, array) { + switch (array.constructor) { + case Float32Array: + return value; + case Uint32Array: + return value / 4294967295; + case Uint16Array: + return value / 65535; + case Uint8Array: + return value / 255; + case Int32Array: + return Math.max(value / 2147483647, -1); + case Int16Array: + return Math.max(value / 32767, -1); + case Int8Array: + return Math.max(value / 127, -1); + default: + throw new Error("Invalid component type."); + } +} +function normalize(value, array) { + switch (array.constructor) { + case Float32Array: + return value; + case Uint32Array: + return Math.round(value * 4294967295); + case Uint16Array: + return Math.round(value * 65535); + case Uint8Array: + return Math.round(value * 255); + case Int32Array: + return Math.round(value * 2147483647); + case Int16Array: + return Math.round(value * 32767); + case Int8Array: + return Math.round(value * 127); + default: + throw new Error("Invalid component type."); + } +} +var MathUtils = { + DEG2RAD, + RAD2DEG, + /** + * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) + * (universally unique identifier). + * + * @static + * @method + * @return {string} The UUID. + */ + generateUUID, + /** + * Clamps the given value between min and max. + * + * @static + * @method + * @param {number} value - The value to clamp. + * @param {number} min - The min value. + * @param {number} max - The max value. + * @return {number} The clamped value. + */ + clamp, + /** + * Computes the Euclidean modulo of the given parameters that + * is `( ( n % m ) + m ) % m`. + * + * @static + * @method + * @param {number} n - The first parameter. + * @param {number} m - The second parameter. + * @return {number} The Euclidean modulo. + */ + euclideanModulo, + /** + * Performs a linear mapping from range `` to range `` + * for the given value. + * + * @static + * @method + * @param {number} x - The value to be mapped. + * @param {number} a1 - Minimum value for range A. + * @param {number} a2 - Maximum value for range A. + * @param {number} b1 - Minimum value for range B. + * @param {number} b2 - Maximum value for range B. + * @return {number} The mapped value. + */ + mapLinear, + /** + * Returns the percentage in the closed interval `[0, 1]` of the given value + * between the start and end point. + * + * @static + * @method + * @param {number} x - The start point + * @param {number} y - The end point. + * @param {number} value - A value between start and end. + * @return {number} The interpolation factor. + */ + inverseLerp, + /** + * Returns a value linearly interpolated from two known points based on the given interval - + * `t = 0` will return `x` and `t = 1` will return `y`. + * + * @static + * @method + * @param {number} x - The start point + * @param {number} y - The end point. + * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. + * @return {number} The interpolated value. + */ + lerp, + /** + * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta + * time to maintain frame rate independent movement. For details, see + * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/). + * + * @static + * @method + * @param {number} x - The current point. + * @param {number} y - The target point. + * @param {number} lambda - A higher lambda value will make the movement more sudden, + * and a lower value will make the movement more gradual. + * @param {number} dt - Delta time in seconds. + * @return {number} The interpolated value. + */ + damp, + /** + * Returns a value that alternates between `0` and the given `length` parameter. + * + * @static + * @method + * @param {number} x - The value to pingpong. + * @param {number} [length=1] - The positive value the function will pingpong to. + * @return {number} The alternated value. + */ + pingpong, + /** + * Returns a value in the range `[0,1]` that represents the percentage that `x` has + * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to + * the `min` and `max`. + * + * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details. + * + * @static + * @method + * @param {number} x - The value to evaluate based on its position between min and max. + * @param {number} min - The min value. Any x value below min will be `0`. + * @param {number} max - The max value. Any x value above max will be `1`. + * @return {number} The alternated value. + */ + smoothstep, + /** + * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations) + * that has zero 1st and 2nd order derivatives at x=0 and x=1. + * + * @static + * @method + * @param {number} x - The value to evaluate based on its position between min and max. + * @param {number} min - The min value. Any x value below min will be `0`. + * @param {number} max - The max value. Any x value above max will be `1`. + * @return {number} The alternated value. + */ + smootherstep, + /** + * Returns a random integer from `` interval. + * + * @static + * @method + * @param {number} low - The lower value boundary. + * @param {number} high - The upper value boundary + * @return {number} A random integer. + */ + randInt, + /** + * Returns a random float from `` interval. + * + * @static + * @method + * @param {number} low - The lower value boundary. + * @param {number} high - The upper value boundary + * @return {number} A random float. + */ + randFloat, + /** + * Returns a random integer from `<-range/2, range/2>` interval. + * + * @static + * @method + * @param {number} range - Defines the value range. + * @return {number} A random float. + */ + randFloatSpread, + /** + * Returns a deterministic pseudo-random float in the interval `[0, 1]`. + * + * @static + * @method + * @param {number} [s] - The integer seed. + * @return {number} A random float. + */ + seededRandom, + /** + * Converts degrees to radians. + * + * @static + * @method + * @param {number} degrees - A value in degrees. + * @return {number} The converted value in radians. + */ + degToRad, + /** + * Converts radians to degrees. + * + * @static + * @method + * @param {number} radians - A value in radians. + * @return {number} The converted value in degrees. + */ + radToDeg, + /** + * Returns `true` if the given number is a power of two. + * + * @static + * @method + * @param {number} value - The value to check. + * @return {boolean} Whether the given number is a power of two or not. + */ + isPowerOfTwo, + /** + * Returns the smallest power of two that is greater than or equal to the given number. + * + * @static + * @method + * @param {number} value - The value to find a POT for. + * @return {number} The smallest power of two that is greater than or equal to the given number. + */ + ceilPowerOfTwo, + /** + * Returns the largest power of two that is less than or equal to the given number. + * + * @static + * @method + * @param {number} value - The value to find a POT for. + * @return {number} The largest power of two that is less than or equal to the given number. + */ + floorPowerOfTwo, + /** + * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles) + * defined by the given angles and order. + * + * Rotations are applied to the axes in the order specified by order: + * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`. + * + * @static + * @method + * @param {Quaternion} q - The quaternion to set. + * @param {number} a - The rotation applied to the first axis, in radians. + * @param {number} b - The rotation applied to the second axis, in radians. + * @param {number} c - The rotation applied to the third axis, in radians. + * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order. + */ + setQuaternionFromProperEuler, + /** + * Normalizes the given value according to the given typed array. + * + * @static + * @method + * @param {number} value - The float value in the range `[0,1]` to normalize. + * @param {TypedArray} array - The typed array that defines the data type of the value. + * @return {number} The normalize value. + */ + normalize, + /** + * Denormalizes the given value according to the given typed array. + * + * @static + * @method + * @param {number} value - The value to denormalize. + * @param {TypedArray} array - The typed array that defines the data type of the value. + * @return {number} The denormalize (float) value in the range `[0,1]`. + */ + denormalize +}; +var Vector2 = class _Vector2 { + /** + * Constructs a new 2D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + */ + constructor(x = 0, y = 0) { + _Vector2.prototype.isVector2 = true; + this.x = x; + this.y = y; + } + /** + * Alias for {@link Vector2#x}. + * + * @type {number} + */ + get width() { + return this.x; + } + set width(value) { + this.x = value; + } + /** + * Alias for {@link Vector2#y}. + * + * @type {number} + */ + get height() { + return this.y; + } + set height(value) { + this.y = value; + } + /** + * Sets the vector components. + * + * @param {number} x - The value of the x component. + * @param {number} y - The value of the y component. + * @return {Vector2} A reference to this vector. + */ + set(x, y) { + this.x = x; + this.y = y; + return this; + } + /** + * Sets the vector components to the same value. + * + * @param {number} scalar - The value to set for all vector components. + * @return {Vector2} A reference to this vector. + */ + setScalar(scalar) { + this.x = scalar; + this.y = scalar; + return this; + } + /** + * Sets the vector's x component to the given value + * + * @param {number} x - The value to set. + * @return {Vector2} A reference to this vector. + */ + setX(x) { + this.x = x; + return this; + } + /** + * Sets the vector's y component to the given value + * + * @param {number} y - The value to set. + * @return {Vector2} A reference to this vector. + */ + setY(y) { + this.y = y; + return this; + } + /** + * Allows to set a vector component with an index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y. + * @param {number} value - The value to set. + * @return {Vector2} A reference to this vector. + */ + setComponent(index, value) { + switch (index) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + default: + throw new Error("index is out of range: " + index); + } + return this; + } + /** + * Returns the value of the vector component which matches the given index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y. + * @return {number} A vector component value. + */ + getComponent(index) { + switch (index) { + case 0: + return this.x; + case 1: + return this.y; + default: + throw new Error("index is out of range: " + index); + } + } + /** + * Returns a new vector with copied values from this instance. + * + * @return {Vector2} A clone of this instance. + */ + clone() { + return new this.constructor(this.x, this.y); + } + /** + * Copies the values of the given vector to this instance. + * + * @param {Vector2} v - The vector to copy. + * @return {Vector2} A reference to this vector. + */ + copy(v) { + this.x = v.x; + this.y = v.y; + return this; + } + /** + * Adds the given vector to this instance. + * + * @param {Vector2} v - The vector to add. + * @return {Vector2} A reference to this vector. + */ + add(v) { + this.x += v.x; + this.y += v.y; + return this; + } + /** + * Adds the given scalar value to all components of this instance. + * + * @param {number} s - The scalar to add. + * @return {Vector2} A reference to this vector. + */ + addScalar(s) { + this.x += s; + this.y += s; + return this; + } + /** + * Adds the given vectors and stores the result in this instance. + * + * @param {Vector2} a - The first vector. + * @param {Vector2} b - The second vector. + * @return {Vector2} A reference to this vector. + */ + addVectors(a, b) { + this.x = a.x + b.x; + this.y = a.y + b.y; + return this; + } + /** + * Adds the given vector scaled by the given factor to this instance. + * + * @param {Vector2} v - The vector. + * @param {number} s - The factor that scales `v`. + * @return {Vector2} A reference to this vector. + */ + addScaledVector(v, s) { + this.x += v.x * s; + this.y += v.y * s; + return this; + } + /** + * Subtracts the given vector from this instance. + * + * @param {Vector2} v - The vector to subtract. + * @return {Vector2} A reference to this vector. + */ + sub(v) { + this.x -= v.x; + this.y -= v.y; + return this; + } + /** + * Subtracts the given scalar value from all components of this instance. + * + * @param {number} s - The scalar to subtract. + * @return {Vector2} A reference to this vector. + */ + subScalar(s) { + this.x -= s; + this.y -= s; + return this; + } + /** + * Subtracts the given vectors and stores the result in this instance. + * + * @param {Vector2} a - The first vector. + * @param {Vector2} b - The second vector. + * @return {Vector2} A reference to this vector. + */ + subVectors(a, b) { + this.x = a.x - b.x; + this.y = a.y - b.y; + return this; + } + /** + * Multiplies the given vector with this instance. + * + * @param {Vector2} v - The vector to multiply. + * @return {Vector2} A reference to this vector. + */ + multiply(v) { + this.x *= v.x; + this.y *= v.y; + return this; + } + /** + * Multiplies the given scalar value with all components of this instance. + * + * @param {number} scalar - The scalar to multiply. + * @return {Vector2} A reference to this vector. + */ + multiplyScalar(scalar) { + this.x *= scalar; + this.y *= scalar; + return this; + } + /** + * Divides this instance by the given vector. + * + * @param {Vector2} v - The vector to divide. + * @return {Vector2} A reference to this vector. + */ + divide(v) { + this.x /= v.x; + this.y /= v.y; + return this; + } + /** + * Divides this vector by the given scalar. + * + * @param {number} scalar - The scalar to divide. + * @return {Vector2} A reference to this vector. + */ + divideScalar(scalar) { + return this.multiplyScalar(1 / scalar); + } + /** + * Multiplies this vector (with an implicit 1 as the 3rd component) by + * the given 3x3 matrix. + * + * @param {Matrix3} m - The matrix to apply. + * @return {Vector2} A reference to this vector. + */ + applyMatrix3(m) { + const x = this.x, y = this.y; + const e = m.elements; + this.x = e[0] * x + e[3] * y + e[6]; + this.y = e[1] * x + e[4] * y + e[7]; + return this; + } + /** + * If this vector's x or y value is greater than the given vector's x or y + * value, replace that value with the corresponding min value. + * + * @param {Vector2} v - The vector. + * @return {Vector2} A reference to this vector. + */ + min(v) { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + return this; + } + /** + * If this vector's x or y value is less than the given vector's x or y + * value, replace that value with the corresponding max value. + * + * @param {Vector2} v - The vector. + * @return {Vector2} A reference to this vector. + */ + max(v) { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); + return this; + } + /** + * If this vector's x or y value is greater than the max vector's x or y + * value, it is replaced by the corresponding value. + * If this vector's x or y value is less than the min vector's x or y value, + * it is replaced by the corresponding value. + * + * @param {Vector2} min - The minimum x and y values. + * @param {Vector2} max - The maximum x and y values in the desired range. + * @return {Vector2} A reference to this vector. + */ + clamp(min, max) { + this.x = clamp(this.x, min.x, max.x); + this.y = clamp(this.y, min.y, max.y); + return this; + } + /** + * If this vector's x or y values are greater than the max value, they are + * replaced by the max value. + * If this vector's x or y values are less than the min value, they are + * replaced by the min value. + * + * @param {number} minVal - The minimum value the components will be clamped to. + * @param {number} maxVal - The maximum value the components will be clamped to. + * @return {Vector2} A reference to this vector. + */ + clampScalar(minVal, maxVal) { + this.x = clamp(this.x, minVal, maxVal); + this.y = clamp(this.y, minVal, maxVal); + return this; + } + /** + * If this vector's length is greater than the max value, it is replaced by + * the max value. + * If this vector's length is less than the min value, it is replaced by the + * min value. + * + * @param {number} min - The minimum value the vector length will be clamped to. + * @param {number} max - The maximum value the vector length will be clamped to. + * @return {Vector2} A reference to this vector. + */ + clampLength(min, max) { + const length = this.length(); + return this.divideScalar(length || 1).multiplyScalar(clamp(length, min, max)); + } + /** + * The components of this vector are rounded down to the nearest integer value. + * + * @return {Vector2} A reference to this vector. + */ + floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + return this; + } + /** + * The components of this vector are rounded up to the nearest integer value. + * + * @return {Vector2} A reference to this vector. + */ + ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + return this; + } + /** + * The components of this vector are rounded to the nearest integer value + * + * @return {Vector2} A reference to this vector. + */ + round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } + /** + * The components of this vector are rounded towards zero (up if negative, + * down if positive) to an integer value. + * + * @return {Vector2} A reference to this vector. + */ + roundToZero() { + this.x = Math.trunc(this.x); + this.y = Math.trunc(this.y); + return this; + } + /** + * Inverts this vector - i.e. sets x = -x and y = -y. + * + * @return {Vector2} A reference to this vector. + */ + negate() { + this.x = -this.x; + this.y = -this.y; + return this; + } + /** + * Calculates the dot product of the given vector with this instance. + * + * @param {Vector2} v - The vector to compute the dot product with. + * @return {number} The result of the dot product. + */ + dot(v) { + return this.x * v.x + this.y * v.y; + } + /** + * Calculates the cross product of the given vector with this instance. + * + * @param {Vector2} v - The vector to compute the cross product with. + * @return {number} The result of the cross product. + */ + cross(v) { + return this.x * v.y - this.y * v.x; + } + /** + * Computes the square of the Euclidean length (straight-line length) from + * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should + * compare the length squared instead as it is slightly more efficient to calculate. + * + * @return {number} The square length of this vector. + */ + lengthSq() { + return this.x * this.x + this.y * this.y; + } + /** + * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y). + * + * @return {number} The length of this vector. + */ + length() { + return Math.sqrt(this.x * this.x + this.y * this.y); + } + /** + * Computes the Manhattan length of this vector. + * + * @return {number} The length of this vector. + */ + manhattanLength() { + return Math.abs(this.x) + Math.abs(this.y); + } + /** + * Converts this vector to a unit vector - that is, sets it equal to a vector + * with the same direction as this one, but with a vector length of `1`. + * + * @return {Vector2} A reference to this vector. + */ + normalize() { + return this.divideScalar(this.length() || 1); + } + /** + * Computes the angle in radians of this vector with respect to the positive x-axis. + * + * @return {number} The angle in radians. + */ + angle() { + const angle = Math.atan2(-this.y, -this.x) + Math.PI; + return angle; + } + /** + * Returns the angle between the given vector and this instance in radians. + * + * @param {Vector2} v - The vector to compute the angle with. + * @return {number} The angle in radians. + */ + angleTo(v) { + const denominator = Math.sqrt(this.lengthSq() * v.lengthSq()); + if (denominator === 0) return Math.PI / 2; + const theta = this.dot(v) / denominator; + return Math.acos(clamp(theta, -1, 1)); + } + /** + * Computes the distance from the given vector to this instance. + * + * @param {Vector2} v - The vector to compute the distance to. + * @return {number} The distance. + */ + distanceTo(v) { + return Math.sqrt(this.distanceToSquared(v)); + } + /** + * Computes the squared distance from the given vector to this instance. + * If you are just comparing the distance with another distance, you should compare + * the distance squared instead as it is slightly more efficient to calculate. + * + * @param {Vector2} v - The vector to compute the squared distance to. + * @return {number} The squared distance. + */ + distanceToSquared(v) { + const dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + } + /** + * Computes the Manhattan distance from the given vector to this instance. + * + * @param {Vector2} v - The vector to compute the Manhattan distance to. + * @return {number} The Manhattan distance. + */ + manhattanDistanceTo(v) { + return Math.abs(this.x - v.x) + Math.abs(this.y - v.y); + } + /** + * Sets this vector to a vector with the same direction as this one, but + * with the specified length. + * + * @param {number} length - The new length of this vector. + * @return {Vector2} A reference to this vector. + */ + setLength(length) { + return this.normalize().multiplyScalar(length); + } + /** + * Linearly interpolates between the given vector and this instance, where + * alpha is the percent distance along the line - alpha = 0 will be this + * vector, and alpha = 1 will be the given one. + * + * @param {Vector2} v - The vector to interpolate towards. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector2} A reference to this vector. + */ + lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; + return this; + } + /** + * Linearly interpolates between the given vectors, where alpha is the percent + * distance along the line - alpha = 0 will be first vector, and alpha = 1 will + * be the second one. The result is stored in this instance. + * + * @param {Vector2} v1 - The first vector. + * @param {Vector2} v2 - The second vector. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector2} A reference to this vector. + */ + lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + return this; + } + /** + * Returns `true` if this vector is equal with the given one. + * + * @param {Vector2} v - The vector to test for equality. + * @return {boolean} Whether this vector is equal with the given one. + */ + equals(v) { + return v.x === this.x && v.y === this.y; + } + /** + * Sets this vector's x value to be `array[ offset ]` and y + * value to be `array[ offset + 1 ]`. + * + * @param {Array} array - An array holding the vector component values. + * @param {number} [offset=0] - The offset into the array. + * @return {Vector2} A reference to this vector. + */ + fromArray(array, offset = 0) { + this.x = array[offset]; + this.y = array[offset + 1]; + return this; + } + /** + * Writes the components of this vector to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the vector components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The vector components. + */ + toArray(array = [], offset = 0) { + array[offset] = this.x; + array[offset + 1] = this.y; + return array; + } + /** + * Sets the components of this vector from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding vector data. + * @param {number} index - The index into the attribute. + * @return {Vector2} A reference to this vector. + */ + fromBufferAttribute(attribute, index) { + this.x = attribute.getX(index); + this.y = attribute.getY(index); + return this; + } + /** + * Rotates this vector around the given center by the given angle. + * + * @param {Vector2} center - The point around which to rotate. + * @param {number} angle - The angle to rotate, in radians. + * @return {Vector2} A reference to this vector. + */ + rotateAround(center, angle) { + const c = Math.cos(angle), s = Math.sin(angle); + const x = this.x - center.x; + const y = this.y - center.y; + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + return this; + } + /** + * Sets each component of this vector to a pseudo-random value between `0` and + * `1`, excluding `1`. + * + * @return {Vector2} A reference to this vector. + */ + random() { + this.x = Math.random(); + this.y = Math.random(); + return this; + } + *[Symbol.iterator]() { + yield this.x; + yield this.y; + } +}; +var Quaternion = class { + /** + * Constructs a new quaternion. + * + * @param {number} [x=0] - The x value of this quaternion. + * @param {number} [y=0] - The y value of this quaternion. + * @param {number} [z=0] - The z value of this quaternion. + * @param {number} [w=1] - The w value of this quaternion. + */ + constructor(x = 0, y = 0, z = 0, w = 1) { + this.isQuaternion = true; + this._x = x; + this._y = y; + this._z = z; + this._w = w; + } + /** + * Interpolates between two quaternions via SLERP. This implementation assumes the + * quaternion data are managed in flat arrays. + * + * @param {Array} dst - The destination array. + * @param {number} dstOffset - An offset into the destination array. + * @param {Array} src0 - The source array of the first quaternion. + * @param {number} srcOffset0 - An offset into the first source array. + * @param {Array} src1 - The source array of the second quaternion. + * @param {number} srcOffset1 - An offset into the second source array. + * @param {number} t - The interpolation factor in the range `[0,1]`. + * @see {@link Quaternion#slerp} + */ + static slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) { + let x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3]; + let x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3]; + if (t <= 0) { + dst[dstOffset + 0] = x0; + dst[dstOffset + 1] = y0; + dst[dstOffset + 2] = z0; + dst[dstOffset + 3] = w0; + return; + } + if (t >= 1) { + dst[dstOffset + 0] = x1; + dst[dstOffset + 1] = y1; + dst[dstOffset + 2] = z1; + dst[dstOffset + 3] = w1; + return; + } + if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) { + let dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1; + if (dot < 0) { + x1 = -x1; + y1 = -y1; + z1 = -z1; + w1 = -w1; + dot = -dot; + } + let s = 1 - t; + if (dot < 0.9995) { + const theta = Math.acos(dot); + const sin = Math.sin(theta); + s = Math.sin(s * theta) / sin; + t = Math.sin(t * theta) / sin; + x0 = x0 * s + x1 * t; + y0 = y0 * s + y1 * t; + z0 = z0 * s + z1 * t; + w0 = w0 * s + w1 * t; + } else { + x0 = x0 * s + x1 * t; + y0 = y0 * s + y1 * t; + z0 = z0 * s + z1 * t; + w0 = w0 * s + w1 * t; + const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0); + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + } + } + dst[dstOffset] = x0; + dst[dstOffset + 1] = y0; + dst[dstOffset + 2] = z0; + dst[dstOffset + 3] = w0; + } + /** + * Multiplies two quaternions. This implementation assumes the quaternion data are managed + * in flat arrays. + * + * @param {Array} dst - The destination array. + * @param {number} dstOffset - An offset into the destination array. + * @param {Array} src0 - The source array of the first quaternion. + * @param {number} srcOffset0 - An offset into the first source array. + * @param {Array} src1 - The source array of the second quaternion. + * @param {number} srcOffset1 - An offset into the second source array. + * @return {Array} The destination array. + * @see {@link Quaternion#multiplyQuaternions}. + */ + static multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) { + const x0 = src0[srcOffset0]; + const y0 = src0[srcOffset0 + 1]; + const z0 = src0[srcOffset0 + 2]; + const w0 = src0[srcOffset0 + 3]; + const x1 = src1[srcOffset1]; + const y1 = src1[srcOffset1 + 1]; + const z1 = src1[srcOffset1 + 2]; + const w1 = src1[srcOffset1 + 3]; + dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1; + dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1; + dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1; + dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1; + return dst; + } + /** + * The x value of this quaternion. + * + * @type {number} + * @default 0 + */ + get x() { + return this._x; + } + set x(value) { + this._x = value; + this._onChangeCallback(); + } + /** + * The y value of this quaternion. + * + * @type {number} + * @default 0 + */ + get y() { + return this._y; + } + set y(value) { + this._y = value; + this._onChangeCallback(); + } + /** + * The z value of this quaternion. + * + * @type {number} + * @default 0 + */ + get z() { + return this._z; + } + set z(value) { + this._z = value; + this._onChangeCallback(); + } + /** + * The w value of this quaternion. + * + * @type {number} + * @default 1 + */ + get w() { + return this._w; + } + set w(value) { + this._w = value; + this._onChangeCallback(); + } + /** + * Sets the quaternion components. + * + * @param {number} x - The x value of this quaternion. + * @param {number} y - The y value of this quaternion. + * @param {number} z - The z value of this quaternion. + * @param {number} w - The w value of this quaternion. + * @return {Quaternion} A reference to this quaternion. + */ + set(x, y, z, w) { + this._x = x; + this._y = y; + this._z = z; + this._w = w; + this._onChangeCallback(); + return this; + } + /** + * Returns a new quaternion with copied values from this instance. + * + * @return {Quaternion} A clone of this instance. + */ + clone() { + return new this.constructor(this._x, this._y, this._z, this._w); + } + /** + * Copies the values of the given quaternion to this instance. + * + * @param {Quaternion} quaternion - The quaternion to copy. + * @return {Quaternion} A reference to this quaternion. + */ + copy(quaternion) { + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + this._onChangeCallback(); + return this; + } + /** + * Sets this quaternion from the rotation specified by the given + * Euler angles. + * + * @param {Euler} euler - The Euler angles. + * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. + * @return {Quaternion} A reference to this quaternion. + */ + setFromEuler(euler, update = true) { + const x = euler._x, y = euler._y, z = euler._z, order = euler._order; + const cos = Math.cos; + const sin = Math.sin; + const c1 = cos(x / 2); + const c2 = cos(y / 2); + const c3 = cos(z / 2); + const s1 = sin(x / 2); + const s2 = sin(y / 2); + const s3 = sin(z / 2); + switch (order) { + case "XYZ": + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + case "YXZ": + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + case "ZXY": + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + case "ZYX": + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + case "YZX": + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + break; + case "XZY": + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + break; + default: + warn("Quaternion: .setFromEuler() encountered an unknown order: " + order); + } + if (update === true) this._onChangeCallback(); + return this; + } + /** + * Sets this quaternion from the given axis and angle. + * + * @param {Vector3} axis - The normalized axis. + * @param {number} angle - The angle in radians. + * @return {Quaternion} A reference to this quaternion. + */ + setFromAxisAngle(axis, angle) { + const halfAngle = angle / 2, s = Math.sin(halfAngle); + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos(halfAngle); + this._onChangeCallback(); + return this; + } + /** + * Sets this quaternion from the given rotation matrix. + * + * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled). + * @return {Quaternion} A reference to this quaternion. + */ + setFromRotationMatrix(m) { + const te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10], trace = m11 + m22 + m33; + if (trace > 0) { + const s = 0.5 / Math.sqrt(trace + 1); + this._w = 0.25 / s; + this._x = (m32 - m23) * s; + this._y = (m13 - m31) * s; + this._z = (m21 - m12) * s; + } else if (m11 > m22 && m11 > m33) { + const s = 2 * Math.sqrt(1 + m11 - m22 - m33); + this._w = (m32 - m23) / s; + this._x = 0.25 * s; + this._y = (m12 + m21) / s; + this._z = (m13 + m31) / s; + } else if (m22 > m33) { + const s = 2 * Math.sqrt(1 + m22 - m11 - m33); + this._w = (m13 - m31) / s; + this._x = (m12 + m21) / s; + this._y = 0.25 * s; + this._z = (m23 + m32) / s; + } else { + const s = 2 * Math.sqrt(1 + m33 - m11 - m22); + this._w = (m21 - m12) / s; + this._x = (m13 + m31) / s; + this._y = (m23 + m32) / s; + this._z = 0.25 * s; + } + this._onChangeCallback(); + return this; + } + /** + * Sets this quaternion to the rotation required to rotate the direction vector + * `vFrom` to the direction vector `vTo`. + * + * @param {Vector3} vFrom - The first (normalized) direction vector. + * @param {Vector3} vTo - The second (normalized) direction vector. + * @return {Quaternion} A reference to this quaternion. + */ + setFromUnitVectors(vFrom, vTo) { + let r = vFrom.dot(vTo) + 1; + if (r < 1e-8) { + r = 0; + if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) { + this._x = -vFrom.y; + this._y = vFrom.x; + this._z = 0; + this._w = r; + } else { + this._x = 0; + this._y = -vFrom.z; + this._z = vFrom.y; + this._w = r; + } + } else { + this._x = vFrom.y * vTo.z - vFrom.z * vTo.y; + this._y = vFrom.z * vTo.x - vFrom.x * vTo.z; + this._z = vFrom.x * vTo.y - vFrom.y * vTo.x; + this._w = r; + } + return this.normalize(); + } + /** + * Returns the angle between this quaternion and the given one in radians. + * + * @param {Quaternion} q - The quaternion to compute the angle with. + * @return {number} The angle in radians. + */ + angleTo(q) { + return 2 * Math.acos(Math.abs(clamp(this.dot(q), -1, 1))); + } + /** + * Rotates this quaternion by a given angular step to the given quaternion. + * The method ensures that the final quaternion will not overshoot `q`. + * + * @param {Quaternion} q - The target quaternion. + * @param {number} step - The angular step in radians. + * @return {Quaternion} A reference to this quaternion. + */ + rotateTowards(q, step) { + const angle = this.angleTo(q); + if (angle === 0) return this; + const t = Math.min(1, step / angle); + this.slerp(q, t); + return this; + } + /** + * Sets this quaternion to the identity quaternion; that is, to the + * quaternion that represents "no rotation". + * + * @return {Quaternion} A reference to this quaternion. + */ + identity() { + return this.set(0, 0, 0, 1); + } + /** + * Inverts this quaternion via {@link Quaternion#conjugate}. The + * quaternion is assumed to have unit length. + * + * @return {Quaternion} A reference to this quaternion. + */ + invert() { + return this.conjugate(); + } + /** + * Returns the rotational conjugate of this quaternion. The conjugate of a + * quaternion represents the same rotation in the opposite direction about + * the rotational axis. + * + * @return {Quaternion} A reference to this quaternion. + */ + conjugate() { + this._x *= -1; + this._y *= -1; + this._z *= -1; + this._onChangeCallback(); + return this; + } + /** + * Calculates the dot product of this quaternion and the given one. + * + * @param {Quaternion} v - The quaternion to compute the dot product with. + * @return {number} The result of the dot product. + */ + dot(v) { + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + } + /** + * Computes the squared Euclidean length (straight-line length) of this quaternion, + * considered as a 4 dimensional vector. This can be useful if you are comparing the + * lengths of two quaternions, as this is a slightly more efficient calculation than + * {@link Quaternion#length}. + * + * @return {number} The squared Euclidean length. + */ + lengthSq() { + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + } + /** + * Computes the Euclidean length (straight-line length) of this quaternion, + * considered as a 4 dimensional vector. + * + * @return {number} The Euclidean length. + */ + length() { + return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w); + } + /** + * Normalizes this quaternion - that is, calculated the quaternion that performs + * the same rotation as this one, but has a length equal to `1`. + * + * @return {Quaternion} A reference to this quaternion. + */ + normalize() { + let l = this.length(); + if (l === 0) { + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + } else { + l = 1 / l; + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + } + this._onChangeCallback(); + return this; + } + /** + * Multiplies this quaternion by the given one. + * + * @param {Quaternion} q - The quaternion. + * @return {Quaternion} A reference to this quaternion. + */ + multiply(q) { + return this.multiplyQuaternions(this, q); + } + /** + * Pre-multiplies this quaternion by the given one. + * + * @param {Quaternion} q - The quaternion. + * @return {Quaternion} A reference to this quaternion. + */ + premultiply(q) { + return this.multiplyQuaternions(q, this); + } + /** + * Multiplies the given quaternions and stores the result in this instance. + * + * @param {Quaternion} a - The first quaternion. + * @param {Quaternion} b - The second quaternion. + * @return {Quaternion} A reference to this quaternion. + */ + multiplyQuaternions(a, b) { + const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + this._onChangeCallback(); + return this; + } + /** + * Performs a spherical linear interpolation between quaternions. + * + * @param {Quaternion} qb - The target quaternion. + * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. + * @return {Quaternion} A reference to this quaternion. + */ + slerp(qb, t) { + if (t <= 0) return this; + if (t >= 1) return this.copy(qb); + let x = qb._x, y = qb._y, z = qb._z, w = qb._w; + let dot = this.dot(qb); + if (dot < 0) { + x = -x; + y = -y; + z = -z; + w = -w; + dot = -dot; + } + let s = 1 - t; + if (dot < 0.9995) { + const theta = Math.acos(dot); + const sin = Math.sin(theta); + s = Math.sin(s * theta) / sin; + t = Math.sin(t * theta) / sin; + this._x = this._x * s + x * t; + this._y = this._y * s + y * t; + this._z = this._z * s + z * t; + this._w = this._w * s + w * t; + this._onChangeCallback(); + } else { + this._x = this._x * s + x * t; + this._y = this._y * s + y * t; + this._z = this._z * s + z * t; + this._w = this._w * s + w * t; + this.normalize(); + } + return this; + } + /** + * Performs a spherical linear interpolation between the given quaternions + * and stores the result in this quaternion. + * + * @param {Quaternion} qa - The source quaternion. + * @param {Quaternion} qb - The target quaternion. + * @param {number} t - The interpolation factor in the closed interval `[0, 1]`. + * @return {Quaternion} A reference to this quaternion. + */ + slerpQuaternions(qa, qb, t) { + return this.copy(qa).slerp(qb, t); + } + /** + * Sets this quaternion to a uniformly random, normalized quaternion. + * + * @return {Quaternion} A reference to this quaternion. + */ + random() { + const theta1 = 2 * Math.PI * Math.random(); + const theta2 = 2 * Math.PI * Math.random(); + const x0 = Math.random(); + const r1 = Math.sqrt(1 - x0); + const r2 = Math.sqrt(x0); + return this.set( + r1 * Math.sin(theta1), + r1 * Math.cos(theta1), + r2 * Math.sin(theta2), + r2 * Math.cos(theta2) + ); + } + /** + * Returns `true` if this quaternion is equal with the given one. + * + * @param {Quaternion} quaternion - The quaternion to test for equality. + * @return {boolean} Whether this quaternion is equal with the given one. + */ + equals(quaternion) { + return quaternion._x === this._x && quaternion._y === this._y && quaternion._z === this._z && quaternion._w === this._w; + } + /** + * Sets this quaternion's components from the given array. + * + * @param {Array} array - An array holding the quaternion component values. + * @param {number} [offset=0] - The offset into the array. + * @return {Quaternion} A reference to this quaternion. + */ + fromArray(array, offset = 0) { + this._x = array[offset]; + this._y = array[offset + 1]; + this._z = array[offset + 2]; + this._w = array[offset + 3]; + this._onChangeCallback(); + return this; + } + /** + * Writes the components of this quaternion to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the quaternion components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The quaternion components. + */ + toArray(array = [], offset = 0) { + array[offset] = this._x; + array[offset + 1] = this._y; + array[offset + 2] = this._z; + array[offset + 3] = this._w; + return array; + } + /** + * Sets the components of this quaternion from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data. + * @param {number} index - The index into the attribute. + * @return {Quaternion} A reference to this quaternion. + */ + fromBufferAttribute(attribute, index) { + this._x = attribute.getX(index); + this._y = attribute.getY(index); + this._z = attribute.getZ(index); + this._w = attribute.getW(index); + this._onChangeCallback(); + return this; + } + /** + * This methods defines the serialization result of this class. Returns the + * numerical elements of this quaternion in an array of format `[x, y, z, w]`. + * + * @return {Array} The serialized quaternion. + */ + toJSON() { + return this.toArray(); + } + _onChange(callback) { + this._onChangeCallback = callback; + return this; + } + _onChangeCallback() { + } + *[Symbol.iterator]() { + yield this._x; + yield this._y; + yield this._z; + yield this._w; + } +}; +var Vector3 = class _Vector3 { + /** + * Constructs a new 3D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + * @param {number} [z=0] - The z value of this vector. + */ + constructor(x = 0, y = 0, z = 0) { + _Vector3.prototype.isVector3 = true; + this.x = x; + this.y = y; + this.z = z; + } + /** + * Sets the vector components. + * + * @param {number} x - The value of the x component. + * @param {number} y - The value of the y component. + * @param {number} z - The value of the z component. + * @return {Vector3} A reference to this vector. + */ + set(x, y, z) { + if (z === void 0) z = this.z; + this.x = x; + this.y = y; + this.z = z; + return this; + } + /** + * Sets the vector components to the same value. + * + * @param {number} scalar - The value to set for all vector components. + * @return {Vector3} A reference to this vector. + */ + setScalar(scalar) { + this.x = scalar; + this.y = scalar; + this.z = scalar; + return this; + } + /** + * Sets the vector's x component to the given value + * + * @param {number} x - The value to set. + * @return {Vector3} A reference to this vector. + */ + setX(x) { + this.x = x; + return this; + } + /** + * Sets the vector's y component to the given value + * + * @param {number} y - The value to set. + * @return {Vector3} A reference to this vector. + */ + setY(y) { + this.y = y; + return this; + } + /** + * Sets the vector's z component to the given value + * + * @param {number} z - The value to set. + * @return {Vector3} A reference to this vector. + */ + setZ(z) { + this.z = z; + return this; + } + /** + * Allows to set a vector component with an index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z. + * @param {number} value - The value to set. + * @return {Vector3} A reference to this vector. + */ + setComponent(index, value) { + switch (index) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + case 2: + this.z = value; + break; + default: + throw new Error("index is out of range: " + index); + } + return this; + } + /** + * Returns the value of the vector component which matches the given index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z. + * @return {number} A vector component value. + */ + getComponent(index) { + switch (index) { + case 0: + return this.x; + case 1: + return this.y; + case 2: + return this.z; + default: + throw new Error("index is out of range: " + index); + } + } + /** + * Returns a new vector with copied values from this instance. + * + * @return {Vector3} A clone of this instance. + */ + clone() { + return new this.constructor(this.x, this.y, this.z); + } + /** + * Copies the values of the given vector to this instance. + * + * @param {Vector3} v - The vector to copy. + * @return {Vector3} A reference to this vector. + */ + copy(v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + return this; + } + /** + * Adds the given vector to this instance. + * + * @param {Vector3} v - The vector to add. + * @return {Vector3} A reference to this vector. + */ + add(v) { + this.x += v.x; + this.y += v.y; + this.z += v.z; + return this; + } + /** + * Adds the given scalar value to all components of this instance. + * + * @param {number} s - The scalar to add. + * @return {Vector3} A reference to this vector. + */ + addScalar(s) { + this.x += s; + this.y += s; + this.z += s; + return this; + } + /** + * Adds the given vectors and stores the result in this instance. + * + * @param {Vector3} a - The first vector. + * @param {Vector3} b - The second vector. + * @return {Vector3} A reference to this vector. + */ + addVectors(a, b) { + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + return this; + } + /** + * Adds the given vector scaled by the given factor to this instance. + * + * @param {Vector3|Vector4} v - The vector. + * @param {number} s - The factor that scales `v`. + * @return {Vector3} A reference to this vector. + */ + addScaledVector(v, s) { + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + return this; + } + /** + * Subtracts the given vector from this instance. + * + * @param {Vector3} v - The vector to subtract. + * @return {Vector3} A reference to this vector. + */ + sub(v) { + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + return this; + } + /** + * Subtracts the given scalar value from all components of this instance. + * + * @param {number} s - The scalar to subtract. + * @return {Vector3} A reference to this vector. + */ + subScalar(s) { + this.x -= s; + this.y -= s; + this.z -= s; + return this; + } + /** + * Subtracts the given vectors and stores the result in this instance. + * + * @param {Vector3} a - The first vector. + * @param {Vector3} b - The second vector. + * @return {Vector3} A reference to this vector. + */ + subVectors(a, b) { + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + return this; + } + /** + * Multiplies the given vector with this instance. + * + * @param {Vector3} v - The vector to multiply. + * @return {Vector3} A reference to this vector. + */ + multiply(v) { + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + return this; + } + /** + * Multiplies the given scalar value with all components of this instance. + * + * @param {number} scalar - The scalar to multiply. + * @return {Vector3} A reference to this vector. + */ + multiplyScalar(scalar) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + return this; + } + /** + * Multiplies the given vectors and stores the result in this instance. + * + * @param {Vector3} a - The first vector. + * @param {Vector3} b - The second vector. + * @return {Vector3} A reference to this vector. + */ + multiplyVectors(a, b) { + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + return this; + } + /** + * Applies the given Euler rotation to this vector. + * + * @param {Euler} euler - The Euler angles. + * @return {Vector3} A reference to this vector. + */ + applyEuler(euler) { + return this.applyQuaternion(_quaternion$4.setFromEuler(euler)); + } + /** + * Applies a rotation specified by an axis and an angle to this vector. + * + * @param {Vector3} axis - A normalized vector representing the rotation axis. + * @param {number} angle - The angle in radians. + * @return {Vector3} A reference to this vector. + */ + applyAxisAngle(axis, angle) { + return this.applyQuaternion(_quaternion$4.setFromAxisAngle(axis, angle)); + } + /** + * Multiplies this vector with the given 3x3 matrix. + * + * @param {Matrix3} m - The 3x3 matrix. + * @return {Vector3} A reference to this vector. + */ + applyMatrix3(m) { + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + this.x = e[0] * x + e[3] * y + e[6] * z; + this.y = e[1] * x + e[4] * y + e[7] * z; + this.z = e[2] * x + e[5] * y + e[8] * z; + return this; + } + /** + * Multiplies this vector by the given normal matrix and normalizes + * the result. + * + * @param {Matrix3} m - The normal matrix. + * @return {Vector3} A reference to this vector. + */ + applyNormalMatrix(m) { + return this.applyMatrix3(m).normalize(); + } + /** + * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and + * divides by perspective. + * + * @param {Matrix4} m - The matrix to apply. + * @return {Vector3} A reference to this vector. + */ + applyMatrix4(m) { + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]); + this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w; + this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w; + this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w; + return this; + } + /** + * Applies the given Quaternion to this vector. + * + * @param {Quaternion} q - The Quaternion. + * @return {Vector3} A reference to this vector. + */ + applyQuaternion(q) { + const vx = this.x, vy = this.y, vz = this.z; + const qx = q.x, qy = q.y, qz = q.z, qw = q.w; + const tx = 2 * (qy * vz - qz * vy); + const ty = 2 * (qz * vx - qx * vz); + const tz = 2 * (qx * vy - qy * vx); + this.x = vx + qw * tx + qy * tz - qz * ty; + this.y = vy + qw * ty + qz * tx - qx * tz; + this.z = vz + qw * tz + qx * ty - qy * tx; + return this; + } + /** + * Projects this vector from world space into the camera's normalized + * device coordinate (NDC) space. + * + * @param {Camera} camera - The camera. + * @return {Vector3} A reference to this vector. + */ + project(camera) { + return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix); + } + /** + * Unprojects this vector from the camera's normalized device coordinate (NDC) + * space into world space. + * + * @param {Camera} camera - The camera. + * @return {Vector3} A reference to this vector. + */ + unproject(camera) { + return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.matrixWorld); + } + /** + * Transforms the direction of this vector by a matrix (the upper left 3 x 3 + * subset of the given 4x4 matrix and then normalizes the result. + * + * @param {Matrix4} m - The matrix. + * @return {Vector3} A reference to this vector. + */ + transformDirection(m) { + const x = this.x, y = this.y, z = this.z; + const e = m.elements; + this.x = e[0] * x + e[4] * y + e[8] * z; + this.y = e[1] * x + e[5] * y + e[9] * z; + this.z = e[2] * x + e[6] * y + e[10] * z; + return this.normalize(); + } + /** + * Divides this instance by the given vector. + * + * @param {Vector3} v - The vector to divide. + * @return {Vector3} A reference to this vector. + */ + divide(v) { + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + return this; + } + /** + * Divides this vector by the given scalar. + * + * @param {number} scalar - The scalar to divide. + * @return {Vector3} A reference to this vector. + */ + divideScalar(scalar) { + return this.multiplyScalar(1 / scalar); + } + /** + * If this vector's x, y or z value is greater than the given vector's x, y or z + * value, replace that value with the corresponding min value. + * + * @param {Vector3} v - The vector. + * @return {Vector3} A reference to this vector. + */ + min(v) { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + this.z = Math.min(this.z, v.z); + return this; + } + /** + * If this vector's x, y or z value is less than the given vector's x, y or z + * value, replace that value with the corresponding max value. + * + * @param {Vector3} v - The vector. + * @return {Vector3} A reference to this vector. + */ + max(v) { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); + this.z = Math.max(this.z, v.z); + return this; + } + /** + * If this vector's x, y or z value is greater than the max vector's x, y or z + * value, it is replaced by the corresponding value. + * If this vector's x, y or z value is less than the min vector's x, y or z value, + * it is replaced by the corresponding value. + * + * @param {Vector3} min - The minimum x, y and z values. + * @param {Vector3} max - The maximum x, y and z values in the desired range. + * @return {Vector3} A reference to this vector. + */ + clamp(min, max) { + this.x = clamp(this.x, min.x, max.x); + this.y = clamp(this.y, min.y, max.y); + this.z = clamp(this.z, min.z, max.z); + return this; + } + /** + * If this vector's x, y or z values are greater than the max value, they are + * replaced by the max value. + * If this vector's x, y or z values are less than the min value, they are + * replaced by the min value. + * + * @param {number} minVal - The minimum value the components will be clamped to. + * @param {number} maxVal - The maximum value the components will be clamped to. + * @return {Vector3} A reference to this vector. + */ + clampScalar(minVal, maxVal) { + this.x = clamp(this.x, minVal, maxVal); + this.y = clamp(this.y, minVal, maxVal); + this.z = clamp(this.z, minVal, maxVal); + return this; + } + /** + * If this vector's length is greater than the max value, it is replaced by + * the max value. + * If this vector's length is less than the min value, it is replaced by the + * min value. + * + * @param {number} min - The minimum value the vector length will be clamped to. + * @param {number} max - The maximum value the vector length will be clamped to. + * @return {Vector3} A reference to this vector. + */ + clampLength(min, max) { + const length = this.length(); + return this.divideScalar(length || 1).multiplyScalar(clamp(length, min, max)); + } + /** + * The components of this vector are rounded down to the nearest integer value. + * + * @return {Vector3} A reference to this vector. + */ + floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + this.z = Math.floor(this.z); + return this; + } + /** + * The components of this vector are rounded up to the nearest integer value. + * + * @return {Vector3} A reference to this vector. + */ + ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + this.z = Math.ceil(this.z); + return this; + } + /** + * The components of this vector are rounded to the nearest integer value + * + * @return {Vector3} A reference to this vector. + */ + round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + this.z = Math.round(this.z); + return this; + } + /** + * The components of this vector are rounded towards zero (up if negative, + * down if positive) to an integer value. + * + * @return {Vector3} A reference to this vector. + */ + roundToZero() { + this.x = Math.trunc(this.x); + this.y = Math.trunc(this.y); + this.z = Math.trunc(this.z); + return this; + } + /** + * Inverts this vector - i.e. sets x = -x, y = -y and z = -z. + * + * @return {Vector3} A reference to this vector. + */ + negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + } + /** + * Calculates the dot product of the given vector with this instance. + * + * @param {Vector3} v - The vector to compute the dot product with. + * @return {number} The result of the dot product. + */ + dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z; + } + /** + * Computes the square of the Euclidean length (straight-line length) from + * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should + * compare the length squared instead as it is slightly more efficient to calculate. + * + * @return {number} The square length of this vector. + */ + lengthSq() { + return this.x * this.x + this.y * this.y + this.z * this.z; + } + /** + * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z). + * + * @return {number} The length of this vector. + */ + length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + } + /** + * Computes the Manhattan length of this vector. + * + * @return {number} The length of this vector. + */ + manhattanLength() { + return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z); + } + /** + * Converts this vector to a unit vector - that is, sets it equal to a vector + * with the same direction as this one, but with a vector length of `1`. + * + * @return {Vector3} A reference to this vector. + */ + normalize() { + return this.divideScalar(this.length() || 1); + } + /** + * Sets this vector to a vector with the same direction as this one, but + * with the specified length. + * + * @param {number} length - The new length of this vector. + * @return {Vector3} A reference to this vector. + */ + setLength(length) { + return this.normalize().multiplyScalar(length); + } + /** + * Linearly interpolates between the given vector and this instance, where + * alpha is the percent distance along the line - alpha = 0 will be this + * vector, and alpha = 1 will be the given one. + * + * @param {Vector3} v - The vector to interpolate towards. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector3} A reference to this vector. + */ + lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; + this.z += (v.z - this.z) * alpha; + return this; + } + /** + * Linearly interpolates between the given vectors, where alpha is the percent + * distance along the line - alpha = 0 will be first vector, and alpha = 1 will + * be the second one. The result is stored in this instance. + * + * @param {Vector3} v1 - The first vector. + * @param {Vector3} v2 - The second vector. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector3} A reference to this vector. + */ + lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + this.z = v1.z + (v2.z - v1.z) * alpha; + return this; + } + /** + * Calculates the cross product of the given vector with this instance. + * + * @param {Vector3} v - The vector to compute the cross product with. + * @return {Vector3} The result of the cross product. + */ + cross(v) { + return this.crossVectors(this, v); + } + /** + * Calculates the cross product of the given vectors and stores the result + * in this instance. + * + * @param {Vector3} a - The first vector. + * @param {Vector3} b - The second vector. + * @return {Vector3} A reference to this vector. + */ + crossVectors(a, b) { + const ax = a.x, ay = a.y, az = a.z; + const bx = b.x, by = b.y, bz = b.z; + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + return this; + } + /** + * Projects this vector onto the given one. + * + * @param {Vector3} v - The vector to project to. + * @return {Vector3} A reference to this vector. + */ + projectOnVector(v) { + const denominator = v.lengthSq(); + if (denominator === 0) return this.set(0, 0, 0); + const scalar = v.dot(this) / denominator; + return this.copy(v).multiplyScalar(scalar); + } + /** + * Projects this vector onto a plane by subtracting this + * vector projected onto the plane's normal from this vector. + * + * @param {Vector3} planeNormal - The plane normal. + * @return {Vector3} A reference to this vector. + */ + projectOnPlane(planeNormal) { + _vector$c.copy(this).projectOnVector(planeNormal); + return this.sub(_vector$c); + } + /** + * Reflects this vector off a plane orthogonal to the given normal vector. + * + * @param {Vector3} normal - The (normalized) normal vector. + * @return {Vector3} A reference to this vector. + */ + reflect(normal) { + return this.sub(_vector$c.copy(normal).multiplyScalar(2 * this.dot(normal))); + } + /** + * Returns the angle between the given vector and this instance in radians. + * + * @param {Vector3} v - The vector to compute the angle with. + * @return {number} The angle in radians. + */ + angleTo(v) { + const denominator = Math.sqrt(this.lengthSq() * v.lengthSq()); + if (denominator === 0) return Math.PI / 2; + const theta = this.dot(v) / denominator; + return Math.acos(clamp(theta, -1, 1)); + } + /** + * Computes the distance from the given vector to this instance. + * + * @param {Vector3} v - The vector to compute the distance to. + * @return {number} The distance. + */ + distanceTo(v) { + return Math.sqrt(this.distanceToSquared(v)); + } + /** + * Computes the squared distance from the given vector to this instance. + * If you are just comparing the distance with another distance, you should compare + * the distance squared instead as it is slightly more efficient to calculate. + * + * @param {Vector3} v - The vector to compute the squared distance to. + * @return {number} The squared distance. + */ + distanceToSquared(v) { + const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + return dx * dx + dy * dy + dz * dz; + } + /** + * Computes the Manhattan distance from the given vector to this instance. + * + * @param {Vector3} v - The vector to compute the Manhattan distance to. + * @return {number} The Manhattan distance. + */ + manhattanDistanceTo(v) { + return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z); + } + /** + * Sets the vector components from the given spherical coordinates. + * + * @param {Spherical} s - The spherical coordinates. + * @return {Vector3} A reference to this vector. + */ + setFromSpherical(s) { + return this.setFromSphericalCoords(s.radius, s.phi, s.theta); + } + /** + * Sets the vector components from the given spherical coordinates. + * + * @param {number} radius - The radius. + * @param {number} phi - The phi angle in radians. + * @param {number} theta - The theta angle in radians. + * @return {Vector3} A reference to this vector. + */ + setFromSphericalCoords(radius, phi, theta) { + const sinPhiRadius = Math.sin(phi) * radius; + this.x = sinPhiRadius * Math.sin(theta); + this.y = Math.cos(phi) * radius; + this.z = sinPhiRadius * Math.cos(theta); + return this; + } + /** + * Sets the vector components from the given cylindrical coordinates. + * + * @param {Cylindrical} c - The cylindrical coordinates. + * @return {Vector3} A reference to this vector. + */ + setFromCylindrical(c) { + return this.setFromCylindricalCoords(c.radius, c.theta, c.y); + } + /** + * Sets the vector components from the given cylindrical coordinates. + * + * @param {number} radius - The radius. + * @param {number} theta - The theta angle in radians. + * @param {number} y - The y value. + * @return {Vector3} A reference to this vector. + */ + setFromCylindricalCoords(radius, theta, y) { + this.x = radius * Math.sin(theta); + this.y = y; + this.z = radius * Math.cos(theta); + return this; + } + /** + * Sets the vector components to the position elements of the + * given transformation matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Vector3} A reference to this vector. + */ + setFromMatrixPosition(m) { + const e = m.elements; + this.x = e[12]; + this.y = e[13]; + this.z = e[14]; + return this; + } + /** + * Sets the vector components to the scale elements of the + * given transformation matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Vector3} A reference to this vector. + */ + setFromMatrixScale(m) { + const sx = this.setFromMatrixColumn(m, 0).length(); + const sy = this.setFromMatrixColumn(m, 1).length(); + const sz = this.setFromMatrixColumn(m, 2).length(); + this.x = sx; + this.y = sy; + this.z = sz; + return this; + } + /** + * Sets the vector components from the specified matrix column. + * + * @param {Matrix4} m - The 4x4 matrix. + * @param {number} index - The column index. + * @return {Vector3} A reference to this vector. + */ + setFromMatrixColumn(m, index) { + return this.fromArray(m.elements, index * 4); + } + /** + * Sets the vector components from the specified matrix column. + * + * @param {Matrix3} m - The 3x3 matrix. + * @param {number} index - The column index. + * @return {Vector3} A reference to this vector. + */ + setFromMatrix3Column(m, index) { + return this.fromArray(m.elements, index * 3); + } + /** + * Sets the vector components from the given Euler angles. + * + * @param {Euler} e - The Euler angles to set. + * @return {Vector3} A reference to this vector. + */ + setFromEuler(e) { + this.x = e._x; + this.y = e._y; + this.z = e._z; + return this; + } + /** + * Sets the vector components from the RGB components of the + * given color. + * + * @param {Color} c - The color to set. + * @return {Vector3} A reference to this vector. + */ + setFromColor(c) { + this.x = c.r; + this.y = c.g; + this.z = c.b; + return this; + } + /** + * Returns `true` if this vector is equal with the given one. + * + * @param {Vector3} v - The vector to test for equality. + * @return {boolean} Whether this vector is equal with the given one. + */ + equals(v) { + return v.x === this.x && v.y === this.y && v.z === this.z; + } + /** + * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]` + * and z value to be `array[ offset + 2 ]`. + * + * @param {Array} array - An array holding the vector component values. + * @param {number} [offset=0] - The offset into the array. + * @return {Vector3} A reference to this vector. + */ + fromArray(array, offset = 0) { + this.x = array[offset]; + this.y = array[offset + 1]; + this.z = array[offset + 2]; + return this; + } + /** + * Writes the components of this vector to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the vector components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The vector components. + */ + toArray(array = [], offset = 0) { + array[offset] = this.x; + array[offset + 1] = this.y; + array[offset + 2] = this.z; + return array; + } + /** + * Sets the components of this vector from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding vector data. + * @param {number} index - The index into the attribute. + * @return {Vector3} A reference to this vector. + */ + fromBufferAttribute(attribute, index) { + this.x = attribute.getX(index); + this.y = attribute.getY(index); + this.z = attribute.getZ(index); + return this; + } + /** + * Sets each component of this vector to a pseudo-random value between `0` and + * `1`, excluding `1`. + * + * @return {Vector3} A reference to this vector. + */ + random() { + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + return this; + } + /** + * Sets this vector to a uniformly random point on a unit sphere. + * + * @return {Vector3} A reference to this vector. + */ + randomDirection() { + const theta = Math.random() * Math.PI * 2; + const u = Math.random() * 2 - 1; + const c = Math.sqrt(1 - u * u); + this.x = c * Math.cos(theta); + this.y = u; + this.z = c * Math.sin(theta); + return this; + } + *[Symbol.iterator]() { + yield this.x; + yield this.y; + yield this.z; + } +}; +var _vector$c = new Vector3(); +var _quaternion$4 = new Quaternion(); +var Matrix3 = class _Matrix3 { + /** + * Constructs a new 3x3 matrix. The arguments are supposed to be + * in row-major order. If no arguments are provided, the constructor + * initializes the matrix as an identity matrix. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n13] - 1-3 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + * @param {number} [n23] - 2-3 matrix element. + * @param {number} [n31] - 3-1 matrix element. + * @param {number} [n32] - 3-2 matrix element. + * @param {number} [n33] - 3-3 matrix element. + */ + constructor(n11, n12, n13, n21, n22, n23, n31, n32, n33) { + _Matrix3.prototype.isMatrix3 = true; + this.elements = [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1 + ]; + if (n11 !== void 0) { + this.set(n11, n12, n13, n21, n22, n23, n31, n32, n33); + } + } + /** + * Sets the elements of the matrix.The arguments are supposed to be + * in row-major order. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n13] - 1-3 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + * @param {number} [n23] - 2-3 matrix element. + * @param {number} [n31] - 3-1 matrix element. + * @param {number} [n32] - 3-2 matrix element. + * @param {number} [n33] - 3-3 matrix element. + * @return {Matrix3} A reference to this matrix. + */ + set(n11, n12, n13, n21, n22, n23, n31, n32, n33) { + const te = this.elements; + te[0] = n11; + te[1] = n21; + te[2] = n31; + te[3] = n12; + te[4] = n22; + te[5] = n32; + te[6] = n13; + te[7] = n23; + te[8] = n33; + return this; + } + /** + * Sets this matrix to the 3x3 identity matrix. + * + * @return {Matrix3} A reference to this matrix. + */ + identity() { + this.set( + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Copies the values of the given matrix to this instance. + * + * @param {Matrix3} m - The matrix to copy. + * @return {Matrix3} A reference to this matrix. + */ + copy(m) { + const te = this.elements; + const me = m.elements; + te[0] = me[0]; + te[1] = me[1]; + te[2] = me[2]; + te[3] = me[3]; + te[4] = me[4]; + te[5] = me[5]; + te[6] = me[6]; + te[7] = me[7]; + te[8] = me[8]; + return this; + } + /** + * Extracts the basis of this matrix into the three axis vectors provided. + * + * @param {Vector3} xAxis - The basis's x axis. + * @param {Vector3} yAxis - The basis's y axis. + * @param {Vector3} zAxis - The basis's z axis. + * @return {Matrix3} A reference to this matrix. + */ + extractBasis(xAxis, yAxis, zAxis) { + xAxis.setFromMatrix3Column(this, 0); + yAxis.setFromMatrix3Column(this, 1); + zAxis.setFromMatrix3Column(this, 2); + return this; + } + /** + * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Matrix3} A reference to this matrix. + */ + setFromMatrix4(m) { + const me = m.elements; + this.set( + me[0], + me[4], + me[8], + me[1], + me[5], + me[9], + me[2], + me[6], + me[10] + ); + return this; + } + /** + * Post-multiplies this matrix by the given 3x3 matrix. + * + * @param {Matrix3} m - The matrix to multiply with. + * @return {Matrix3} A reference to this matrix. + */ + multiply(m) { + return this.multiplyMatrices(this, m); + } + /** + * Pre-multiplies this matrix by the given 3x3 matrix. + * + * @param {Matrix3} m - The matrix to multiply with. + * @return {Matrix3} A reference to this matrix. + */ + premultiply(m) { + return this.multiplyMatrices(m, this); + } + /** + * Multiples the given 3x3 matrices and stores the result + * in this matrix. + * + * @param {Matrix3} a - The first matrix. + * @param {Matrix3} b - The second matrix. + * @return {Matrix3} A reference to this matrix. + */ + multiplyMatrices(a, b) { + const ae = a.elements; + const be = b.elements; + const te = this.elements; + const a11 = ae[0], a12 = ae[3], a13 = ae[6]; + const a21 = ae[1], a22 = ae[4], a23 = ae[7]; + const a31 = ae[2], a32 = ae[5], a33 = ae[8]; + const b11 = be[0], b12 = be[3], b13 = be[6]; + const b21 = be[1], b22 = be[4], b23 = be[7]; + const b31 = be[2], b32 = be[5], b33 = be[8]; + te[0] = a11 * b11 + a12 * b21 + a13 * b31; + te[3] = a11 * b12 + a12 * b22 + a13 * b32; + te[6] = a11 * b13 + a12 * b23 + a13 * b33; + te[1] = a21 * b11 + a22 * b21 + a23 * b31; + te[4] = a21 * b12 + a22 * b22 + a23 * b32; + te[7] = a21 * b13 + a22 * b23 + a23 * b33; + te[2] = a31 * b11 + a32 * b21 + a33 * b31; + te[5] = a31 * b12 + a32 * b22 + a33 * b32; + te[8] = a31 * b13 + a32 * b23 + a33 * b33; + return this; + } + /** + * Multiplies every component of the matrix by the given scalar. + * + * @param {number} s - The scalar. + * @return {Matrix3} A reference to this matrix. + */ + multiplyScalar(s) { + const te = this.elements; + te[0] *= s; + te[3] *= s; + te[6] *= s; + te[1] *= s; + te[4] *= s; + te[7] *= s; + te[2] *= s; + te[5] *= s; + te[8] *= s; + return this; + } + /** + * Computes and returns the determinant of this matrix. + * + * @return {number} The determinant. + */ + determinant() { + const te = this.elements; + const a = te[0], b = te[1], c = te[2], d = te[3], e = te[4], f = te[5], g = te[6], h = te[7], i = te[8]; + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + } + /** + * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution). + * You can not invert with a determinant of zero. If you attempt this, the method produces + * a zero matrix instead. + * + * @return {Matrix3} A reference to this matrix. + */ + invert() { + const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n12 = te[3], n22 = te[4], n32 = te[5], n13 = te[6], n23 = te[7], n33 = te[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13; + if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); + const detInv = 1 / det; + te[0] = t11 * detInv; + te[1] = (n31 * n23 - n33 * n21) * detInv; + te[2] = (n32 * n21 - n31 * n22) * detInv; + te[3] = t12 * detInv; + te[4] = (n33 * n11 - n31 * n13) * detInv; + te[5] = (n31 * n12 - n32 * n11) * detInv; + te[6] = t13 * detInv; + te[7] = (n21 * n13 - n23 * n11) * detInv; + te[8] = (n22 * n11 - n21 * n12) * detInv; + return this; + } + /** + * Transposes this matrix in place. + * + * @return {Matrix3} A reference to this matrix. + */ + transpose() { + let tmp2; + const m = this.elements; + tmp2 = m[1]; + m[1] = m[3]; + m[3] = tmp2; + tmp2 = m[2]; + m[2] = m[6]; + m[6] = tmp2; + tmp2 = m[5]; + m[5] = m[7]; + m[7] = tmp2; + return this; + } + /** + * Computes the normal matrix which is the inverse transpose of the upper + * left 3x3 portion of the given 4x4 matrix. + * + * @param {Matrix4} matrix4 - The 4x4 matrix. + * @return {Matrix3} A reference to this matrix. + */ + getNormalMatrix(matrix4) { + return this.setFromMatrix4(matrix4).invert().transpose(); + } + /** + * Transposes this matrix into the supplied array, and returns itself unchanged. + * + * @param {Array} r - An array to store the transposed matrix elements. + * @return {Matrix3} A reference to this matrix. + */ + transposeIntoArray(r) { + const m = this.elements; + r[0] = m[0]; + r[1] = m[3]; + r[2] = m[6]; + r[3] = m[1]; + r[4] = m[4]; + r[5] = m[7]; + r[6] = m[2]; + r[7] = m[5]; + r[8] = m[8]; + return this; + } + /** + * Sets the UV transform matrix from offset, repeat, rotation, and center. + * + * @param {number} tx - Offset x. + * @param {number} ty - Offset y. + * @param {number} sx - Repeat x. + * @param {number} sy - Repeat y. + * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise. + * @param {number} cx - Center x of rotation. + * @param {number} cy - Center y of rotation + * @return {Matrix3} A reference to this matrix. + */ + setUvTransform(tx, ty, sx, sy, rotation, cx, cy) { + const c = Math.cos(rotation); + const s = Math.sin(rotation); + this.set( + sx * c, + sx * s, + -sx * (c * cx + s * cy) + cx + tx, + -sy * s, + sy * c, + -sy * (-s * cx + c * cy) + cy + ty, + 0, + 0, + 1 + ); + return this; + } + /** + * Scales this matrix with the given scalar values. + * + * @param {number} sx - The amount to scale in the X axis. + * @param {number} sy - The amount to scale in the Y axis. + * @return {Matrix3} A reference to this matrix. + */ + scale(sx, sy) { + this.premultiply(_m3.makeScale(sx, sy)); + return this; + } + /** + * Rotates this matrix by the given angle. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix3} A reference to this matrix. + */ + rotate(theta) { + this.premultiply(_m3.makeRotation(-theta)); + return this; + } + /** + * Translates this matrix by the given scalar values. + * + * @param {number} tx - The amount to translate in the X axis. + * @param {number} ty - The amount to translate in the Y axis. + * @return {Matrix3} A reference to this matrix. + */ + translate(tx, ty) { + this.premultiply(_m3.makeTranslation(tx, ty)); + return this; + } + // for 2D Transforms + /** + * Sets this matrix as a 2D translation transform. + * + * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector. + * @param {number} y - The amount to translate in the Y axis. + * @return {Matrix3} A reference to this matrix. + */ + makeTranslation(x, y) { + if (x.isVector2) { + this.set( + 1, + 0, + x.x, + 0, + 1, + x.y, + 0, + 0, + 1 + ); + } else { + this.set( + 1, + 0, + x, + 0, + 1, + y, + 0, + 0, + 1 + ); + } + return this; + } + /** + * Sets this matrix as a 2D rotational transformation. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix3} A reference to this matrix. + */ + makeRotation(theta) { + const c = Math.cos(theta); + const s = Math.sin(theta); + this.set( + c, + -s, + 0, + s, + c, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Sets this matrix as a 2D scale transform. + * + * @param {number} x - The amount to scale in the X axis. + * @param {number} y - The amount to scale in the Y axis. + * @return {Matrix3} A reference to this matrix. + */ + makeScale(x, y) { + this.set( + x, + 0, + 0, + 0, + y, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Returns `true` if this matrix is equal with the given one. + * + * @param {Matrix3} matrix - The matrix to test for equality. + * @return {boolean} Whether this matrix is equal with the given one. + */ + equals(matrix) { + const te = this.elements; + const me = matrix.elements; + for (let i = 0; i < 9; i++) { + if (te[i] !== me[i]) return false; + } + return true; + } + /** + * Sets the elements of the matrix from the given array. + * + * @param {Array} array - The matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Matrix3} A reference to this matrix. + */ + fromArray(array, offset = 0) { + for (let i = 0; i < 9; i++) { + this.elements[i] = array[i + offset]; + } + return this; + } + /** + * Writes the elements of this matrix to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The matrix elements in column-major order. + */ + toArray(array = [], offset = 0) { + const te = this.elements; + array[offset] = te[0]; + array[offset + 1] = te[1]; + array[offset + 2] = te[2]; + array[offset + 3] = te[3]; + array[offset + 4] = te[4]; + array[offset + 5] = te[5]; + array[offset + 6] = te[6]; + array[offset + 7] = te[7]; + array[offset + 8] = te[8]; + return array; + } + /** + * Returns a matrix with copied values from this instance. + * + * @return {Matrix3} A clone of this instance. + */ + clone() { + return new this.constructor().fromArray(this.elements); + } +}; +var _m3 = new Matrix3(); +var LINEAR_REC709_TO_XYZ = new Matrix3().set( + 0.4123908, + 0.3575843, + 0.1804808, + 0.212639, + 0.7151687, + 0.0721923, + 0.0193308, + 0.1191948, + 0.9505322 +); +var XYZ_TO_LINEAR_REC709 = new Matrix3().set( + 3.2409699, + -1.5373832, + -0.4986108, + -0.9692436, + 1.8759675, + 0.0415551, + 0.0556301, + -0.203977, + 1.0569715 +); +function createColorManagement() { + const ColorManagement2 = { + enabled: true, + workingColorSpace: LinearSRGBColorSpace, + /** + * Implementations of supported color spaces. + * + * Required: + * - primaries: chromaticity coordinates [ rx ry gx gy bx by ] + * - whitePoint: reference white [ x y ] + * - transfer: transfer function (pre-defined) + * - toXYZ: Matrix3 RGB to XYZ transform + * - fromXYZ: Matrix3 XYZ to RGB transform + * - luminanceCoefficients: RGB luminance coefficients + * + * Optional: + * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' } + * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace } + * + * Reference: + * - https://www.russellcottrell.com/photo/matrixCalculator.htm + */ + spaces: {}, + convert: function(color, sourceColorSpace, targetColorSpace) { + if (this.enabled === false || sourceColorSpace === targetColorSpace || !sourceColorSpace || !targetColorSpace) { + return color; + } + if (this.spaces[sourceColorSpace].transfer === SRGBTransfer) { + color.r = SRGBToLinear(color.r); + color.g = SRGBToLinear(color.g); + color.b = SRGBToLinear(color.b); + } + if (this.spaces[sourceColorSpace].primaries !== this.spaces[targetColorSpace].primaries) { + color.applyMatrix3(this.spaces[sourceColorSpace].toXYZ); + color.applyMatrix3(this.spaces[targetColorSpace].fromXYZ); + } + if (this.spaces[targetColorSpace].transfer === SRGBTransfer) { + color.r = LinearToSRGB(color.r); + color.g = LinearToSRGB(color.g); + color.b = LinearToSRGB(color.b); + } + return color; + }, + workingToColorSpace: function(color, targetColorSpace) { + return this.convert(color, this.workingColorSpace, targetColorSpace); + }, + colorSpaceToWorking: function(color, sourceColorSpace) { + return this.convert(color, sourceColorSpace, this.workingColorSpace); + }, + getPrimaries: function(colorSpace) { + return this.spaces[colorSpace].primaries; + }, + getTransfer: function(colorSpace) { + if (colorSpace === NoColorSpace) return LinearTransfer; + return this.spaces[colorSpace].transfer; + }, + getToneMappingMode: function(colorSpace) { + return this.spaces[colorSpace].outputColorSpaceConfig.toneMappingMode || "standard"; + }, + getLuminanceCoefficients: function(target, colorSpace = this.workingColorSpace) { + return target.fromArray(this.spaces[colorSpace].luminanceCoefficients); + }, + define: function(colorSpaces) { + Object.assign(this.spaces, colorSpaces); + }, + // Internal APIs + _getMatrix: function(targetMatrix, sourceColorSpace, targetColorSpace) { + return targetMatrix.copy(this.spaces[sourceColorSpace].toXYZ).multiply(this.spaces[targetColorSpace].fromXYZ); + }, + _getDrawingBufferColorSpace: function(colorSpace) { + return this.spaces[colorSpace].outputColorSpaceConfig.drawingBufferColorSpace; + }, + _getUnpackColorSpace: function(colorSpace = this.workingColorSpace) { + return this.spaces[colorSpace].workingColorSpaceConfig.unpackColorSpace; + }, + // Deprecated + fromWorkingColorSpace: function(color, targetColorSpace) { + warnOnce("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."); + return ColorManagement2.workingToColorSpace(color, targetColorSpace); + }, + toWorkingColorSpace: function(color, sourceColorSpace) { + warnOnce("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."); + return ColorManagement2.colorSpaceToWorking(color, sourceColorSpace); + } + }; + const REC709_PRIMARIES = [0.64, 0.33, 0.3, 0.6, 0.15, 0.06]; + const REC709_LUMINANCE_COEFFICIENTS = [0.2126, 0.7152, 0.0722]; + const D65 = [0.3127, 0.329]; + ColorManagement2.define({ + [LinearSRGBColorSpace]: { + primaries: REC709_PRIMARIES, + whitePoint: D65, + transfer: LinearTransfer, + toXYZ: LINEAR_REC709_TO_XYZ, + fromXYZ: XYZ_TO_LINEAR_REC709, + luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS, + workingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace }, + outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace } + }, + [SRGBColorSpace]: { + primaries: REC709_PRIMARIES, + whitePoint: D65, + transfer: SRGBTransfer, + toXYZ: LINEAR_REC709_TO_XYZ, + fromXYZ: XYZ_TO_LINEAR_REC709, + luminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS, + outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace } + } + }); + return ColorManagement2; +} +var ColorManagement = createColorManagement(); +function SRGBToLinear(c) { + return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4); +} +function LinearToSRGB(c) { + return c < 31308e-7 ? c * 12.92 : 1.055 * Math.pow(c, 0.41666) - 0.055; +} +var _canvas; +var ImageUtils = class { + /** + * Returns a data URI containing a representation of the given image. + * + * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object. + * @param {string} [type='image/png'] - Indicates the image format. + * @return {string} The data URI. + */ + static getDataURL(image, type = "image/png") { + if (/^data:/i.test(image.src)) { + return image.src; + } + if (typeof HTMLCanvasElement === "undefined") { + return image.src; + } + let canvas; + if (image instanceof HTMLCanvasElement) { + canvas = image; + } else { + if (_canvas === void 0) _canvas = createElementNS("canvas"); + _canvas.width = image.width; + _canvas.height = image.height; + const context = _canvas.getContext("2d"); + if (image instanceof ImageData) { + context.putImageData(image, 0, 0); + } else { + context.drawImage(image, 0, 0, image.width, image.height); + } + canvas = _canvas; + } + return canvas.toDataURL(type); + } + /** + * Converts the given sRGB image data to linear color space. + * + * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object. + * @return {HTMLCanvasElement|Object} The converted image. + */ + static sRGBToLinear(image) { + if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) { + const canvas = createElementNS("canvas"); + canvas.width = image.width; + canvas.height = image.height; + const context = canvas.getContext("2d"); + context.drawImage(image, 0, 0, image.width, image.height); + const imageData = context.getImageData(0, 0, image.width, image.height); + const data = imageData.data; + for (let i = 0; i < data.length; i++) { + data[i] = SRGBToLinear(data[i] / 255) * 255; + } + context.putImageData(imageData, 0, 0); + return canvas; + } else if (image.data) { + const data = image.data.slice(0); + for (let i = 0; i < data.length; i++) { + if (data instanceof Uint8Array || data instanceof Uint8ClampedArray) { + data[i] = Math.floor(SRGBToLinear(data[i] / 255) * 255); + } else { + data[i] = SRGBToLinear(data[i]); + } + } + return { + data, + width: image.width, + height: image.height + }; + } else { + warn("ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."); + return image; + } + } +}; +var _sourceId = 0; +var Source = class { + /** + * Constructs a new video texture. + * + * @param {any} [data=null] - The data definition of a texture. + */ + constructor(data = null) { + this.isSource = true; + Object.defineProperty(this, "id", { value: _sourceId++ }); + this.uuid = generateUUID(); + this.data = data; + this.dataReady = true; + this.version = 0; + } + /** + * Returns the dimensions of the source into the given target vector. + * + * @param {(Vector2|Vector3)} target - The target object the result is written into. + * @return {(Vector2|Vector3)} The dimensions of the source. + */ + getSize(target) { + const data = this.data; + if (typeof HTMLVideoElement !== "undefined" && data instanceof HTMLVideoElement) { + target.set(data.videoWidth, data.videoHeight, 0); + } else if (typeof VideoFrame !== "undefined" && data instanceof VideoFrame) { + target.set(data.displayHeight, data.displayWidth, 0); + } else if (data !== null) { + target.set(data.width, data.height, data.depth || 0); + } else { + target.set(0, 0, 0); + } + return target; + } + /** + * When the property is set to `true`, the engine allocates the memory + * for the texture (if necessary) and triggers the actual texture upload + * to the GPU next time the source is used. + * + * @type {boolean} + * @default false + * @param {boolean} value + */ + set needsUpdate(value) { + if (value === true) this.version++; + } + /** + * Serializes the source into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized source. + * @see {@link ObjectLoader#parse} + */ + toJSON(meta) { + const isRootObject = meta === void 0 || typeof meta === "string"; + if (!isRootObject && meta.images[this.uuid] !== void 0) { + return meta.images[this.uuid]; + } + const output = { + uuid: this.uuid, + url: "" + }; + const data = this.data; + if (data !== null) { + let url; + if (Array.isArray(data)) { + url = []; + for (let i = 0, l = data.length; i < l; i++) { + if (data[i].isDataTexture) { + url.push(serializeImage(data[i].image)); + } else { + url.push(serializeImage(data[i])); + } + } + } else { + url = serializeImage(data); + } + output.url = url; + } + if (!isRootObject) { + meta.images[this.uuid] = output; + } + return output; + } +}; +function serializeImage(image) { + if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) { + return ImageUtils.getDataURL(image); + } else { + if (image.data) { + return { + data: Array.from(image.data), + width: image.width, + height: image.height, + type: image.data.constructor.name + }; + } else { + warn("Texture: Unable to serialize Texture."); + return {}; + } + } +} +var _textureId = 0; +var _tempVec3 = new Vector3(); +var Texture = class _Texture extends EventDispatcher { + /** + * Constructs a new texture. + * + * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data. + * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=LinearFilter] - The mag filter value. + * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value. + * @param {number} [format=RGBAFormat] - The texture format. + * @param {number} [type=UnsignedByteType] - The texture type. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + * @param {string} [colorSpace=NoColorSpace] - The color space. + */ + constructor(image = _Texture.DEFAULT_IMAGE, mapping = _Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = _Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace) { + super(); + this.isTexture = true; + Object.defineProperty(this, "id", { value: _textureId++ }); + this.uuid = generateUUID(); + this.name = ""; + this.source = new Source(image); + this.mipmaps = []; + this.mapping = mapping; + this.channel = 0; + this.wrapS = wrapS; + this.wrapT = wrapT; + this.magFilter = magFilter; + this.minFilter = minFilter; + this.anisotropy = anisotropy; + this.format = format; + this.internalFormat = null; + this.type = type; + this.offset = new Vector2(0, 0); + this.repeat = new Vector2(1, 1); + this.center = new Vector2(0, 0); + this.rotation = 0; + this.matrixAutoUpdate = true; + this.matrix = new Matrix3(); + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; + this.colorSpace = colorSpace; + this.userData = {}; + this.updateRanges = []; + this.version = 0; + this.onUpdate = null; + this.renderTarget = null; + this.isRenderTargetTexture = false; + this.isArrayTexture = image && image.depth && image.depth > 1 ? true : false; + this.pmremVersion = 0; + } + /** + * The width of the texture in pixels. + */ + get width() { + return this.source.getSize(_tempVec3).x; + } + /** + * The height of the texture in pixels. + */ + get height() { + return this.source.getSize(_tempVec3).y; + } + /** + * The depth of the texture in pixels. + */ + get depth() { + return this.source.getSize(_tempVec3).z; + } + /** + * The image object holding the texture data. + * + * @type {?Object} + */ + get image() { + return this.source.data; + } + set image(value = null) { + this.source.data = value; + } + /** + * Updates the texture transformation matrix from the from the properties {@link Texture#offset}, + * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}. + */ + updateMatrix() { + this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y); + } + /** + * Adds a range of data in the data texture to be updated on the GPU. + * + * @param {number} start - Position at which to start update. + * @param {number} count - The number of components to update. + */ + addUpdateRange(start, count) { + this.updateRanges.push({ start, count }); + } + /** + * Clears the update ranges. + */ + clearUpdateRanges() { + this.updateRanges.length = 0; + } + /** + * Returns a new texture with copied values from this instance. + * + * @return {Texture} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Copies the values of the given texture to this instance. + * + * @param {Texture} source - The texture to copy. + * @return {Texture} A reference to this instance. + */ + copy(source) { + this.name = source.name; + this.source = source.source; + this.mipmaps = source.mipmaps.slice(0); + this.mapping = source.mapping; + this.channel = source.channel; + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + this.anisotropy = source.anisotropy; + this.format = source.format; + this.internalFormat = source.internalFormat; + this.type = source.type; + this.offset.copy(source.offset); + this.repeat.copy(source.repeat); + this.center.copy(source.center); + this.rotation = source.rotation; + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrix.copy(source.matrix); + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.colorSpace = source.colorSpace; + this.renderTarget = source.renderTarget; + this.isRenderTargetTexture = source.isRenderTargetTexture; + this.isArrayTexture = source.isArrayTexture; + this.userData = JSON.parse(JSON.stringify(source.userData)); + this.needsUpdate = true; + return this; + } + /** + * Sets this texture's properties based on `values`. + * @param {Object} values - A container with texture parameters. + */ + setValues(values) { + for (const key in values) { + const newValue = values[key]; + if (newValue === void 0) { + warn(`Texture.setValues(): parameter '${key}' has value of undefined.`); + continue; + } + const currentValue = this[key]; + if (currentValue === void 0) { + warn(`Texture.setValues(): property '${key}' does not exist.`); + continue; + } + if (currentValue && newValue && (currentValue.isVector2 && newValue.isVector2)) { + currentValue.copy(newValue); + } else if (currentValue && newValue && (currentValue.isVector3 && newValue.isVector3)) { + currentValue.copy(newValue); + } else if (currentValue && newValue && (currentValue.isMatrix3 && newValue.isMatrix3)) { + currentValue.copy(newValue); + } else { + this[key] = newValue; + } + } + } + /** + * Serializes the texture into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized texture. + * @see {@link ObjectLoader#parse} + */ + toJSON(meta) { + const isRootObject = meta === void 0 || typeof meta === "string"; + if (!isRootObject && meta.textures[this.uuid] !== void 0) { + return meta.textures[this.uuid]; + } + const output = { + metadata: { + version: 4.7, + type: "Texture", + generator: "Texture.toJSON" + }, + uuid: this.uuid, + name: this.name, + image: this.source.toJSON(meta).uuid, + mapping: this.mapping, + channel: this.channel, + 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, + internalFormat: this.internalFormat, + type: this.type, + colorSpace: this.colorSpace, + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + flipY: this.flipY, + generateMipmaps: this.generateMipmaps, + premultiplyAlpha: this.premultiplyAlpha, + unpackAlignment: this.unpackAlignment + }; + if (Object.keys(this.userData).length > 0) output.userData = this.userData; + if (!isRootObject) { + meta.textures[this.uuid] = output; + } + return output; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + * + * @fires Texture#dispose + */ + dispose() { + this.dispatchEvent({ type: "dispose" }); + } + /** + * Transforms the given uv vector with the textures uv transformation matrix. + * + * @param {Vector2} uv - The uv vector. + * @return {Vector2} The transformed uv vector. + */ + transformUv(uv) { + if (this.mapping !== UVMapping) return uv; + uv.applyMatrix3(this.matrix); + if (uv.x < 0 || uv.x > 1) { + switch (this.wrapS) { + case RepeatWrapping: + uv.x = uv.x - Math.floor(uv.x); + break; + case ClampToEdgeWrapping: + uv.x = uv.x < 0 ? 0 : 1; + break; + case MirroredRepeatWrapping: + if (Math.abs(Math.floor(uv.x) % 2) === 1) { + uv.x = Math.ceil(uv.x) - uv.x; + } else { + uv.x = uv.x - Math.floor(uv.x); + } + break; + } + } + if (uv.y < 0 || uv.y > 1) { + switch (this.wrapT) { + case RepeatWrapping: + uv.y = uv.y - Math.floor(uv.y); + break; + case ClampToEdgeWrapping: + uv.y = uv.y < 0 ? 0 : 1; + break; + case MirroredRepeatWrapping: + if (Math.abs(Math.floor(uv.y) % 2) === 1) { + uv.y = Math.ceil(uv.y) - uv.y; + } else { + uv.y = uv.y - Math.floor(uv.y); + } + break; + } + } + if (this.flipY) { + uv.y = 1 - uv.y; + } + return uv; + } + /** + * Setting this property to `true` indicates the engine the texture + * must be updated in the next render. This triggers a texture upload + * to the GPU and ensures correct texture parameter configuration. + * + * @type {boolean} + * @default false + * @param {boolean} value + */ + set needsUpdate(value) { + if (value === true) { + this.version++; + this.source.needsUpdate = true; + } + } + /** + * Setting this property to `true` indicates the engine the PMREM + * must be regenerated. + * + * @type {boolean} + * @default false + * @param {boolean} value + */ + set needsPMREMUpdate(value) { + if (value === true) { + this.pmremVersion++; + } + } +}; +Texture.DEFAULT_IMAGE = null; +Texture.DEFAULT_MAPPING = UVMapping; +Texture.DEFAULT_ANISOTROPY = 1; +var Vector4 = class _Vector4 { + /** + * Constructs a new 4D vector. + * + * @param {number} [x=0] - The x value of this vector. + * @param {number} [y=0] - The y value of this vector. + * @param {number} [z=0] - The z value of this vector. + * @param {number} [w=1] - The w value of this vector. + */ + constructor(x = 0, y = 0, z = 0, w = 1) { + _Vector4.prototype.isVector4 = true; + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + /** + * Alias for {@link Vector4#z}. + * + * @type {number} + */ + get width() { + return this.z; + } + set width(value) { + this.z = value; + } + /** + * Alias for {@link Vector4#w}. + * + * @type {number} + */ + get height() { + return this.w; + } + set height(value) { + this.w = value; + } + /** + * Sets the vector components. + * + * @param {number} x - The value of the x component. + * @param {number} y - The value of the y component. + * @param {number} z - The value of the z component. + * @param {number} w - The value of the w component. + * @return {Vector4} A reference to this vector. + */ + set(x, y, z, w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + return this; + } + /** + * Sets the vector components to the same value. + * + * @param {number} scalar - The value to set for all vector components. + * @return {Vector4} A reference to this vector. + */ + setScalar(scalar) { + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + return this; + } + /** + * Sets the vector's x component to the given value + * + * @param {number} x - The value to set. + * @return {Vector4} A reference to this vector. + */ + setX(x) { + this.x = x; + return this; + } + /** + * Sets the vector's y component to the given value + * + * @param {number} y - The value to set. + * @return {Vector4} A reference to this vector. + */ + setY(y) { + this.y = y; + return this; + } + /** + * Sets the vector's z component to the given value + * + * @param {number} z - The value to set. + * @return {Vector4} A reference to this vector. + */ + setZ(z) { + this.z = z; + return this; + } + /** + * Sets the vector's w component to the given value + * + * @param {number} w - The value to set. + * @return {Vector4} A reference to this vector. + */ + setW(w) { + this.w = w; + return this; + } + /** + * Allows to set a vector component with an index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y, + * `2` equals to z, `3` equals to w. + * @param {number} value - The value to set. + * @return {Vector4} A reference to this vector. + */ + setComponent(index, value) { + switch (index) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + case 2: + this.z = value; + break; + case 3: + this.w = value; + break; + default: + throw new Error("index is out of range: " + index); + } + return this; + } + /** + * Returns the value of the vector component which matches the given index. + * + * @param {number} index - The component index. `0` equals to x, `1` equals to y, + * `2` equals to z, `3` equals to w. + * @return {number} A vector component value. + */ + getComponent(index) { + switch (index) { + 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: " + index); + } + } + /** + * Returns a new vector with copied values from this instance. + * + * @return {Vector4} A clone of this instance. + */ + clone() { + return new this.constructor(this.x, this.y, this.z, this.w); + } + /** + * Copies the values of the given vector to this instance. + * + * @param {Vector3|Vector4} v - The vector to copy. + * @return {Vector4} A reference to this vector. + */ + copy(v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = v.w !== void 0 ? v.w : 1; + return this; + } + /** + * Adds the given vector to this instance. + * + * @param {Vector4} v - The vector to add. + * @return {Vector4} A reference to this vector. + */ + add(v) { + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + return this; + } + /** + * Adds the given scalar value to all components of this instance. + * + * @param {number} s - The scalar to add. + * @return {Vector4} A reference to this vector. + */ + addScalar(s) { + this.x += s; + this.y += s; + this.z += s; + this.w += s; + return this; + } + /** + * Adds the given vectors and stores the result in this instance. + * + * @param {Vector4} a - The first vector. + * @param {Vector4} b - The second vector. + * @return {Vector4} A reference to this vector. + */ + addVectors(a, b) { + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + return this; + } + /** + * Adds the given vector scaled by the given factor to this instance. + * + * @param {Vector4} v - The vector. + * @param {number} s - The factor that scales `v`. + * @return {Vector4} A reference to this vector. + */ + addScaledVector(v, s) { + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + return this; + } + /** + * Subtracts the given vector from this instance. + * + * @param {Vector4} v - The vector to subtract. + * @return {Vector4} A reference to this vector. + */ + sub(v) { + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + return this; + } + /** + * Subtracts the given scalar value from all components of this instance. + * + * @param {number} s - The scalar to subtract. + * @return {Vector4} A reference to this vector. + */ + subScalar(s) { + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + return this; + } + /** + * Subtracts the given vectors and stores the result in this instance. + * + * @param {Vector4} a - The first vector. + * @param {Vector4} b - The second vector. + * @return {Vector4} A reference to this vector. + */ + subVectors(a, b) { + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + return this; + } + /** + * Multiplies the given vector with this instance. + * + * @param {Vector4} v - The vector to multiply. + * @return {Vector4} A reference to this vector. + */ + multiply(v) { + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + this.w *= v.w; + return this; + } + /** + * Multiplies the given scalar value with all components of this instance. + * + * @param {number} scalar - The scalar to multiply. + * @return {Vector4} A reference to this vector. + */ + multiplyScalar(scalar) { + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + return this; + } + /** + * Multiplies this vector with the given 4x4 matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Vector4} A reference to this vector. + */ + applyMatrix4(m) { + const x = this.x, y = this.y, z = this.z, w = this.w; + const e = m.elements; + this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w; + this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w; + this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w; + this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w; + return this; + } + /** + * Divides this instance by the given vector. + * + * @param {Vector4} v - The vector to divide. + * @return {Vector4} A reference to this vector. + */ + divide(v) { + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + this.w /= v.w; + return this; + } + /** + * Divides this vector by the given scalar. + * + * @param {number} scalar - The scalar to divide. + * @return {Vector4} A reference to this vector. + */ + divideScalar(scalar) { + return this.multiplyScalar(1 / scalar); + } + /** + * Sets the x, y and z components of this + * vector to the quaternion's axis and w to the angle. + * + * @param {Quaternion} q - The Quaternion to set. + * @return {Vector4} A reference to this vector. + */ + setAxisAngleFromQuaternion(q) { + this.w = 2 * Math.acos(q.w); + const s = Math.sqrt(1 - q.w * q.w); + if (s < 1e-4) { + this.x = 1; + this.y = 0; + this.z = 0; + } else { + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + } + return this; + } + /** + * Sets the x, y and z components of this + * vector to the axis of rotation and w to the angle. + * + * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix. + * @return {Vector4} A reference to this vector. + */ + setAxisAngleFromRotationMatrix(m) { + let angle, x, y, z; + const epsilon = 0.01, epsilon2 = 0.1, te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10]; + if (Math.abs(m12 - m21) < epsilon && Math.abs(m13 - m31) < epsilon && Math.abs(m23 - m32) < epsilon) { + if (Math.abs(m12 + m21) < epsilon2 && Math.abs(m13 + m31) < epsilon2 && Math.abs(m23 + m32) < epsilon2 && Math.abs(m11 + m22 + m33 - 3) < epsilon2) { + this.set(1, 0, 0, 0); + return this; + } + angle = Math.PI; + const xx = (m11 + 1) / 2; + const yy = (m22 + 1) / 2; + const zz = (m33 + 1) / 2; + const xy = (m12 + m21) / 4; + const xz = (m13 + m31) / 4; + const yz = (m23 + m32) / 4; + if (xx > yy && xx > zz) { + if (xx < epsilon) { + x = 0; + y = 0.707106781; + z = 0.707106781; + } else { + x = Math.sqrt(xx); + y = xy / x; + z = xz / x; + } + } else if (yy > zz) { + if (yy < epsilon) { + x = 0.707106781; + y = 0; + z = 0.707106781; + } else { + y = Math.sqrt(yy); + x = xy / y; + z = yz / y; + } + } else { + if (zz < epsilon) { + x = 0.707106781; + y = 0.707106781; + z = 0; + } else { + z = Math.sqrt(zz); + x = xz / z; + y = yz / z; + } + } + this.set(x, y, z, angle); + return this; + } + let s = Math.sqrt((m32 - m23) * (m32 - m23) + (m13 - m31) * (m13 - m31) + (m21 - m12) * (m21 - m12)); + if (Math.abs(s) < 1e-3) s = 1; + this.x = (m32 - m23) / s; + this.y = (m13 - m31) / s; + this.z = (m21 - m12) / s; + this.w = Math.acos((m11 + m22 + m33 - 1) / 2); + return this; + } + /** + * Sets the vector components to the position elements of the + * given transformation matrix. + * + * @param {Matrix4} m - The 4x4 matrix. + * @return {Vector4} A reference to this vector. + */ + setFromMatrixPosition(m) { + const e = m.elements; + this.x = e[12]; + this.y = e[13]; + this.z = e[14]; + this.w = e[15]; + return this; + } + /** + * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w + * value, replace that value with the corresponding min value. + * + * @param {Vector4} v - The vector. + * @return {Vector4} A reference to this vector. + */ + min(v) { + this.x = Math.min(this.x, v.x); + this.y = Math.min(this.y, v.y); + this.z = Math.min(this.z, v.z); + this.w = Math.min(this.w, v.w); + return this; + } + /** + * If this vector's x, y, z or w value is less than the given vector's x, y, z or w + * value, replace that value with the corresponding max value. + * + * @param {Vector4} v - The vector. + * @return {Vector4} A reference to this vector. + */ + max(v) { + this.x = Math.max(this.x, v.x); + this.y = Math.max(this.y, v.y); + this.z = Math.max(this.z, v.z); + this.w = Math.max(this.w, v.w); + return this; + } + /** + * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w + * value, it is replaced by the corresponding value. + * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value, + * it is replaced by the corresponding value. + * + * @param {Vector4} min - The minimum x, y and z values. + * @param {Vector4} max - The maximum x, y and z values in the desired range. + * @return {Vector4} A reference to this vector. + */ + clamp(min, max) { + this.x = clamp(this.x, min.x, max.x); + this.y = clamp(this.y, min.y, max.y); + this.z = clamp(this.z, min.z, max.z); + this.w = clamp(this.w, min.w, max.w); + return this; + } + /** + * If this vector's x, y, z or w values are greater than the max value, they are + * replaced by the max value. + * If this vector's x, y, z or w values are less than the min value, they are + * replaced by the min value. + * + * @param {number} minVal - The minimum value the components will be clamped to. + * @param {number} maxVal - The maximum value the components will be clamped to. + * @return {Vector4} A reference to this vector. + */ + clampScalar(minVal, maxVal) { + this.x = clamp(this.x, minVal, maxVal); + this.y = clamp(this.y, minVal, maxVal); + this.z = clamp(this.z, minVal, maxVal); + this.w = clamp(this.w, minVal, maxVal); + return this; + } + /** + * If this vector's length is greater than the max value, it is replaced by + * the max value. + * If this vector's length is less than the min value, it is replaced by the + * min value. + * + * @param {number} min - The minimum value the vector length will be clamped to. + * @param {number} max - The maximum value the vector length will be clamped to. + * @return {Vector4} A reference to this vector. + */ + clampLength(min, max) { + const length = this.length(); + return this.divideScalar(length || 1).multiplyScalar(clamp(length, min, max)); + } + /** + * The components of this vector are rounded down to the nearest integer value. + * + * @return {Vector4} A reference to this vector. + */ + floor() { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + this.z = Math.floor(this.z); + this.w = Math.floor(this.w); + return this; + } + /** + * The components of this vector are rounded up to the nearest integer value. + * + * @return {Vector4} A reference to this vector. + */ + ceil() { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + this.z = Math.ceil(this.z); + this.w = Math.ceil(this.w); + return this; + } + /** + * The components of this vector are rounded to the nearest integer value + * + * @return {Vector4} A reference to this vector. + */ + round() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + this.z = Math.round(this.z); + this.w = Math.round(this.w); + return this; + } + /** + * The components of this vector are rounded towards zero (up if negative, + * down if positive) to an integer value. + * + * @return {Vector4} A reference to this vector. + */ + roundToZero() { + this.x = Math.trunc(this.x); + this.y = Math.trunc(this.y); + this.z = Math.trunc(this.z); + this.w = Math.trunc(this.w); + return this; + } + /** + * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w. + * + * @return {Vector4} A reference to this vector. + */ + negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + this.w = -this.w; + return this; + } + /** + * Calculates the dot product of the given vector with this instance. + * + * @param {Vector4} v - The vector to compute the dot product with. + * @return {number} The result of the dot product. + */ + dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + } + /** + * Computes the square of the Euclidean length (straight-line length) from + * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should + * compare the length squared instead as it is slightly more efficient to calculate. + * + * @return {number} The square length of this vector. + */ + lengthSq() { + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + } + /** + * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w). + * + * @return {number} The length of this vector. + */ + length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + } + /** + * Computes the Manhattan length of this vector. + * + * @return {number} The length of this vector. + */ + manhattanLength() { + return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w); + } + /** + * Converts this vector to a unit vector - that is, sets it equal to a vector + * with the same direction as this one, but with a vector length of `1`. + * + * @return {Vector4} A reference to this vector. + */ + normalize() { + return this.divideScalar(this.length() || 1); + } + /** + * Sets this vector to a vector with the same direction as this one, but + * with the specified length. + * + * @param {number} length - The new length of this vector. + * @return {Vector4} A reference to this vector. + */ + setLength(length) { + return this.normalize().multiplyScalar(length); + } + /** + * Linearly interpolates between the given vector and this instance, where + * alpha is the percent distance along the line - alpha = 0 will be this + * vector, and alpha = 1 will be the given one. + * + * @param {Vector4} v - The vector to interpolate towards. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector4} A reference to this vector. + */ + lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; + this.z += (v.z - this.z) * alpha; + this.w += (v.w - this.w) * alpha; + return this; + } + /** + * Linearly interpolates between the given vectors, where alpha is the percent + * distance along the line - alpha = 0 will be first vector, and alpha = 1 will + * be the second one. The result is stored in this instance. + * + * @param {Vector4} v1 - The first vector. + * @param {Vector4} v2 - The second vector. + * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`. + * @return {Vector4} A reference to this vector. + */ + lerpVectors(v1, v2, alpha) { + this.x = v1.x + (v2.x - v1.x) * alpha; + this.y = v1.y + (v2.y - v1.y) * alpha; + this.z = v1.z + (v2.z - v1.z) * alpha; + this.w = v1.w + (v2.w - v1.w) * alpha; + return this; + } + /** + * Returns `true` if this vector is equal with the given one. + * + * @param {Vector4} v - The vector to test for equality. + * @return {boolean} Whether this vector is equal with the given one. + */ + equals(v) { + return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w; + } + /** + * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`, + * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`. + * + * @param {Array} array - An array holding the vector component values. + * @param {number} [offset=0] - The offset into the array. + * @return {Vector4} A reference to this vector. + */ + fromArray(array, offset = 0) { + this.x = array[offset]; + this.y = array[offset + 1]; + this.z = array[offset + 2]; + this.w = array[offset + 3]; + return this; + } + /** + * Writes the components of this vector to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the vector components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The vector components. + */ + toArray(array = [], offset = 0) { + array[offset] = this.x; + array[offset + 1] = this.y; + array[offset + 2] = this.z; + array[offset + 3] = this.w; + return array; + } + /** + * Sets the components of this vector from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding vector data. + * @param {number} index - The index into the attribute. + * @return {Vector4} A reference to this vector. + */ + fromBufferAttribute(attribute, index) { + this.x = attribute.getX(index); + this.y = attribute.getY(index); + this.z = attribute.getZ(index); + this.w = attribute.getW(index); + return this; + } + /** + * Sets each component of this vector to a pseudo-random value between `0` and + * `1`, excluding `1`. + * + * @return {Vector4} A reference to this vector. + */ + random() { + this.x = Math.random(); + this.y = Math.random(); + this.z = Math.random(); + this.w = Math.random(); + return this; + } + *[Symbol.iterator]() { + yield this.x; + yield this.y; + yield this.z; + yield this.w; + } +}; +var RenderTarget = class extends EventDispatcher { + /** + * Render target options. + * + * @typedef {Object} RenderTarget~Options + * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not. + * @property {number} [magFilter=LinearFilter] - The mag filter. + * @property {number} [minFilter=LinearFilter] - The min filter. + * @property {number} [format=RGBAFormat] - The texture format. + * @property {number} [type=UnsignedByteType] - The texture type. + * @property {?string} [internalFormat=null] - The texture's internal format. + * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode. + * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode. + * @property {number} [anisotropy=1] - The texture's anisotropy value. + * @property {string} [colorSpace=NoColorSpace] - The texture's color space. + * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not. + * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not. + * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not. + * @property {boolean} [resolveStencilBuffer=true] - Whether to resolve the stencil buffer or not. + * @property {?Texture} [depthTexture=null] - Reference to a depth texture. + * @property {number} [samples=0] - The MSAA samples count. + * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`. + * @property {number} [depth=1] - The texture depth. + * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering. + */ + /** + * Constructs a new render target. + * + * @param {number} [width=1] - The width of the render target. + * @param {number} [height=1] - The height of the render target. + * @param {RenderTarget~Options} [options] - The configuration object. + */ + constructor(width = 1, height = 1, options = {}) { + super(); + options = Object.assign({ + generateMipmaps: false, + internalFormat: null, + minFilter: LinearFilter, + depthBuffer: true, + stencilBuffer: false, + resolveDepthBuffer: true, + resolveStencilBuffer: true, + depthTexture: null, + samples: 0, + count: 1, + depth: 1, + multiview: false + }, options); + this.isRenderTarget = true; + this.width = width; + this.height = height; + this.depth = options.depth; + this.scissor = new Vector4(0, 0, width, height); + this.scissorTest = false; + this.viewport = new Vector4(0, 0, width, height); + const image = { width, height, depth: options.depth }; + const texture = new Texture(image); + this.textures = []; + const count = options.count; + for (let i = 0; i < count; i++) { + this.textures[i] = texture.clone(); + this.textures[i].isRenderTargetTexture = true; + this.textures[i].renderTarget = this; + } + this._setTextureOptions(options); + this.depthBuffer = options.depthBuffer; + this.stencilBuffer = options.stencilBuffer; + this.resolveDepthBuffer = options.resolveDepthBuffer; + this.resolveStencilBuffer = options.resolveStencilBuffer; + this._depthTexture = null; + this.depthTexture = options.depthTexture; + this.samples = options.samples; + this.multiview = options.multiview; + } + _setTextureOptions(options = {}) { + const values = { + minFilter: LinearFilter, + generateMipmaps: false, + flipY: false, + internalFormat: null + }; + if (options.mapping !== void 0) values.mapping = options.mapping; + if (options.wrapS !== void 0) values.wrapS = options.wrapS; + if (options.wrapT !== void 0) values.wrapT = options.wrapT; + if (options.wrapR !== void 0) values.wrapR = options.wrapR; + if (options.magFilter !== void 0) values.magFilter = options.magFilter; + if (options.minFilter !== void 0) values.minFilter = options.minFilter; + if (options.format !== void 0) values.format = options.format; + if (options.type !== void 0) values.type = options.type; + if (options.anisotropy !== void 0) values.anisotropy = options.anisotropy; + if (options.colorSpace !== void 0) values.colorSpace = options.colorSpace; + if (options.flipY !== void 0) values.flipY = options.flipY; + if (options.generateMipmaps !== void 0) values.generateMipmaps = options.generateMipmaps; + if (options.internalFormat !== void 0) values.internalFormat = options.internalFormat; + for (let i = 0; i < this.textures.length; i++) { + const texture = this.textures[i]; + texture.setValues(values); + } + } + /** + * The texture representing the default color attachment. + * + * @type {Texture} + */ + get texture() { + return this.textures[0]; + } + set texture(value) { + this.textures[0] = value; + } + set depthTexture(current) { + if (this._depthTexture !== null) this._depthTexture.renderTarget = null; + if (current !== null) current.renderTarget = this; + this._depthTexture = current; + } + /** + * Instead of saving the depth in a renderbuffer, a texture + * can be used instead which is useful for further processing + * e.g. in context of post-processing. + * + * @type {?DepthTexture} + * @default null + */ + get depthTexture() { + return this._depthTexture; + } + /** + * Sets the size of this render target. + * + * @param {number} width - The width. + * @param {number} height - The height. + * @param {number} [depth=1] - The depth. + */ + setSize(width, height, depth = 1) { + if (this.width !== width || this.height !== height || this.depth !== depth) { + this.width = width; + this.height = height; + this.depth = depth; + for (let i = 0, il = this.textures.length; i < il; i++) { + this.textures[i].image.width = width; + this.textures[i].image.height = height; + this.textures[i].image.depth = depth; + if (this.textures[i].isData3DTexture !== true) { + this.textures[i].isArrayTexture = this.textures[i].image.depth > 1; + } + } + this.dispose(); + } + this.viewport.set(0, 0, width, height); + this.scissor.set(0, 0, width, height); + } + /** + * Returns a new render target with copied values from this instance. + * + * @return {RenderTarget} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Copies the settings of the given render target. This is a structural copy so + * no resources are shared between render targets after the copy. That includes + * all MRT textures and the depth texture. + * + * @param {RenderTarget} source - The render target to copy. + * @return {RenderTarget} A reference to this instance. + */ + copy(source) { + this.width = source.width; + this.height = source.height; + this.depth = source.depth; + this.scissor.copy(source.scissor); + this.scissorTest = source.scissorTest; + this.viewport.copy(source.viewport); + this.textures.length = 0; + for (let i = 0, il = source.textures.length; i < il; i++) { + this.textures[i] = source.textures[i].clone(); + this.textures[i].isRenderTargetTexture = true; + this.textures[i].renderTarget = this; + const image = Object.assign({}, source.textures[i].image); + this.textures[i].source = new Source(image); + } + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.resolveDepthBuffer = source.resolveDepthBuffer; + this.resolveStencilBuffer = source.resolveStencilBuffer; + if (source.depthTexture !== null) this.depthTexture = source.depthTexture.clone(); + this.samples = source.samples; + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + * + * @fires RenderTarget#dispose + */ + dispose() { + this.dispatchEvent({ type: "dispose" }); + } +}; +var WebGLRenderTarget = class extends RenderTarget { + /** + * Constructs a new 3D render target. + * + * @param {number} [width=1] - The width of the render target. + * @param {number} [height=1] - The height of the render target. + * @param {RenderTarget~Options} [options] - The configuration object. + */ + constructor(width = 1, height = 1, options = {}) { + super(width, height, options); + this.isWebGLRenderTarget = true; + } +}; +var DataArrayTexture = class extends Texture { + /** + * Constructs a new data array texture. + * + * @param {?TypedArray} [data=null] - The buffer data. + * @param {number} [width=1] - The width of the texture. + * @param {number} [height=1] - The height of the texture. + * @param {number} [depth=1] - The depth of the texture. + */ + constructor(data = null, width = 1, height = 1, depth = 1) { + super(null); + this.isDataArrayTexture = true; + this.image = { data, width, height, depth }; + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + this.wrapR = ClampToEdgeWrapping; + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + this.layerUpdates = /* @__PURE__ */ new Set(); + } + /** + * Describes that a specific layer of the texture needs to be updated. + * Normally when {@link Texture#needsUpdate} is set to `true`, the + * entire data texture array is sent to the GPU. Marking specific + * layers will only transmit subsets of all mipmaps associated with a + * specific depth in the array which is often much more performant. + * + * @param {number} layerIndex - The layer index that should be updated. + */ + addLayerUpdate(layerIndex) { + this.layerUpdates.add(layerIndex); + } + /** + * Resets the layer updates registry. + */ + clearLayerUpdates() { + this.layerUpdates.clear(); + } +}; +var WebGLArrayRenderTarget = class extends WebGLRenderTarget { + /** + * Constructs a new array render target. + * + * @param {number} [width=1] - The width of the render target. + * @param {number} [height=1] - The height of the render target. + * @param {number} [depth=1] - The height of the render target. + * @param {RenderTarget~Options} [options] - The configuration object. + */ + constructor(width = 1, height = 1, depth = 1, options = {}) { + super(width, height, options); + this.isWebGLArrayRenderTarget = true; + this.depth = depth; + this.texture = new DataArrayTexture(null, width, height, depth); + this._setTextureOptions(options); + this.texture.isRenderTargetTexture = true; + } +}; +var Data3DTexture = class extends Texture { + /** + * Constructs a new data array texture. + * + * @param {?TypedArray} [data=null] - The buffer data. + * @param {number} [width=1] - The width of the texture. + * @param {number} [height=1] - The height of the texture. + * @param {number} [depth=1] - The depth of the texture. + */ + constructor(data = null, width = 1, height = 1, depth = 1) { + super(null); + this.isData3DTexture = true; + this.image = { data, width, height, depth }; + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + this.wrapR = ClampToEdgeWrapping; + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + } +}; +var WebGL3DRenderTarget = class extends WebGLRenderTarget { + /** + * Constructs a new 3D render target. + * + * @param {number} [width=1] - The width of the render target. + * @param {number} [height=1] - The height of the render target. + * @param {number} [depth=1] - The height of the render target. + * @param {RenderTarget~Options} [options] - The configuration object. + */ + constructor(width = 1, height = 1, depth = 1, options = {}) { + super(width, height, options); + this.isWebGL3DRenderTarget = true; + this.depth = depth; + this.texture = new Data3DTexture(null, width, height, depth); + this._setTextureOptions(options); + this.texture.isRenderTargetTexture = true; + } +}; +var Box3 = class { + /** + * Constructs a new bounding box. + * + * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box. + * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box. + */ + constructor(min = new Vector3(Infinity, Infinity, Infinity), max = new Vector3(-Infinity, -Infinity, -Infinity)) { + this.isBox3 = true; + this.min = min; + this.max = max; + } + /** + * Sets the lower and upper boundaries of this box. + * Please note that this method only copies the values from the given objects. + * + * @param {Vector3} min - The lower boundary of the box. + * @param {Vector3} max - The upper boundary of the box. + * @return {Box3} A reference to this bounding box. + */ + set(min, max) { + this.min.copy(min); + this.max.copy(max); + return this; + } + /** + * Sets the upper and lower bounds of this box so it encloses the position data + * in the given array. + * + * @param {Array} array - An array holding 3D position data. + * @return {Box3} A reference to this bounding box. + */ + setFromArray(array) { + this.makeEmpty(); + for (let i = 0, il = array.length; i < il; i += 3) { + this.expandByPoint(_vector$b.fromArray(array, i)); + } + return this; + } + /** + * Sets the upper and lower bounds of this box so it encloses the position data + * in the given buffer attribute. + * + * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data. + * @return {Box3} A reference to this bounding box. + */ + setFromBufferAttribute(attribute) { + this.makeEmpty(); + for (let i = 0, il = attribute.count; i < il; i++) { + this.expandByPoint(_vector$b.fromBufferAttribute(attribute, i)); + } + return this; + } + /** + * Sets the upper and lower bounds of this box so it encloses the position data + * in the given array. + * + * @param {Array} points - An array holding 3D position data as instances of {@link Vector3}. + * @return {Box3} A reference to this bounding box. + */ + setFromPoints(points) { + this.makeEmpty(); + for (let i = 0, il = points.length; i < il; i++) { + this.expandByPoint(points[i]); + } + return this; + } + /** + * Centers this box on the given center vector and sets this box's width, height and + * depth to the given size values. + * + * @param {Vector3} center - The center of the box. + * @param {Vector3} size - The x, y and z dimensions of the box. + * @return {Box3} A reference to this bounding box. + */ + setFromCenterAndSize(center, size) { + const halfSize = _vector$b.copy(size).multiplyScalar(0.5); + this.min.copy(center).sub(halfSize); + this.max.copy(center).add(halfSize); + return this; + } + /** + * Computes the world-axis-aligned bounding box for the given 3D object + * (including its children), accounting for the object's, and children's, + * world transforms. The function may result in a larger box than strictly necessary. + * + * @param {Object3D} object - The 3D object to compute the bounding box for. + * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest + * world-axis-aligned bounding box at the expense of more computation. + * @return {Box3} A reference to this bounding box. + */ + setFromObject(object, precise = false) { + this.makeEmpty(); + return this.expandByObject(object, precise); + } + /** + * Returns a new box with copied values from this instance. + * + * @return {Box3} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Copies the values of the given box to this instance. + * + * @param {Box3} box - The box to copy. + * @return {Box3} A reference to this bounding box. + */ + copy(box) { + this.min.copy(box.min); + this.max.copy(box.max); + return this; + } + /** + * Makes this box empty which means in encloses a zero space in 3D. + * + * @return {Box3} A reference to this bounding box. + */ + makeEmpty() { + this.min.x = this.min.y = this.min.z = Infinity; + this.max.x = this.max.y = this.max.z = -Infinity; + return this; + } + /** + * Returns true if this box includes zero points within its bounds. + * Note that a box with equal lower and upper bounds still includes one + * point, the one both bounds share. + * + * @return {boolean} Whether this box is empty or not. + */ + isEmpty() { + return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z; + } + /** + * Returns the center point of this box. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The center point. + */ + getCenter(target) { + return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); + } + /** + * Returns the dimensions of this box. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The size. + */ + getSize(target) { + return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min); + } + /** + * Expands the boundaries of this box to include the given point. + * + * @param {Vector3} point - The point that should be included by the bounding box. + * @return {Box3} A reference to this bounding box. + */ + expandByPoint(point) { + this.min.min(point); + this.max.max(point); + return this; + } + /** + * Expands this box equilaterally by the given vector. The width of this + * box will be expanded by the x component of the vector in both + * directions. The height of this box will be expanded by the y component of + * the vector in both directions. The depth of this box will be + * expanded by the z component of the vector in both directions. + * + * @param {Vector3} vector - The vector that should expand the bounding box. + * @return {Box3} A reference to this bounding box. + */ + expandByVector(vector) { + this.min.sub(vector); + this.max.add(vector); + return this; + } + /** + * Expands each dimension of the box by the given scalar. If negative, the + * dimensions of the box will be contracted. + * + * @param {number} scalar - The scalar value that should expand the bounding box. + * @return {Box3} A reference to this bounding box. + */ + expandByScalar(scalar) { + this.min.addScalar(-scalar); + this.max.addScalar(scalar); + return this; + } + /** + * Expands the boundaries of this box to include the given 3D object and + * its children, accounting for the object's, and children's, world + * transforms. The function may result in a larger box than strictly + * necessary (unless the precise parameter is set to true). + * + * @param {Object3D} object - The 3D object that should expand the bounding box. + * @param {boolean} precise - If set to `true`, the method expands the bounding box + * as little as necessary at the expense of more computation. + * @return {Box3} A reference to this bounding box. + */ + expandByObject(object, precise = false) { + object.updateWorldMatrix(false, false); + const geometry = object.geometry; + if (geometry !== void 0) { + const positionAttribute = geometry.getAttribute("position"); + if (precise === true && positionAttribute !== void 0 && object.isInstancedMesh !== true) { + for (let i = 0, l = positionAttribute.count; i < l; i++) { + if (object.isMesh === true) { + object.getVertexPosition(i, _vector$b); + } else { + _vector$b.fromBufferAttribute(positionAttribute, i); + } + _vector$b.applyMatrix4(object.matrixWorld); + this.expandByPoint(_vector$b); + } + } else { + if (object.boundingBox !== void 0) { + if (object.boundingBox === null) { + object.computeBoundingBox(); + } + _box$4.copy(object.boundingBox); + } else { + if (geometry.boundingBox === null) { + geometry.computeBoundingBox(); + } + _box$4.copy(geometry.boundingBox); + } + _box$4.applyMatrix4(object.matrixWorld); + this.union(_box$4); + } + } + const children = object.children; + for (let i = 0, l = children.length; i < l; i++) { + this.expandByObject(children[i], precise); + } + return this; + } + /** + * Returns `true` if the given point lies within or on the boundaries of this box. + * + * @param {Vector3} point - The point to test. + * @return {boolean} Whether the bounding box contains the given point or not. + */ + containsPoint(point) { + return point.x >= this.min.x && point.x <= this.max.x && point.y >= this.min.y && point.y <= this.max.y && point.z >= this.min.z && point.z <= this.max.z; + } + /** + * Returns `true` if this bounding box includes the entirety of the given bounding box. + * If this box and the given one are identical, this function also returns `true`. + * + * @param {Box3} box - The bounding box to test. + * @return {boolean} Whether the bounding box contains the given bounding box or not. + */ + containsBox(box) { + return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y && this.min.z <= box.min.z && box.max.z <= this.max.z; + } + /** + * Returns a point as a proportion of this box's width, height and depth. + * + * @param {Vector3} point - A point in 3D space. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} A point as a proportion of this box's width, height and depth. + */ + getParameter(point, target) { + return target.set( + (point.x - this.min.x) / (this.max.x - this.min.x), + (point.y - this.min.y) / (this.max.y - this.min.y), + (point.z - this.min.z) / (this.max.z - this.min.z) + ); + } + /** + * Returns `true` if the given bounding box intersects with this bounding box. + * + * @param {Box3} box - The bounding box to test. + * @return {boolean} Whether the given bounding box intersects with this bounding box. + */ + intersectsBox(box) { + return box.max.x >= this.min.x && box.min.x <= this.max.x && box.max.y >= this.min.y && box.min.y <= this.max.y && box.max.z >= this.min.z && box.min.z <= this.max.z; + } + /** + * Returns `true` if the given bounding sphere intersects with this bounding box. + * + * @param {Sphere} sphere - The bounding sphere to test. + * @return {boolean} Whether the given bounding sphere intersects with this bounding box. + */ + intersectsSphere(sphere) { + this.clampPoint(sphere.center, _vector$b); + return _vector$b.distanceToSquared(sphere.center) <= sphere.radius * sphere.radius; + } + /** + * Returns `true` if the given plane intersects with this bounding box. + * + * @param {Plane} plane - The plane to test. + * @return {boolean} Whether the given plane intersects with this bounding box. + */ + intersectsPlane(plane) { + let min, max; + if (plane.normal.x > 0) { + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + } else { + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + } + if (plane.normal.y > 0) { + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + } else { + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + } + if (plane.normal.z > 0) { + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + } else { + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + } + return min <= -plane.constant && max >= -plane.constant; + } + /** + * Returns `true` if the given triangle intersects with this bounding box. + * + * @param {Triangle} triangle - The triangle to test. + * @return {boolean} Whether the given triangle intersects with this bounding box. + */ + intersectsTriangle(triangle) { + if (this.isEmpty()) { + return false; + } + this.getCenter(_center); + _extents.subVectors(this.max, _center); + _v0$2.subVectors(triangle.a, _center); + _v1$7.subVectors(triangle.b, _center); + _v2$4.subVectors(triangle.c, _center); + _f0.subVectors(_v1$7, _v0$2); + _f1.subVectors(_v2$4, _v1$7); + _f2.subVectors(_v0$2, _v2$4); + let axes = [ + 0, + -_f0.z, + _f0.y, + 0, + -_f1.z, + _f1.y, + 0, + -_f2.z, + _f2.y, + _f0.z, + 0, + -_f0.x, + _f1.z, + 0, + -_f1.x, + _f2.z, + 0, + -_f2.x, + -_f0.y, + _f0.x, + 0, + -_f1.y, + _f1.x, + 0, + -_f2.y, + _f2.x, + 0 + ]; + if (!satForAxes(axes, _v0$2, _v1$7, _v2$4, _extents)) { + return false; + } + axes = [1, 0, 0, 0, 1, 0, 0, 0, 1]; + if (!satForAxes(axes, _v0$2, _v1$7, _v2$4, _extents)) { + return false; + } + _triangleNormal.crossVectors(_f0, _f1); + axes = [_triangleNormal.x, _triangleNormal.y, _triangleNormal.z]; + return satForAxes(axes, _v0$2, _v1$7, _v2$4, _extents); + } + /** + * Clamps the given point within the bounds of this box. + * + * @param {Vector3} point - The point to clamp. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The clamped point. + */ + clampPoint(point, target) { + return target.copy(point).clamp(this.min, this.max); + } + /** + * Returns the euclidean distance from any edge of this box to the specified point. If + * the given point lies inside of this box, the distance will be `0`. + * + * @param {Vector3} point - The point to compute the distance to. + * @return {number} The euclidean distance. + */ + distanceToPoint(point) { + return this.clampPoint(point, _vector$b).distanceTo(point); + } + /** + * Returns a bounding sphere that encloses this bounding box. + * + * @param {Sphere} target - The target sphere that is used to store the method's result. + * @return {Sphere} The bounding sphere that encloses this bounding box. + */ + getBoundingSphere(target) { + if (this.isEmpty()) { + target.makeEmpty(); + } else { + this.getCenter(target.center); + target.radius = this.getSize(_vector$b).length() * 0.5; + } + return target; + } + /** + * Computes the intersection of this bounding box and the given one, setting the upper + * bound of this box to the lesser of the two boxes' upper bounds and the + * lower bound of this box to the greater of the two boxes' lower bounds. If + * there's no overlap, makes this box empty. + * + * @param {Box3} box - The bounding box to intersect with. + * @return {Box3} A reference to this bounding box. + */ + intersect(box) { + this.min.max(box.min); + this.max.min(box.max); + if (this.isEmpty()) this.makeEmpty(); + return this; + } + /** + * Computes the union of this box and another and the given one, setting the upper + * bound of this box to the greater of the two boxes' upper bounds and the + * lower bound of this box to the lesser of the two boxes' lower bounds. + * + * @param {Box3} box - The bounding box that will be unioned with this instance. + * @return {Box3} A reference to this bounding box. + */ + union(box) { + this.min.min(box.min); + this.max.max(box.max); + return this; + } + /** + * Transforms this bounding box by the given 4x4 transformation matrix. + * + * @param {Matrix4} matrix - The transformation matrix. + * @return {Box3} A reference to this bounding box. + */ + applyMatrix4(matrix) { + if (this.isEmpty()) return this; + _points[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(matrix); + _points[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(matrix); + _points[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(matrix); + _points[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(matrix); + _points[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(matrix); + _points[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(matrix); + _points[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(matrix); + _points[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(matrix); + this.setFromPoints(_points); + return this; + } + /** + * Adds the given offset to both the upper and lower bounds of this bounding box, + * effectively moving it in 3D space. + * + * @param {Vector3} offset - The offset that should be used to translate the bounding box. + * @return {Box3} A reference to this bounding box. + */ + translate(offset) { + this.min.add(offset); + this.max.add(offset); + return this; + } + /** + * Returns `true` if this bounding box is equal with the given one. + * + * @param {Box3} box - The box to test for equality. + * @return {boolean} Whether this bounding box is equal with the given one. + */ + equals(box) { + return box.min.equals(this.min) && box.max.equals(this.max); + } + /** + * Returns a serialized structure of the bounding box. + * + * @return {Object} Serialized structure with fields representing the object state. + */ + toJSON() { + return { + min: this.min.toArray(), + max: this.max.toArray() + }; + } + /** + * Returns a serialized structure of the bounding box. + * + * @param {Object} json - The serialized json to set the box from. + * @return {Box3} A reference to this bounding box. + */ + fromJSON(json) { + this.min.fromArray(json.min); + this.max.fromArray(json.max); + return this; + } +}; +var _points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() +]; +var _vector$b = new Vector3(); +var _box$4 = new Box3(); +var _v0$2 = new Vector3(); +var _v1$7 = new Vector3(); +var _v2$4 = new Vector3(); +var _f0 = new Vector3(); +var _f1 = new Vector3(); +var _f2 = new Vector3(); +var _center = new Vector3(); +var _extents = new Vector3(); +var _triangleNormal = new Vector3(); +var _testAxis = new Vector3(); +function satForAxes(axes, v0, v1, v2, extents) { + for (let i = 0, j = axes.length - 3; i <= j; i += 3) { + _testAxis.fromArray(axes, i); + const r = extents.x * Math.abs(_testAxis.x) + extents.y * Math.abs(_testAxis.y) + extents.z * Math.abs(_testAxis.z); + const p0 = v0.dot(_testAxis); + const p1 = v1.dot(_testAxis); + const p2 = v2.dot(_testAxis); + if (Math.max(-Math.max(p0, p1, p2), Math.min(p0, p1, p2)) > r) { + return false; + } + } + return true; +} +var _box$3 = new Box3(); +var _v1$6 = new Vector3(); +var _v2$3 = new Vector3(); +var Sphere = class { + /** + * Constructs a new sphere. + * + * @param {Vector3} [center=(0,0,0)] - The center of the sphere + * @param {number} [radius=-1] - The radius of the sphere. + */ + constructor(center = new Vector3(), radius = -1) { + this.isSphere = true; + this.center = center; + this.radius = radius; + } + /** + * Sets the sphere's components by copying the given values. + * + * @param {Vector3} center - The center. + * @param {number} radius - The radius. + * @return {Sphere} A reference to this sphere. + */ + set(center, radius) { + this.center.copy(center); + this.radius = radius; + return this; + } + /** + * Computes the minimum bounding sphere for list of points. + * If the optional center point is given, it is used as the sphere's + * center. Otherwise, the center of the axis-aligned bounding box + * encompassing the points is calculated. + * + * @param {Array} points - A list of points in 3D space. + * @param {Vector3} [optionalCenter] - The center of the sphere. + * @return {Sphere} A reference to this sphere. + */ + setFromPoints(points, optionalCenter) { + const center = this.center; + if (optionalCenter !== void 0) { + center.copy(optionalCenter); + } else { + _box$3.setFromPoints(points).getCenter(center); + } + let maxRadiusSq = 0; + for (let i = 0, il = points.length; i < il; i++) { + maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(points[i])); + } + this.radius = Math.sqrt(maxRadiusSq); + return this; + } + /** + * Copies the values of the given sphere to this instance. + * + * @param {Sphere} sphere - The sphere to copy. + * @return {Sphere} A reference to this sphere. + */ + copy(sphere) { + this.center.copy(sphere.center); + this.radius = sphere.radius; + return this; + } + /** + * Returns `true` if the sphere is empty (the radius set to a negative number). + * + * Spheres with a radius of `0` contain only their center point and are not + * considered to be empty. + * + * @return {boolean} Whether this sphere is empty or not. + */ + isEmpty() { + return this.radius < 0; + } + /** + * Makes this sphere empty which means in encloses a zero space in 3D. + * + * @return {Sphere} A reference to this sphere. + */ + makeEmpty() { + this.center.set(0, 0, 0); + this.radius = -1; + return this; + } + /** + * Returns `true` if this sphere contains the given point inclusive of + * the surface of the sphere. + * + * @param {Vector3} point - The point to check. + * @return {boolean} Whether this sphere contains the given point or not. + */ + containsPoint(point) { + return point.distanceToSquared(this.center) <= this.radius * this.radius; + } + /** + * Returns the closest distance from the boundary of the sphere to the + * given point. If the sphere contains the point, the distance will + * be negative. + * + * @param {Vector3} point - The point to compute the distance to. + * @return {number} The distance to the point. + */ + distanceToPoint(point) { + return point.distanceTo(this.center) - this.radius; + } + /** + * Returns `true` if this sphere intersects with the given one. + * + * @param {Sphere} sphere - The sphere to test. + * @return {boolean} Whether this sphere intersects with the given one or not. + */ + intersectsSphere(sphere) { + const radiusSum = this.radius + sphere.radius; + return sphere.center.distanceToSquared(this.center) <= radiusSum * radiusSum; + } + /** + * Returns `true` if this sphere intersects with the given box. + * + * @param {Box3} box - The box to test. + * @return {boolean} Whether this sphere intersects with the given box or not. + */ + intersectsBox(box) { + return box.intersectsSphere(this); + } + /** + * Returns `true` if this sphere intersects with the given plane. + * + * @param {Plane} plane - The plane to test. + * @return {boolean} Whether this sphere intersects with the given plane or not. + */ + intersectsPlane(plane) { + return Math.abs(plane.distanceToPoint(this.center)) <= this.radius; + } + /** + * Clamps a point within the sphere. If the point is outside the sphere, it + * will clamp it to the closest point on the edge of the sphere. Points + * already inside the sphere will not be affected. + * + * @param {Vector3} point - The plane to clamp. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The clamped point. + */ + clampPoint(point, target) { + const deltaLengthSq = this.center.distanceToSquared(point); + target.copy(point); + if (deltaLengthSq > this.radius * this.radius) { + target.sub(this.center).normalize(); + target.multiplyScalar(this.radius).add(this.center); + } + return target; + } + /** + * Returns a bounding box that encloses this sphere. + * + * @param {Box3} target - The target box that is used to store the method's result. + * @return {Box3} The bounding box that encloses this sphere. + */ + getBoundingBox(target) { + if (this.isEmpty()) { + target.makeEmpty(); + return target; + } + target.set(this.center, this.center); + target.expandByScalar(this.radius); + return target; + } + /** + * Transforms this sphere with the given 4x4 transformation matrix. + * + * @param {Matrix4} matrix - The transformation matrix. + * @return {Sphere} A reference to this sphere. + */ + applyMatrix4(matrix) { + this.center.applyMatrix4(matrix); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + return this; + } + /** + * Translates the sphere's center by the given offset. + * + * @param {Vector3} offset - The offset. + * @return {Sphere} A reference to this sphere. + */ + translate(offset) { + this.center.add(offset); + return this; + } + /** + * Expands the boundaries of this sphere to include the given point. + * + * @param {Vector3} point - The point to include. + * @return {Sphere} A reference to this sphere. + */ + expandByPoint(point) { + if (this.isEmpty()) { + this.center.copy(point); + this.radius = 0; + return this; + } + _v1$6.subVectors(point, this.center); + const lengthSq = _v1$6.lengthSq(); + if (lengthSq > this.radius * this.radius) { + const length = Math.sqrt(lengthSq); + const delta = (length - this.radius) * 0.5; + this.center.addScaledVector(_v1$6, delta / length); + this.radius += delta; + } + return this; + } + /** + * Expands this sphere to enclose both the original sphere and the given sphere. + * + * @param {Sphere} sphere - The sphere to include. + * @return {Sphere} A reference to this sphere. + */ + union(sphere) { + if (sphere.isEmpty()) { + return this; + } + if (this.isEmpty()) { + this.copy(sphere); + return this; + } + if (this.center.equals(sphere.center) === true) { + this.radius = Math.max(this.radius, sphere.radius); + } else { + _v2$3.subVectors(sphere.center, this.center).setLength(sphere.radius); + this.expandByPoint(_v1$6.copy(sphere.center).add(_v2$3)); + this.expandByPoint(_v1$6.copy(sphere.center).sub(_v2$3)); + } + return this; + } + /** + * Returns `true` if this sphere is equal with the given one. + * + * @param {Sphere} sphere - The sphere to test for equality. + * @return {boolean} Whether this bounding sphere is equal with the given one. + */ + equals(sphere) { + return sphere.center.equals(this.center) && sphere.radius === this.radius; + } + /** + * Returns a new sphere with copied values from this instance. + * + * @return {Sphere} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Returns a serialized structure of the bounding sphere. + * + * @return {Object} Serialized structure with fields representing the object state. + */ + toJSON() { + return { + radius: this.radius, + center: this.center.toArray() + }; + } + /** + * Returns a serialized structure of the bounding sphere. + * + * @param {Object} json - The serialized json to set the sphere from. + * @return {Sphere} A reference to this bounding sphere. + */ + fromJSON(json) { + this.radius = json.radius; + this.center.fromArray(json.center); + return this; + } +}; +var _vector$a = new Vector3(); +var _segCenter = new Vector3(); +var _segDir = new Vector3(); +var _diff = new Vector3(); +var _edge1 = new Vector3(); +var _edge2 = new Vector3(); +var _normal$1 = new Vector3(); +var Ray = class { + /** + * Constructs a new ray. + * + * @param {Vector3} [origin=(0,0,0)] - The origin of the ray. + * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray. + */ + constructor(origin = new Vector3(), direction = new Vector3(0, 0, -1)) { + this.origin = origin; + this.direction = direction; + } + /** + * Sets the ray's components by copying the given values. + * + * @param {Vector3} origin - The origin. + * @param {Vector3} direction - The direction. + * @return {Ray} A reference to this ray. + */ + set(origin, direction) { + this.origin.copy(origin); + this.direction.copy(direction); + return this; + } + /** + * Copies the values of the given ray to this instance. + * + * @param {Ray} ray - The ray to copy. + * @return {Ray} A reference to this ray. + */ + copy(ray) { + this.origin.copy(ray.origin); + this.direction.copy(ray.direction); + return this; + } + /** + * Returns a vector that is located at a given distance along this ray. + * + * @param {number} t - The distance along the ray to retrieve a position for. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} A position on the ray. + */ + at(t, target) { + return target.copy(this.origin).addScaledVector(this.direction, t); + } + /** + * Adjusts the direction of the ray to point at the given vector in world space. + * + * @param {Vector3} v - The target position. + * @return {Ray} A reference to this ray. + */ + lookAt(v) { + this.direction.copy(v).sub(this.origin).normalize(); + return this; + } + /** + * Shift the origin of this ray along its direction by the given distance. + * + * @param {number} t - The distance along the ray to interpolate. + * @return {Ray} A reference to this ray. + */ + recast(t) { + this.origin.copy(this.at(t, _vector$a)); + return this; + } + /** + * Returns the point along this ray that is closest to the given point. + * + * @param {Vector3} point - A point in 3D space to get the closet location on the ray for. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The closest point on this ray. + */ + closestPointToPoint(point, target) { + target.subVectors(point, this.origin); + const directionDistance = target.dot(this.direction); + if (directionDistance < 0) { + return target.copy(this.origin); + } + return target.copy(this.origin).addScaledVector(this.direction, directionDistance); + } + /** + * Returns the distance of the closest approach between this ray and the given point. + * + * @param {Vector3} point - A point in 3D space to compute the distance to. + * @return {number} The distance. + */ + distanceToPoint(point) { + return Math.sqrt(this.distanceSqToPoint(point)); + } + /** + * Returns the squared distance of the closest approach between this ray and the given point. + * + * @param {Vector3} point - A point in 3D space to compute the distance to. + * @return {number} The squared distance. + */ + distanceSqToPoint(point) { + const directionDistance = _vector$a.subVectors(point, this.origin).dot(this.direction); + if (directionDistance < 0) { + return this.origin.distanceToSquared(point); + } + _vector$a.copy(this.origin).addScaledVector(this.direction, directionDistance); + return _vector$a.distanceToSquared(point); + } + /** + * Returns the squared distance between this ray and the given line segment. + * + * @param {Vector3} v0 - The start point of the line segment. + * @param {Vector3} v1 - The end point of the line segment. + * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment. + * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray. + * @return {number} The squared distance. + */ + distanceSqToSegment(v0, v1, optionalPointOnRay, optionalPointOnSegment) { + _segCenter.copy(v0).add(v1).multiplyScalar(0.5); + _segDir.copy(v1).sub(v0).normalize(); + _diff.copy(this.origin).sub(_segCenter); + const segExtent = v0.distanceTo(v1) * 0.5; + const a01 = -this.direction.dot(_segDir); + const b0 = _diff.dot(this.direction); + const b1 = -_diff.dot(_segDir); + const c = _diff.lengthSq(); + const det = Math.abs(1 - a01 * a01); + let s0, s1, sqrDist, extDet; + if (det > 0) { + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + if (s0 >= 0) { + if (s1 >= -extDet) { + if (s1 <= extDet) { + const invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * (s0 + a01 * s1 + 2 * b0) + s1 * (a01 * s0 + s1 + 2 * b1) + c; + } else { + s1 = segExtent; + s0 = Math.max(0, -(a01 * s1 + b0)); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; + } + } else { + s1 = -segExtent; + s0 = Math.max(0, -(a01 * s1 + b0)); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; + } + } else { + if (s1 <= -extDet) { + s0 = Math.max(0, -(-a01 * segExtent + b0)); + s1 = s0 > 0 ? -segExtent : Math.min(Math.max(-segExtent, -b1), segExtent); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; + } else if (s1 <= extDet) { + s0 = 0; + s1 = Math.min(Math.max(-segExtent, -b1), segExtent); + sqrDist = s1 * (s1 + 2 * b1) + c; + } else { + s0 = Math.max(0, -(a01 * segExtent + b0)); + s1 = s0 > 0 ? segExtent : Math.min(Math.max(-segExtent, -b1), segExtent); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; + } + } + } else { + s1 = a01 > 0 ? -segExtent : segExtent; + s0 = Math.max(0, -(a01 * s1 + b0)); + sqrDist = -s0 * s0 + s1 * (s1 + 2 * b1) + c; + } + if (optionalPointOnRay) { + optionalPointOnRay.copy(this.origin).addScaledVector(this.direction, s0); + } + if (optionalPointOnSegment) { + optionalPointOnSegment.copy(_segCenter).addScaledVector(_segDir, s1); + } + return sqrDist; + } + /** + * Intersects this ray with the given sphere, returning the intersection + * point or `null` if there is no intersection. + * + * @param {Sphere} sphere - The sphere to intersect. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectSphere(sphere, target) { + _vector$a.subVectors(sphere.center, this.origin); + const tca = _vector$a.dot(this.direction); + const d2 = _vector$a.dot(_vector$a) - tca * tca; + const radius2 = sphere.radius * sphere.radius; + if (d2 > radius2) return null; + const thc = Math.sqrt(radius2 - d2); + const t0 = tca - thc; + const t1 = tca + thc; + if (t1 < 0) return null; + if (t0 < 0) return this.at(t1, target); + return this.at(t0, target); + } + /** + * Returns `true` if this ray intersects with the given sphere. + * + * @param {Sphere} sphere - The sphere to intersect. + * @return {boolean} Whether this ray intersects with the given sphere or not. + */ + intersectsSphere(sphere) { + if (sphere.radius < 0) return false; + return this.distanceSqToPoint(sphere.center) <= sphere.radius * sphere.radius; + } + /** + * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray + * does not intersect with the plane. + * + * @param {Plane} plane - The plane to compute the distance to. + * @return {?number} Whether this ray intersects with the given sphere or not. + */ + distanceToPlane(plane) { + const denominator = plane.normal.dot(this.direction); + if (denominator === 0) { + if (plane.distanceToPoint(this.origin) === 0) { + return 0; + } + return null; + } + const t = -(this.origin.dot(plane.normal) + plane.constant) / denominator; + return t >= 0 ? t : null; + } + /** + * Intersects this ray with the given plane, returning the intersection + * point or `null` if there is no intersection. + * + * @param {Plane} plane - The plane to intersect. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectPlane(plane, target) { + const t = this.distanceToPlane(plane); + if (t === null) { + return null; + } + return this.at(t, target); + } + /** + * Returns `true` if this ray intersects with the given plane. + * + * @param {Plane} plane - The plane to intersect. + * @return {boolean} Whether this ray intersects with the given plane or not. + */ + intersectsPlane(plane) { + const distToPoint = plane.distanceToPoint(this.origin); + if (distToPoint === 0) { + return true; + } + const denominator = plane.normal.dot(this.direction); + if (denominator * distToPoint < 0) { + return true; + } + return false; + } + /** + * Intersects this ray with the given bounding box, returning the intersection + * point or `null` if there is no intersection. + * + * @param {Box3} box - The box to intersect. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectBox(box, target) { + let tmin, tmax, tymin, tymax, tzmin, tzmax; + const invdirx = 1 / this.direction.x, invdiry = 1 / this.direction.y, invdirz = 1 / this.direction.z; + const origin = this.origin; + if (invdirx >= 0) { + tmin = (box.min.x - origin.x) * invdirx; + tmax = (box.max.x - origin.x) * invdirx; + } else { + tmin = (box.max.x - origin.x) * invdirx; + tmax = (box.min.x - origin.x) * invdirx; + } + if (invdiry >= 0) { + tymin = (box.min.y - origin.y) * invdiry; + tymax = (box.max.y - origin.y) * invdiry; + } else { + tymin = (box.max.y - origin.y) * invdiry; + tymax = (box.min.y - origin.y) * invdiry; + } + if (tmin > tymax || tymin > tmax) return null; + if (tymin > tmin || isNaN(tmin)) tmin = tymin; + if (tymax < tmax || isNaN(tmax)) tmax = tymax; + if (invdirz >= 0) { + tzmin = (box.min.z - origin.z) * invdirz; + tzmax = (box.max.z - origin.z) * invdirz; + } else { + tzmin = (box.max.z - origin.z) * invdirz; + tzmax = (box.min.z - origin.z) * invdirz; + } + if (tmin > tzmax || tzmin > tmax) return null; + if (tzmin > tmin || tmin !== tmin) tmin = tzmin; + if (tzmax < tmax || tmax !== tmax) tmax = tzmax; + if (tmax < 0) return null; + return this.at(tmin >= 0 ? tmin : tmax, target); + } + /** + * Returns `true` if this ray intersects with the given box. + * + * @param {Box3} box - The box to intersect. + * @return {boolean} Whether this ray intersects with the given box or not. + */ + intersectsBox(box) { + return this.intersectBox(box, _vector$a) !== null; + } + /** + * Intersects this ray with the given triangle, returning the intersection + * point or `null` if there is no intersection. + * + * @param {Vector3} a - The first vertex of the triangle. + * @param {Vector3} b - The second vertex of the triangle. + * @param {Vector3} c - The third vertex of the triangle. + * @param {boolean} backfaceCulling - Whether to use backface culling or not. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectTriangle(a, b, c, backfaceCulling, target) { + _edge1.subVectors(b, a); + _edge2.subVectors(c, a); + _normal$1.crossVectors(_edge1, _edge2); + let DdN = this.direction.dot(_normal$1); + let sign2; + if (DdN > 0) { + if (backfaceCulling) return null; + sign2 = 1; + } else if (DdN < 0) { + sign2 = -1; + DdN = -DdN; + } else { + return null; + } + _diff.subVectors(this.origin, a); + const DdQxE2 = sign2 * this.direction.dot(_edge2.crossVectors(_diff, _edge2)); + if (DdQxE2 < 0) { + return null; + } + const DdE1xQ = sign2 * this.direction.dot(_edge1.cross(_diff)); + if (DdE1xQ < 0) { + return null; + } + if (DdQxE2 + DdE1xQ > DdN) { + return null; + } + const QdN = -sign2 * _diff.dot(_normal$1); + if (QdN < 0) { + return null; + } + return this.at(QdN / DdN, target); + } + /** + * Transforms this ray with the given 4x4 transformation matrix. + * + * @param {Matrix4} matrix4 - The transformation matrix. + * @return {Ray} A reference to this ray. + */ + applyMatrix4(matrix4) { + this.origin.applyMatrix4(matrix4); + this.direction.transformDirection(matrix4); + return this; + } + /** + * Returns `true` if this ray is equal with the given one. + * + * @param {Ray} ray - The ray to test for equality. + * @return {boolean} Whether this ray is equal with the given one. + */ + equals(ray) { + return ray.origin.equals(this.origin) && ray.direction.equals(this.direction); + } + /** + * Returns a new ray with copied values from this instance. + * + * @return {Ray} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } +}; +var Matrix4 = class _Matrix4 { + /** + * Constructs a new 4x4 matrix. The arguments are supposed to be + * in row-major order. If no arguments are provided, the constructor + * initializes the matrix as an identity matrix. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n13] - 1-3 matrix element. + * @param {number} [n14] - 1-4 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + * @param {number} [n23] - 2-3 matrix element. + * @param {number} [n24] - 2-4 matrix element. + * @param {number} [n31] - 3-1 matrix element. + * @param {number} [n32] - 3-2 matrix element. + * @param {number} [n33] - 3-3 matrix element. + * @param {number} [n34] - 3-4 matrix element. + * @param {number} [n41] - 4-1 matrix element. + * @param {number} [n42] - 4-2 matrix element. + * @param {number} [n43] - 4-3 matrix element. + * @param {number} [n44] - 4-4 matrix element. + */ + constructor(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { + _Matrix4.prototype.isMatrix4 = true; + this.elements = [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ]; + if (n11 !== void 0) { + this.set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44); + } + } + /** + * Sets the elements of the matrix.The arguments are supposed to be + * in row-major order. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n13] - 1-3 matrix element. + * @param {number} [n14] - 1-4 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + * @param {number} [n23] - 2-3 matrix element. + * @param {number} [n24] - 2-4 matrix element. + * @param {number} [n31] - 3-1 matrix element. + * @param {number} [n32] - 3-2 matrix element. + * @param {number} [n33] - 3-3 matrix element. + * @param {number} [n34] - 3-4 matrix element. + * @param {number} [n41] - 4-1 matrix element. + * @param {number} [n42] - 4-2 matrix element. + * @param {number} [n43] - 4-3 matrix element. + * @param {number} [n44] - 4-4 matrix element. + * @return {Matrix4} A reference to this matrix. + */ + set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) { + const te = this.elements; + te[0] = n11; + te[4] = n12; + te[8] = n13; + te[12] = n14; + te[1] = n21; + te[5] = n22; + te[9] = n23; + te[13] = n24; + te[2] = n31; + te[6] = n32; + te[10] = n33; + te[14] = n34; + te[3] = n41; + te[7] = n42; + te[11] = n43; + te[15] = n44; + return this; + } + /** + * Sets this matrix to the 4x4 identity matrix. + * + * @return {Matrix4} A reference to this matrix. + */ + identity() { + this.set( + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Returns a matrix with copied values from this instance. + * + * @return {Matrix4} A clone of this instance. + */ + clone() { + return new _Matrix4().fromArray(this.elements); + } + /** + * Copies the values of the given matrix to this instance. + * + * @param {Matrix4} m - The matrix to copy. + * @return {Matrix4} A reference to this matrix. + */ + copy(m) { + const te = this.elements; + const me = m.elements; + te[0] = me[0]; + te[1] = me[1]; + te[2] = me[2]; + te[3] = me[3]; + te[4] = me[4]; + te[5] = me[5]; + te[6] = me[6]; + te[7] = me[7]; + te[8] = me[8]; + te[9] = me[9]; + te[10] = me[10]; + te[11] = me[11]; + te[12] = me[12]; + te[13] = me[13]; + te[14] = me[14]; + te[15] = me[15]; + return this; + } + /** + * Copies the translation component of the given matrix + * into this matrix's translation component. + * + * @param {Matrix4} m - The matrix to copy the translation component. + * @return {Matrix4} A reference to this matrix. + */ + copyPosition(m) { + const te = this.elements, me = m.elements; + te[12] = me[12]; + te[13] = me[13]; + te[14] = me[14]; + return this; + } + /** + * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix. + * + * @param {Matrix3} m - The 3x3 matrix. + * @return {Matrix4} A reference to this matrix. + */ + setFromMatrix3(m) { + const me = m.elements; + this.set( + me[0], + me[3], + me[6], + 0, + me[1], + me[4], + me[7], + 0, + me[2], + me[5], + me[8], + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Extracts the basis of this matrix into the three axis vectors provided. + * + * @param {Vector3} xAxis - The basis's x axis. + * @param {Vector3} yAxis - The basis's y axis. + * @param {Vector3} zAxis - The basis's z axis. + * @return {Matrix4} A reference to this matrix. + */ + extractBasis(xAxis, yAxis, zAxis) { + if (this.determinant() === 0) { + xAxis.set(1, 0, 0); + yAxis.set(0, 1, 0); + zAxis.set(0, 0, 1); + return this; + } + xAxis.setFromMatrixColumn(this, 0); + yAxis.setFromMatrixColumn(this, 1); + zAxis.setFromMatrixColumn(this, 2); + return this; + } + /** + * Sets the given basis vectors to this matrix. + * + * @param {Vector3} xAxis - The basis's x axis. + * @param {Vector3} yAxis - The basis's y axis. + * @param {Vector3} zAxis - The basis's z axis. + * @return {Matrix4} A reference to this matrix. + */ + makeBasis(xAxis, yAxis, zAxis) { + this.set( + xAxis.x, + yAxis.x, + zAxis.x, + 0, + xAxis.y, + yAxis.y, + zAxis.y, + 0, + xAxis.z, + yAxis.z, + zAxis.z, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Extracts the rotation component of the given matrix + * into this matrix's rotation component. + * + * Note: This method does not support reflection matrices. + * + * @param {Matrix4} m - The matrix. + * @return {Matrix4} A reference to this matrix. + */ + extractRotation(m) { + if (m.determinant() === 0) { + return this.identity(); + } + const te = this.elements; + const me = m.elements; + const scaleX = 1 / _v1$5.setFromMatrixColumn(m, 0).length(); + const scaleY = 1 / _v1$5.setFromMatrixColumn(m, 1).length(); + const scaleZ = 1 / _v1$5.setFromMatrixColumn(m, 2).length(); + te[0] = me[0] * scaleX; + te[1] = me[1] * scaleX; + te[2] = me[2] * scaleX; + te[3] = 0; + te[4] = me[4] * scaleY; + te[5] = me[5] * scaleY; + te[6] = me[6] * scaleY; + te[7] = 0; + te[8] = me[8] * scaleZ; + te[9] = me[9] * scaleZ; + te[10] = me[10] * scaleZ; + te[11] = 0; + te[12] = 0; + te[13] = 0; + te[14] = 0; + te[15] = 1; + return this; + } + /** + * Sets the rotation component (the upper left 3x3 matrix) of this matrix to + * the rotation specified by the given Euler angles. The rest of + * the matrix is set to the identity. Depending on the {@link Euler#order}, + * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix) + * for a complete list. + * + * @param {Euler} euler - The Euler angles. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationFromEuler(euler) { + const te = this.elements; + const x = euler.x, y = euler.y, z = euler.z; + const a = Math.cos(x), b = Math.sin(x); + const c = Math.cos(y), d = Math.sin(y); + const e = Math.cos(z), f = Math.sin(z); + if (euler.order === "XYZ") { + const ae = a * e, af = a * f, be = b * e, bf = b * f; + te[0] = c * e; + te[4] = -c * f; + te[8] = d; + te[1] = af + be * d; + te[5] = ae - bf * d; + te[9] = -b * c; + te[2] = bf - ae * d; + te[6] = be + af * d; + te[10] = a * c; + } else if (euler.order === "YXZ") { + const ce = c * e, cf = c * f, de = d * e, df = d * f; + te[0] = ce + df * b; + te[4] = de * b - cf; + te[8] = a * d; + te[1] = a * f; + te[5] = a * e; + te[9] = -b; + te[2] = cf * b - de; + te[6] = df + ce * b; + te[10] = a * c; + } else if (euler.order === "ZXY") { + const ce = c * e, cf = c * f, de = d * e, df = d * f; + te[0] = ce - df * b; + te[4] = -a * f; + te[8] = de + cf * b; + te[1] = cf + de * b; + te[5] = a * e; + te[9] = df - ce * b; + te[2] = -a * d; + te[6] = b; + te[10] = a * c; + } else if (euler.order === "ZYX") { + const ae = a * e, af = a * f, be = b * e, bf = b * f; + te[0] = c * e; + te[4] = be * d - af; + te[8] = ae * d + bf; + te[1] = c * f; + te[5] = bf * d + ae; + te[9] = af * d - be; + te[2] = -d; + te[6] = b * c; + te[10] = a * c; + } else if (euler.order === "YZX") { + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + te[0] = c * e; + te[4] = bd - ac * f; + te[8] = bc * f + ad; + te[1] = f; + te[5] = a * e; + te[9] = -b * e; + te[2] = -d * e; + te[6] = ad * f + bc; + te[10] = ac - bd * f; + } else if (euler.order === "XZY") { + const ac = a * c, ad = a * d, bc = b * c, bd = b * d; + te[0] = c * e; + te[4] = -f; + te[8] = d * e; + te[1] = ac * f + bd; + te[5] = a * e; + te[9] = ad * f - bc; + te[2] = bc * f - ad; + te[6] = b * e; + te[10] = bd * f + ac; + } + te[3] = 0; + te[7] = 0; + te[11] = 0; + te[12] = 0; + te[13] = 0; + te[14] = 0; + te[15] = 1; + return this; + } + /** + * Sets the rotation component of this matrix to the rotation specified by + * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion) + * The rest of the matrix is set to the identity. + * + * @param {Quaternion} q - The Quaternion. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationFromQuaternion(q) { + return this.compose(_zero, q, _one); + } + /** + * Sets the rotation component of the transformation matrix, looking from `eye` towards + * `target`, and oriented by the up-direction. + * + * @param {Vector3} eye - The eye vector. + * @param {Vector3} target - The target vector. + * @param {Vector3} up - The up vector. + * @return {Matrix4} A reference to this matrix. + */ + lookAt(eye, target, up) { + const te = this.elements; + _z.subVectors(eye, target); + if (_z.lengthSq() === 0) { + _z.z = 1; + } + _z.normalize(); + _x.crossVectors(up, _z); + if (_x.lengthSq() === 0) { + if (Math.abs(up.z) === 1) { + _z.x += 1e-4; + } else { + _z.z += 1e-4; + } + _z.normalize(); + _x.crossVectors(up, _z); + } + _x.normalize(); + _y.crossVectors(_z, _x); + te[0] = _x.x; + te[4] = _y.x; + te[8] = _z.x; + te[1] = _x.y; + te[5] = _y.y; + te[9] = _z.y; + te[2] = _x.z; + te[6] = _y.z; + te[10] = _z.z; + return this; + } + /** + * Post-multiplies this matrix by the given 4x4 matrix. + * + * @param {Matrix4} m - The matrix to multiply with. + * @return {Matrix4} A reference to this matrix. + */ + multiply(m) { + return this.multiplyMatrices(this, m); + } + /** + * Pre-multiplies this matrix by the given 4x4 matrix. + * + * @param {Matrix4} m - The matrix to multiply with. + * @return {Matrix4} A reference to this matrix. + */ + premultiply(m) { + return this.multiplyMatrices(m, this); + } + /** + * Multiples the given 4x4 matrices and stores the result + * in this matrix. + * + * @param {Matrix4} a - The first matrix. + * @param {Matrix4} b - The second matrix. + * @return {Matrix4} A reference to this matrix. + */ + multiplyMatrices(a, b) { + const ae = a.elements; + const be = b.elements; + const te = this.elements; + const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12]; + const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13]; + const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14]; + const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15]; + const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12]; + const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13]; + const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14]; + const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15]; + te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + return this; + } + /** + * Multiplies every component of the matrix by the given scalar. + * + * @param {number} s - The scalar. + * @return {Matrix4} A reference to this matrix. + */ + multiplyScalar(s) { + const te = this.elements; + te[0] *= s; + te[4] *= s; + te[8] *= s; + te[12] *= s; + te[1] *= s; + te[5] *= s; + te[9] *= s; + te[13] *= s; + te[2] *= s; + te[6] *= s; + te[10] *= s; + te[14] *= s; + te[3] *= s; + te[7] *= s; + te[11] *= s; + te[15] *= s; + return this; + } + /** + * Computes and returns the determinant of this matrix. + * + * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html). + * + * @return {number} The determinant. + */ + determinant() { + const te = this.elements; + const n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12]; + const n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13]; + const n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14]; + const n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15]; + const t11 = n23 * n34 - n24 * n33; + const t12 = n22 * n34 - n24 * n32; + const t13 = n22 * n33 - n23 * n32; + const t21 = n21 * n34 - n24 * n31; + const t22 = n21 * n33 - n23 * n31; + const t23 = n21 * n32 - n22 * n31; + return n11 * (n42 * t11 - n43 * t12 + n44 * t13) - n12 * (n41 * t11 - n43 * t21 + n44 * t22) + n13 * (n41 * t12 - n42 * t21 + n44 * t23) - n14 * (n41 * t13 - n42 * t22 + n43 * t23); + } + /** + * Transposes this matrix in place. + * + * @return {Matrix4} A reference to this matrix. + */ + transpose() { + const te = this.elements; + let tmp2; + tmp2 = te[1]; + te[1] = te[4]; + te[4] = tmp2; + tmp2 = te[2]; + te[2] = te[8]; + te[8] = tmp2; + tmp2 = te[6]; + te[6] = te[9]; + te[9] = tmp2; + tmp2 = te[3]; + te[3] = te[12]; + te[12] = tmp2; + tmp2 = te[7]; + te[7] = te[13]; + te[13] = tmp2; + tmp2 = te[11]; + te[11] = te[14]; + te[14] = tmp2; + return this; + } + /** + * Sets the position component for this matrix from the given vector, + * without affecting the rest of the matrix. + * + * @param {number|Vector3} x - The x component of the vector or alternatively the vector object. + * @param {number} y - The y component of the vector. + * @param {number} z - The z component of the vector. + * @return {Matrix4} A reference to this matrix. + */ + setPosition(x, y, z) { + const te = this.elements; + if (x.isVector3) { + te[12] = x.x; + te[13] = x.y; + te[14] = x.z; + } else { + te[12] = x; + te[13] = y; + te[14] = z; + } + return this; + } + /** + * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution). + * You can not invert with a determinant of zero. If you attempt this, the method produces + * a zero matrix instead. + * + * @return {Matrix4} A reference to this matrix. + */ + invert() { + const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n41 = te[3], n12 = te[4], n22 = te[5], n32 = te[6], n42 = te[7], n13 = te[8], n23 = te[9], n33 = te[10], n43 = te[11], n14 = te[12], n24 = te[13], n34 = te[14], n44 = te[15], t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + if (det === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + const detInv = 1 / det; + te[0] = t11 * detInv; + te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv; + te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv; + te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv; + te[4] = t12 * detInv; + te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv; + te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv; + te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv; + te[8] = t13 * detInv; + te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv; + te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv; + te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv; + te[12] = t14 * detInv; + te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv; + te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv; + te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv; + return this; + } + /** + * Multiplies the columns of this matrix by the given vector. + * + * @param {Vector3} v - The scale vector. + * @return {Matrix4} A reference to this matrix. + */ + scale(v) { + const te = this.elements; + const x = v.x, y = v.y, z = v.z; + te[0] *= x; + te[4] *= y; + te[8] *= z; + te[1] *= x; + te[5] *= y; + te[9] *= z; + te[2] *= x; + te[6] *= y; + te[10] *= z; + te[3] *= x; + te[7] *= y; + te[11] *= z; + return this; + } + /** + * Gets the maximum scale value of the three axes. + * + * @return {number} The maximum scale. + */ + getMaxScaleOnAxis() { + const te = this.elements; + const scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2]; + const scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6]; + const scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10]; + return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq)); + } + /** + * Sets this matrix as a translation transform from the given vector. + * + * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector. + * @param {number} y - The amount to translate in the Y axis. + * @param {number} z - The amount to translate in the z axis. + * @return {Matrix4} A reference to this matrix. + */ + makeTranslation(x, y, z) { + if (x.isVector3) { + this.set( + 1, + 0, + 0, + x.x, + 0, + 1, + 0, + x.y, + 0, + 0, + 1, + x.z, + 0, + 0, + 0, + 1 + ); + } else { + this.set( + 1, + 0, + 0, + x, + 0, + 1, + 0, + y, + 0, + 0, + 1, + z, + 0, + 0, + 0, + 1 + ); + } + return this; + } + /** + * Sets this matrix as a rotational transformation around the X axis by + * the given angle. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationX(theta) { + const c = Math.cos(theta), s = Math.sin(theta); + this.set( + 1, + 0, + 0, + 0, + 0, + c, + -s, + 0, + 0, + s, + c, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Sets this matrix as a rotational transformation around the Y axis by + * the given angle. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationY(theta) { + const c = Math.cos(theta), s = Math.sin(theta); + this.set( + c, + 0, + s, + 0, + 0, + 1, + 0, + 0, + -s, + 0, + c, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Sets this matrix as a rotational transformation around the Z axis by + * the given angle. + * + * @param {number} theta - The rotation in radians. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationZ(theta) { + const c = Math.cos(theta), s = Math.sin(theta); + this.set( + c, + -s, + 0, + 0, + s, + c, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Sets this matrix as a rotational transformation around the given axis by + * the given angle. + * + * This is a somewhat controversial but mathematically sound alternative to + * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199). + * + * @param {Vector3} axis - The normalized rotation axis. + * @param {number} angle - The rotation in radians. + * @return {Matrix4} A reference to this matrix. + */ + makeRotationAxis(axis, angle) { + const c = Math.cos(angle); + const s = Math.sin(angle); + const t = 1 - c; + const x = axis.x, y = axis.y, z = axis.z; + const tx = t * x, ty = t * y; + this.set( + tx * x + c, + tx * y - s * z, + tx * z + s * y, + 0, + tx * y + s * z, + ty * y + c, + ty * z - s * x, + 0, + tx * z - s * y, + ty * z + s * x, + t * z * z + c, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Sets this matrix as a scale transformation. + * + * @param {number} x - The amount to scale in the X axis. + * @param {number} y - The amount to scale in the Y axis. + * @param {number} z - The amount to scale in the Z axis. + * @return {Matrix4} A reference to this matrix. + */ + makeScale(x, y, z) { + this.set( + x, + 0, + 0, + 0, + 0, + y, + 0, + 0, + 0, + 0, + z, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Sets this matrix as a shear transformation. + * + * @param {number} xy - The amount to shear X by Y. + * @param {number} xz - The amount to shear X by Z. + * @param {number} yx - The amount to shear Y by X. + * @param {number} yz - The amount to shear Y by Z. + * @param {number} zx - The amount to shear Z by X. + * @param {number} zy - The amount to shear Z by Y. + * @return {Matrix4} A reference to this matrix. + */ + makeShear(xy, xz, yx, yz, zx, zy) { + this.set( + 1, + yx, + zx, + 0, + xy, + 1, + zy, + 0, + xz, + yz, + 1, + 0, + 0, + 0, + 0, + 1 + ); + return this; + } + /** + * Sets this matrix to the transformation composed of the given position, + * rotation (Quaternion) and scale. + * + * @param {Vector3} position - The position vector. + * @param {Quaternion} quaternion - The rotation as a Quaternion. + * @param {Vector3} scale - The scale vector. + * @return {Matrix4} A reference to this matrix. + */ + compose(position, quaternion, scale) { + const te = this.elements; + const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w; + const x2 = x + x, y2 = y + y, z2 = z + z; + const xx = x * x2, xy = x * y2, xz = x * z2; + const yy = y * y2, yz = y * z2, zz = z * z2; + const wx = w * x2, wy = w * y2, wz = w * z2; + const sx = scale.x, sy = scale.y, sz = scale.z; + te[0] = (1 - (yy + zz)) * sx; + te[1] = (xy + wz) * sx; + te[2] = (xz - wy) * sx; + te[3] = 0; + te[4] = (xy - wz) * sy; + te[5] = (1 - (xx + zz)) * sy; + te[6] = (yz + wx) * sy; + te[7] = 0; + te[8] = (xz + wy) * sz; + te[9] = (yz - wx) * sz; + te[10] = (1 - (xx + yy)) * sz; + te[11] = 0; + te[12] = position.x; + te[13] = position.y; + te[14] = position.z; + te[15] = 1; + return this; + } + /** + * Decomposes this matrix into its position, rotation and scale components + * and provides the result in the given objects. + * + * Note: Not all matrices are decomposable in this way. For example, if an + * object has a non-uniformly scaled parent, then the object's world matrix + * may not be decomposable, and this method may not be appropriate. + * + * @param {Vector3} position - The position vector. + * @param {Quaternion} quaternion - The rotation as a Quaternion. + * @param {Vector3} scale - The scale vector. + * @return {Matrix4} A reference to this matrix. + */ + decompose(position, quaternion, scale) { + const te = this.elements; + position.x = te[12]; + position.y = te[13]; + position.z = te[14]; + if (this.determinant() === 0) { + scale.set(1, 1, 1); + quaternion.identity(); + return this; + } + let sx = _v1$5.set(te[0], te[1], te[2]).length(); + const sy = _v1$5.set(te[4], te[5], te[6]).length(); + const sz = _v1$5.set(te[8], te[9], te[10]).length(); + const det = this.determinant(); + if (det < 0) sx = -sx; + _m1$2.copy(this); + const invSX = 1 / sx; + const invSY = 1 / sy; + const invSZ = 1 / sz; + _m1$2.elements[0] *= invSX; + _m1$2.elements[1] *= invSX; + _m1$2.elements[2] *= invSX; + _m1$2.elements[4] *= invSY; + _m1$2.elements[5] *= invSY; + _m1$2.elements[6] *= invSY; + _m1$2.elements[8] *= invSZ; + _m1$2.elements[9] *= invSZ; + _m1$2.elements[10] *= invSZ; + quaternion.setFromRotationMatrix(_m1$2); + scale.x = sx; + scale.y = sy; + scale.z = sz; + return this; + } + /** + * Creates a perspective projection matrix. This is used internally by + * {@link PerspectiveCamera#updateProjectionMatrix}. + + * @param {number} left - Left boundary of the viewing frustum at the near plane. + * @param {number} right - Right boundary of the viewing frustum at the near plane. + * @param {number} top - Top boundary of the viewing frustum at the near plane. + * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane. + * @param {number} near - The distance from the camera to the near plane. + * @param {number} far - The distance from the camera to the far plane. + * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system. + * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth. + * @return {Matrix4} A reference to this matrix. + */ + makePerspective(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false) { + const te = this.elements; + const x = 2 * near / (right - left); + const y = 2 * near / (top - bottom); + const a = (right + left) / (right - left); + const b = (top + bottom) / (top - bottom); + let c, d; + if (reversedDepth) { + c = near / (far - near); + d = far * near / (far - near); + } else { + if (coordinateSystem === WebGLCoordinateSystem) { + c = -(far + near) / (far - near); + d = -2 * far * near / (far - near); + } else if (coordinateSystem === WebGPUCoordinateSystem) { + c = -far / (far - near); + d = -far * near / (far - near); + } else { + throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: " + coordinateSystem); + } + } + te[0] = x; + te[4] = 0; + te[8] = a; + te[12] = 0; + te[1] = 0; + te[5] = y; + te[9] = b; + te[13] = 0; + te[2] = 0; + te[6] = 0; + te[10] = c; + te[14] = d; + te[3] = 0; + te[7] = 0; + te[11] = -1; + te[15] = 0; + return this; + } + /** + * Creates a orthographic projection matrix. This is used internally by + * {@link OrthographicCamera#updateProjectionMatrix}. + + * @param {number} left - Left boundary of the viewing frustum at the near plane. + * @param {number} right - Right boundary of the viewing frustum at the near plane. + * @param {number} top - Top boundary of the viewing frustum at the near plane. + * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane. + * @param {number} near - The distance from the camera to the near plane. + * @param {number} far - The distance from the camera to the far plane. + * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system. + * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth. + * @return {Matrix4} A reference to this matrix. + */ + makeOrthographic(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false) { + const te = this.elements; + const x = 2 / (right - left); + const y = 2 / (top - bottom); + const a = -(right + left) / (right - left); + const b = -(top + bottom) / (top - bottom); + let c, d; + if (reversedDepth) { + c = 1 / (far - near); + d = far / (far - near); + } else { + if (coordinateSystem === WebGLCoordinateSystem) { + c = -2 / (far - near); + d = -(far + near) / (far - near); + } else if (coordinateSystem === WebGPUCoordinateSystem) { + c = -1 / (far - near); + d = -near / (far - near); + } else { + throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: " + coordinateSystem); + } + } + te[0] = x; + te[4] = 0; + te[8] = 0; + te[12] = a; + te[1] = 0; + te[5] = y; + te[9] = 0; + te[13] = b; + te[2] = 0; + te[6] = 0; + te[10] = c; + te[14] = d; + te[3] = 0; + te[7] = 0; + te[11] = 0; + te[15] = 1; + return this; + } + /** + * Returns `true` if this matrix is equal with the given one. + * + * @param {Matrix4} matrix - The matrix to test for equality. + * @return {boolean} Whether this matrix is equal with the given one. + */ + equals(matrix) { + const te = this.elements; + const me = matrix.elements; + for (let i = 0; i < 16; i++) { + if (te[i] !== me[i]) return false; + } + return true; + } + /** + * Sets the elements of the matrix from the given array. + * + * @param {Array} array - The matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Matrix4} A reference to this matrix. + */ + fromArray(array, offset = 0) { + for (let i = 0; i < 16; i++) { + this.elements[i] = array[i + offset]; + } + return this; + } + /** + * Writes the elements of this matrix to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The matrix elements in column-major order. + */ + toArray(array = [], offset = 0) { + const te = this.elements; + array[offset] = te[0]; + array[offset + 1] = te[1]; + array[offset + 2] = te[2]; + array[offset + 3] = te[3]; + array[offset + 4] = te[4]; + array[offset + 5] = te[5]; + array[offset + 6] = te[6]; + array[offset + 7] = te[7]; + array[offset + 8] = te[8]; + array[offset + 9] = te[9]; + array[offset + 10] = te[10]; + array[offset + 11] = te[11]; + array[offset + 12] = te[12]; + array[offset + 13] = te[13]; + array[offset + 14] = te[14]; + array[offset + 15] = te[15]; + return array; + } +}; +var _v1$5 = new Vector3(); +var _m1$2 = new Matrix4(); +var _zero = new Vector3(0, 0, 0); +var _one = new Vector3(1, 1, 1); +var _x = new Vector3(); +var _y = new Vector3(); +var _z = new Vector3(); +var _matrix$2 = new Matrix4(); +var _quaternion$3 = new Quaternion(); +var Euler = class _Euler { + /** + * Constructs a new euler instance. + * + * @param {number} [x=0] - The angle of the x axis in radians. + * @param {number} [y=0] - The angle of the y axis in radians. + * @param {number} [z=0] - The angle of the z axis in radians. + * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied. + */ + constructor(x = 0, y = 0, z = 0, order = _Euler.DEFAULT_ORDER) { + this.isEuler = true; + this._x = x; + this._y = y; + this._z = z; + this._order = order; + } + /** + * The angle of the x axis in radians. + * + * @type {number} + * @default 0 + */ + get x() { + return this._x; + } + set x(value) { + this._x = value; + this._onChangeCallback(); + } + /** + * The angle of the y axis in radians. + * + * @type {number} + * @default 0 + */ + get y() { + return this._y; + } + set y(value) { + this._y = value; + this._onChangeCallback(); + } + /** + * The angle of the z axis in radians. + * + * @type {number} + * @default 0 + */ + get z() { + return this._z; + } + set z(value) { + this._z = value; + this._onChangeCallback(); + } + /** + * A string representing the order that the rotations are applied. + * + * @type {string} + * @default 'XYZ' + */ + get order() { + return this._order; + } + set order(value) { + this._order = value; + this._onChangeCallback(); + } + /** + * Sets the Euler components. + * + * @param {number} x - The angle of the x axis in radians. + * @param {number} y - The angle of the y axis in radians. + * @param {number} z - The angle of the z axis in radians. + * @param {string} [order] - A string representing the order that the rotations are applied. + * @return {Euler} A reference to this Euler instance. + */ + set(x, y, z, order = this._order) { + this._x = x; + this._y = y; + this._z = z; + this._order = order; + this._onChangeCallback(); + return this; + } + /** + * Returns a new Euler instance with copied values from this instance. + * + * @return {Euler} A clone of this instance. + */ + clone() { + return new this.constructor(this._x, this._y, this._z, this._order); + } + /** + * Copies the values of the given Euler instance to this instance. + * + * @param {Euler} euler - The Euler instance to copy. + * @return {Euler} A reference to this Euler instance. + */ + copy(euler) { + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + this._onChangeCallback(); + return this; + } + /** + * Sets the angles of this Euler instance from a pure rotation matrix. + * + * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled). + * @param {string} [order] - A string representing the order that the rotations are applied. + * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. + * @return {Euler} A reference to this Euler instance. + */ + setFromRotationMatrix(m, order = this._order, update = true) { + const te = m.elements; + const m11 = te[0], m12 = te[4], m13 = te[8]; + const m21 = te[1], m22 = te[5], m23 = te[9]; + const m31 = te[2], m32 = te[6], m33 = te[10]; + switch (order) { + case "XYZ": + this._y = Math.asin(clamp(m13, -1, 1)); + if (Math.abs(m13) < 0.9999999) { + this._x = Math.atan2(-m23, m33); + this._z = Math.atan2(-m12, m11); + } else { + this._x = Math.atan2(m32, m22); + this._z = 0; + } + break; + case "YXZ": + this._x = Math.asin(-clamp(m23, -1, 1)); + if (Math.abs(m23) < 0.9999999) { + this._y = Math.atan2(m13, m33); + this._z = Math.atan2(m21, m22); + } else { + this._y = Math.atan2(-m31, m11); + this._z = 0; + } + break; + case "ZXY": + this._x = Math.asin(clamp(m32, -1, 1)); + if (Math.abs(m32) < 0.9999999) { + this._y = Math.atan2(-m31, m33); + this._z = Math.atan2(-m12, m22); + } else { + this._y = 0; + this._z = Math.atan2(m21, m11); + } + break; + case "ZYX": + this._y = Math.asin(-clamp(m31, -1, 1)); + if (Math.abs(m31) < 0.9999999) { + this._x = Math.atan2(m32, m33); + this._z = Math.atan2(m21, m11); + } else { + this._x = 0; + this._z = Math.atan2(-m12, m22); + } + break; + case "YZX": + this._z = Math.asin(clamp(m21, -1, 1)); + if (Math.abs(m21) < 0.9999999) { + this._x = Math.atan2(-m23, m22); + this._y = Math.atan2(-m31, m11); + } else { + this._x = 0; + this._y = Math.atan2(m13, m33); + } + break; + case "XZY": + this._z = Math.asin(-clamp(m12, -1, 1)); + if (Math.abs(m12) < 0.9999999) { + this._x = Math.atan2(m32, m22); + this._y = Math.atan2(m13, m11); + } else { + this._x = Math.atan2(-m23, m33); + this._y = 0; + } + break; + default: + warn("Euler: .setFromRotationMatrix() encountered an unknown order: " + order); + } + this._order = order; + if (update === true) this._onChangeCallback(); + return this; + } + /** + * Sets the angles of this Euler instance from a normalized quaternion. + * + * @param {Quaternion} q - A normalized Quaternion. + * @param {string} [order] - A string representing the order that the rotations are applied. + * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not. + * @return {Euler} A reference to this Euler instance. + */ + setFromQuaternion(q, order, update) { + _matrix$2.makeRotationFromQuaternion(q); + return this.setFromRotationMatrix(_matrix$2, order, update); + } + /** + * Sets the angles of this Euler instance from the given vector. + * + * @param {Vector3} v - The vector. + * @param {string} [order] - A string representing the order that the rotations are applied. + * @return {Euler} A reference to this Euler instance. + */ + setFromVector3(v, order = this._order) { + return this.set(v.x, v.y, v.z, order); + } + /** + * Resets the euler angle with a new order by creating a quaternion from this + * euler angle and then setting this euler angle with the quaternion and the + * new order. + * + * Warning: This discards revolution information. + * + * @param {string} [newOrder] - A string representing the new order that the rotations are applied. + * @return {Euler} A reference to this Euler instance. + */ + reorder(newOrder) { + _quaternion$3.setFromEuler(this); + return this.setFromQuaternion(_quaternion$3, newOrder); + } + /** + * Returns `true` if this Euler instance is equal with the given one. + * + * @param {Euler} euler - The Euler instance to test for equality. + * @return {boolean} Whether this Euler instance is equal with the given one. + */ + equals(euler) { + return euler._x === this._x && euler._y === this._y && euler._z === this._z && euler._order === this._order; + } + /** + * Sets this Euler instance's components to values from the given array. The first three + * entries of the array are assign to the x,y and z components. An optional fourth entry + * defines the Euler order. + * + * @param {Array} array - An array holding the Euler component values. + * @return {Euler} A reference to this Euler instance. + */ + fromArray(array) { + this._x = array[0]; + this._y = array[1]; + this._z = array[2]; + if (array[3] !== void 0) this._order = array[3]; + this._onChangeCallback(); + return this; + } + /** + * Writes the components of this Euler instance to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the Euler components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The Euler components. + */ + toArray(array = [], offset = 0) { + array[offset] = this._x; + array[offset + 1] = this._y; + array[offset + 2] = this._z; + array[offset + 3] = this._order; + return array; + } + _onChange(callback) { + this._onChangeCallback = callback; + return this; + } + _onChangeCallback() { + } + *[Symbol.iterator]() { + yield this._x; + yield this._y; + yield this._z; + yield this._order; + } +}; +Euler.DEFAULT_ORDER = "XYZ"; +var Layers = class { + /** + * Constructs a new layers instance, with membership + * initially set to layer `0`. + */ + constructor() { + this.mask = 1 | 0; + } + /** + * Sets membership to the given layer, and remove membership all other layers. + * + * @param {number} layer - The layer to set. + */ + set(layer) { + this.mask = (1 << layer | 0) >>> 0; + } + /** + * Adds membership of the given layer. + * + * @param {number} layer - The layer to enable. + */ + enable(layer) { + this.mask |= 1 << layer | 0; + } + /** + * Adds membership to all layers. + */ + enableAll() { + this.mask = 4294967295 | 0; + } + /** + * Toggles the membership of the given layer. + * + * @param {number} layer - The layer to toggle. + */ + toggle(layer) { + this.mask ^= 1 << layer | 0; + } + /** + * Removes membership of the given layer. + * + * @param {number} layer - The layer to enable. + */ + disable(layer) { + this.mask &= ~(1 << layer | 0); + } + /** + * Removes the membership from all layers. + */ + disableAll() { + this.mask = 0; + } + /** + * Returns `true` if this and the given layers object have at least one + * layer in common. + * + * @param {Layers} layers - The layers to test. + * @return {boolean } Whether this and the given layers object have at least one layer in common or not. + */ + test(layers) { + return (this.mask & layers.mask) !== 0; + } + /** + * Returns `true` if the given layer is enabled. + * + * @param {number} layer - The layer to test. + * @return {boolean } Whether the given layer is enabled or not. + */ + isEnabled(layer) { + return (this.mask & (1 << layer | 0)) !== 0; + } +}; +var _object3DId = 0; +var _v1$4 = new Vector3(); +var _q1 = new Quaternion(); +var _m1$1 = new Matrix4(); +var _target = new Vector3(); +var _position$3 = new Vector3(); +var _scale$2 = new Vector3(); +var _quaternion$2 = new Quaternion(); +var _xAxis = new Vector3(1, 0, 0); +var _yAxis = new Vector3(0, 1, 0); +var _zAxis = new Vector3(0, 0, 1); +var _addedEvent = { type: "added" }; +var _removedEvent = { type: "removed" }; +var _childaddedEvent = { type: "childadded", child: null }; +var _childremovedEvent = { type: "childremoved", child: null }; +var Object3D = class _Object3D extends EventDispatcher { + /** + * Constructs a new 3D object. + */ + constructor() { + super(); + this.isObject3D = true; + Object.defineProperty(this, "id", { value: _object3DId++ }); + this.uuid = generateUUID(); + this.name = ""; + this.type = "Object3D"; + this.parent = null; + this.children = []; + this.up = _Object3D.DEFAULT_UP.clone(); + const position = new Vector3(); + const rotation = new Euler(); + const quaternion = new Quaternion(); + const scale = new Vector3(1, 1, 1); + function onRotationChange() { + quaternion.setFromEuler(rotation, false); + } + function onQuaternionChange() { + rotation.setFromQuaternion(quaternion, void 0, false); + } + rotation._onChange(onRotationChange); + quaternion._onChange(onQuaternionChange); + Object.defineProperties(this, { + /** + * Represents the object's local position. + * + * @name Object3D#position + * @type {Vector3} + * @default (0,0,0) + */ + position: { + configurable: true, + enumerable: true, + value: position + }, + /** + * Represents the object's local rotation as Euler angles, in radians. + * + * @name Object3D#rotation + * @type {Euler} + * @default (0,0,0) + */ + rotation: { + configurable: true, + enumerable: true, + value: rotation + }, + /** + * Represents the object's local rotation as Quaternions. + * + * @name Object3D#quaternion + * @type {Quaternion} + */ + quaternion: { + configurable: true, + enumerable: true, + value: quaternion + }, + /** + * Represents the object's local scale. + * + * @name Object3D#scale + * @type {Vector3} + * @default (1,1,1) + */ + scale: { + configurable: true, + enumerable: true, + value: scale + }, + /** + * Represents the object's model-view matrix. + * + * @name Object3D#modelViewMatrix + * @type {Matrix4} + */ + modelViewMatrix: { + value: new Matrix4() + }, + /** + * Represents the object's normal matrix. + * + * @name Object3D#normalMatrix + * @type {Matrix3} + */ + normalMatrix: { + value: new Matrix3() + } + }); + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + this.matrixAutoUpdate = _Object3D.DEFAULT_MATRIX_AUTO_UPDATE; + this.matrixWorldAutoUpdate = _Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; + this.matrixWorldNeedsUpdate = false; + this.layers = new Layers(); + this.visible = true; + this.castShadow = false; + this.receiveShadow = false; + this.frustumCulled = true; + this.renderOrder = 0; + this.animations = []; + this.customDepthMaterial = void 0; + this.customDistanceMaterial = void 0; + this.userData = {}; + } + /** + * A callback that is executed immediately before a 3D object is rendered to a shadow map. + * + * @param {Renderer|WebGLRenderer} renderer - The renderer. + * @param {Object3D} object - The 3D object. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {Camera} shadowCamera - The shadow camera. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Material} depthMaterial - The depth material. + * @param {Object} group - The geometry group data. + */ + onBeforeShadow() { + } + /** + * A callback that is executed immediately after a 3D object is rendered to a shadow map. + * + * @param {Renderer|WebGLRenderer} renderer - The renderer. + * @param {Object3D} object - The 3D object. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {Camera} shadowCamera - The shadow camera. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Material} depthMaterial - The depth material. + * @param {Object} group - The geometry group data. + */ + onAfterShadow() { + } + /** + * A callback that is executed immediately before a 3D object is rendered. + * + * @param {Renderer|WebGLRenderer} renderer - The renderer. + * @param {Object3D} object - The 3D object. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Material} material - The 3D object's material. + * @param {Object} group - The geometry group data. + */ + onBeforeRender() { + } + /** + * A callback that is executed immediately after a 3D object is rendered. + * + * @param {Renderer|WebGLRenderer} renderer - The renderer. + * @param {Object3D} object - The 3D object. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Material} material - The 3D object's material. + * @param {Object} group - The geometry group data. + */ + onAfterRender() { + } + /** + * Applies the given transformation matrix to the object and updates the object's position, + * rotation and scale. + * + * @param {Matrix4} matrix - The transformation matrix. + */ + applyMatrix4(matrix) { + if (this.matrixAutoUpdate) this.updateMatrix(); + this.matrix.premultiply(matrix); + this.matrix.decompose(this.position, this.quaternion, this.scale); + } + /** + * Applies a rotation represented by given the quaternion to the 3D object. + * + * @param {Quaternion} q - The quaternion. + * @return {Object3D} A reference to this instance. + */ + applyQuaternion(q) { + this.quaternion.premultiply(q); + return this; + } + /** + * Sets the given rotation represented as an axis/angle couple to the 3D object. + * + * @param {Vector3} axis - The (normalized) axis vector. + * @param {number} angle - The angle in radians. + */ + setRotationFromAxisAngle(axis, angle) { + this.quaternion.setFromAxisAngle(axis, angle); + } + /** + * Sets the given rotation represented as Euler angles to the 3D object. + * + * @param {Euler} euler - The Euler angles. + */ + setRotationFromEuler(euler) { + this.quaternion.setFromEuler(euler, true); + } + /** + * Sets the given rotation represented as rotation matrix to the 3D object. + * + * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be + * a pure rotation matrix (i.e, unscaled). + */ + setRotationFromMatrix(m) { + this.quaternion.setFromRotationMatrix(m); + } + /** + * Sets the given rotation represented as a Quaternion to the 3D object. + * + * @param {Quaternion} q - The Quaternion + */ + setRotationFromQuaternion(q) { + this.quaternion.copy(q); + } + /** + * Rotates the 3D object along an axis in local space. + * + * @param {Vector3} axis - The (normalized) axis vector. + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateOnAxis(axis, angle) { + _q1.setFromAxisAngle(axis, angle); + this.quaternion.multiply(_q1); + return this; + } + /** + * Rotates the 3D object along an axis in world space. + * + * @param {Vector3} axis - The (normalized) axis vector. + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateOnWorldAxis(axis, angle) { + _q1.setFromAxisAngle(axis, angle); + this.quaternion.premultiply(_q1); + return this; + } + /** + * Rotates the 3D object around its X axis in local space. + * + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateX(angle) { + return this.rotateOnAxis(_xAxis, angle); + } + /** + * Rotates the 3D object around its Y axis in local space. + * + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateY(angle) { + return this.rotateOnAxis(_yAxis, angle); + } + /** + * Rotates the 3D object around its Z axis in local space. + * + * @param {number} angle - The angle in radians. + * @return {Object3D} A reference to this instance. + */ + rotateZ(angle) { + return this.rotateOnAxis(_zAxis, angle); + } + /** + * Translate the 3D object by a distance along the given axis in local space. + * + * @param {Vector3} axis - The (normalized) axis vector. + * @param {number} distance - The distance in world units. + * @return {Object3D} A reference to this instance. + */ + translateOnAxis(axis, distance) { + _v1$4.copy(axis).applyQuaternion(this.quaternion); + this.position.add(_v1$4.multiplyScalar(distance)); + return this; + } + /** + * Translate the 3D object by a distance along its X-axis in local space. + * + * @param {number} distance - The distance in world units. + * @return {Object3D} A reference to this instance. + */ + translateX(distance) { + return this.translateOnAxis(_xAxis, distance); + } + /** + * Translate the 3D object by a distance along its Y-axis in local space. + * + * @param {number} distance - The distance in world units. + * @return {Object3D} A reference to this instance. + */ + translateY(distance) { + return this.translateOnAxis(_yAxis, distance); + } + /** + * Translate the 3D object by a distance along its Z-axis in local space. + * + * @param {number} distance - The distance in world units. + * @return {Object3D} A reference to this instance. + */ + translateZ(distance) { + return this.translateOnAxis(_zAxis, distance); + } + /** + * Converts the given vector from this 3D object's local space to world space. + * + * @param {Vector3} vector - The vector to convert. + * @return {Vector3} The converted vector. + */ + localToWorld(vector) { + this.updateWorldMatrix(true, false); + return vector.applyMatrix4(this.matrixWorld); + } + /** + * Converts the given vector from this 3D object's word space to local space. + * + * @param {Vector3} vector - The vector to convert. + * @return {Vector3} The converted vector. + */ + worldToLocal(vector) { + this.updateWorldMatrix(true, false); + return vector.applyMatrix4(_m1$1.copy(this.matrixWorld).invert()); + } + /** + * Rotates the object to face a point in world space. + * + * This method does not support objects having non-uniformly-scaled parent(s). + * + * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space + * @param {number} [y] - The y coordinate in world space. + * @param {number} [z] - The z coordinate in world space. + */ + lookAt(x, y, z) { + if (x.isVector3) { + _target.copy(x); + } else { + _target.set(x, y, z); + } + const parent = this.parent; + this.updateWorldMatrix(true, false); + _position$3.setFromMatrixPosition(this.matrixWorld); + if (this.isCamera || this.isLight) { + _m1$1.lookAt(_position$3, _target, this.up); + } else { + _m1$1.lookAt(_target, _position$3, this.up); + } + this.quaternion.setFromRotationMatrix(_m1$1); + if (parent) { + _m1$1.extractRotation(parent.matrixWorld); + _q1.setFromRotationMatrix(_m1$1); + this.quaternion.premultiply(_q1.invert()); + } + } + /** + * Adds the given 3D object as a child to this 3D object. An arbitrary number of + * objects may be added. Any current parent on an object passed in here will be + * removed, since an object can have at most one parent. + * + * @fires Object3D#added + * @fires Object3D#childadded + * @param {Object3D} object - The 3D object to add. + * @return {Object3D} A reference to this instance. + */ + add(object) { + if (arguments.length > 1) { + for (let i = 0; i < arguments.length; i++) { + this.add(arguments[i]); + } + return this; + } + if (object === this) { + error("Object3D.add: object can't be added as a child of itself.", object); + return this; + } + if (object && object.isObject3D) { + object.removeFromParent(); + object.parent = this; + this.children.push(object); + object.dispatchEvent(_addedEvent); + _childaddedEvent.child = object; + this.dispatchEvent(_childaddedEvent); + _childaddedEvent.child = null; + } else { + error("Object3D.add: object not an instance of THREE.Object3D.", object); + } + return this; + } + /** + * Removes the given 3D object as child from this 3D object. + * An arbitrary number of objects may be removed. + * + * @fires Object3D#removed + * @fires Object3D#childremoved + * @param {Object3D} object - The 3D object to remove. + * @return {Object3D} A reference to this instance. + */ + remove(object) { + if (arguments.length > 1) { + for (let i = 0; i < arguments.length; i++) { + this.remove(arguments[i]); + } + return this; + } + const index = this.children.indexOf(object); + if (index !== -1) { + object.parent = null; + this.children.splice(index, 1); + object.dispatchEvent(_removedEvent); + _childremovedEvent.child = object; + this.dispatchEvent(_childremovedEvent); + _childremovedEvent.child = null; + } + return this; + } + /** + * Removes this 3D object from its current parent. + * + * @fires Object3D#removed + * @fires Object3D#childremoved + * @return {Object3D} A reference to this instance. + */ + removeFromParent() { + const parent = this.parent; + if (parent !== null) { + parent.remove(this); + } + return this; + } + /** + * Removes all child objects. + * + * @fires Object3D#removed + * @fires Object3D#childremoved + * @return {Object3D} A reference to this instance. + */ + clear() { + return this.remove(...this.children); + } + /** + * Adds the given 3D object as a child of this 3D object, while maintaining the object's world + * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s). + * + * @fires Object3D#added + * @fires Object3D#childadded + * @param {Object3D} object - The 3D object to attach. + * @return {Object3D} A reference to this instance. + */ + attach(object) { + this.updateWorldMatrix(true, false); + _m1$1.copy(this.matrixWorld).invert(); + if (object.parent !== null) { + object.parent.updateWorldMatrix(true, false); + _m1$1.multiply(object.parent.matrixWorld); + } + object.applyMatrix4(_m1$1); + object.removeFromParent(); + object.parent = this; + this.children.push(object); + object.updateWorldMatrix(false, true); + object.dispatchEvent(_addedEvent); + _childaddedEvent.child = object; + this.dispatchEvent(_childaddedEvent); + _childaddedEvent.child = null; + return this; + } + /** + * Searches through the 3D object and its children, starting with the 3D object + * itself, and returns the first with a matching ID. + * + * @param {number} id - The id. + * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found. + */ + getObjectById(id) { + return this.getObjectByProperty("id", id); + } + /** + * Searches through the 3D object and its children, starting with the 3D object + * itself, and returns the first with a matching name. + * + * @param {string} name - The name. + * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found. + */ + getObjectByName(name) { + return this.getObjectByProperty("name", name); + } + /** + * Searches through the 3D object and its children, starting with the 3D object + * itself, and returns the first with a matching property value. + * + * @param {string} name - The name of the property. + * @param {any} value - The value. + * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found. + */ + getObjectByProperty(name, value) { + if (this[name] === value) return this; + for (let i = 0, l = this.children.length; i < l; i++) { + const child = this.children[i]; + const object = child.getObjectByProperty(name, value); + if (object !== void 0) { + return object; + } + } + return void 0; + } + /** + * Searches through the 3D object and its children, starting with the 3D object + * itself, and returns all 3D objects with a matching property value. + * + * @param {string} name - The name of the property. + * @param {any} value - The value. + * @param {Array} result - The method stores the result in this array. + * @return {Array} The found 3D objects. + */ + getObjectsByProperty(name, value, result = []) { + if (this[name] === value) result.push(this); + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + children[i].getObjectsByProperty(name, value, result); + } + return result; + } + /** + * Returns a vector representing the position of the 3D object in world space. + * + * @param {Vector3} target - The target vector the result is stored to. + * @return {Vector3} The 3D object's position in world space. + */ + getWorldPosition(target) { + this.updateWorldMatrix(true, false); + return target.setFromMatrixPosition(this.matrixWorld); + } + /** + * Returns a Quaternion representing the position of the 3D object in world space. + * + * @param {Quaternion} target - The target Quaternion the result is stored to. + * @return {Quaternion} The 3D object's rotation in world space. + */ + getWorldQuaternion(target) { + this.updateWorldMatrix(true, false); + this.matrixWorld.decompose(_position$3, target, _scale$2); + return target; + } + /** + * Returns a vector representing the scale of the 3D object in world space. + * + * @param {Vector3} target - The target vector the result is stored to. + * @return {Vector3} The 3D object's scale in world space. + */ + getWorldScale(target) { + this.updateWorldMatrix(true, false); + this.matrixWorld.decompose(_position$3, _quaternion$2, target); + return target; + } + /** + * Returns a vector representing the ("look") direction of the 3D object in world space. + * + * @param {Vector3} target - The target vector the result is stored to. + * @return {Vector3} The 3D object's direction in world space. + */ + getWorldDirection(target) { + this.updateWorldMatrix(true, false); + const e = this.matrixWorld.elements; + return target.set(e[8], e[9], e[10]).normalize(); + } + /** + * Abstract method to get intersections between a casted ray and this + * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points} + * implement this method in order to use raycasting. + * + * @abstract + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - An array holding the result of the method. + */ + raycast() { + } + /** + * Executes the callback on this 3D object and all descendants. + * + * Note: Modifying the scene graph inside the callback is discouraged. + * + * @param {Function} callback - A callback function that allows to process the current 3D object. + */ + traverse(callback) { + callback(this); + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + children[i].traverse(callback); + } + } + /** + * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects. + * Descendants of invisible 3D objects are not traversed. + * + * Note: Modifying the scene graph inside the callback is discouraged. + * + * @param {Function} callback - A callback function that allows to process the current 3D object. + */ + traverseVisible(callback) { + if (this.visible === false) return; + callback(this); + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + children[i].traverseVisible(callback); + } + } + /** + * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors. + * + * Note: Modifying the scene graph inside the callback is discouraged. + * + * @param {Function} callback - A callback function that allows to process the current 3D object. + */ + traverseAncestors(callback) { + const parent = this.parent; + if (parent !== null) { + callback(parent); + parent.traverseAncestors(callback); + } + } + /** + * Updates the transformation matrix in local space by computing it from the current + * position, rotation and scale values. + */ + updateMatrix() { + this.matrix.compose(this.position, this.quaternion, this.scale); + this.matrixWorldNeedsUpdate = true; + } + /** + * Updates the transformation matrix in world space of this 3D objects and its descendants. + * + * To ensure correct results, this method also recomputes the 3D object's transformation matrix in + * local space. The computation of the local and world matrix can be controlled with the + * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both + * `true` by default. Set these flags to `false` if you need more control over the update matrix process. + * + * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even + * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`. + */ + updateMatrixWorld(force) { + if (this.matrixAutoUpdate) this.updateMatrix(); + if (this.matrixWorldNeedsUpdate || force) { + if (this.matrixWorldAutoUpdate === true) { + if (this.parent === null) { + this.matrixWorld.copy(this.matrix); + } else { + this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); + } + } + this.matrixWorldNeedsUpdate = false; + force = true; + } + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + const child = children[i]; + child.updateMatrixWorld(force); + } + } + /** + * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the + * update of ancestor and descendant nodes. + * + * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not. + * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not. + */ + updateWorldMatrix(updateParents, updateChildren) { + const parent = this.parent; + if (updateParents === true && parent !== null) { + parent.updateWorldMatrix(true, false); + } + if (this.matrixAutoUpdate) this.updateMatrix(); + if (this.matrixWorldAutoUpdate === true) { + if (this.parent === null) { + this.matrixWorld.copy(this.matrix); + } else { + this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix); + } + } + if (updateChildren === true) { + const children = this.children; + for (let i = 0, l = children.length; i < l; i++) { + const child = children[i]; + child.updateWorldMatrix(false, true); + } + } + } + /** + * Serializes the 3D object into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized 3D object. + * @see {@link ObjectLoader#parse} + */ + toJSON(meta) { + const isRootObject = meta === void 0 || typeof meta === "string"; + const output = {}; + if (isRootObject) { + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {}, + shapes: {}, + skeletons: {}, + animations: {}, + nodes: {} + }; + output.metadata = { + version: 4.7, + type: "Object", + generator: "Object3D.toJSON" + }; + } + const object = {}; + object.uuid = this.uuid; + object.type = this.type; + if (this.name !== "") object.name = this.name; + if (this.castShadow === true) object.castShadow = true; + if (this.receiveShadow === true) object.receiveShadow = true; + if (this.visible === false) object.visible = false; + if (this.frustumCulled === false) object.frustumCulled = false; + if (this.renderOrder !== 0) object.renderOrder = this.renderOrder; + if (Object.keys(this.userData).length > 0) object.userData = this.userData; + object.layers = this.layers.mask; + object.matrix = this.matrix.toArray(); + object.up = this.up.toArray(); + if (this.matrixAutoUpdate === false) object.matrixAutoUpdate = false; + if (this.isInstancedMesh) { + object.type = "InstancedMesh"; + object.count = this.count; + object.instanceMatrix = this.instanceMatrix.toJSON(); + if (this.instanceColor !== null) object.instanceColor = this.instanceColor.toJSON(); + } + if (this.isBatchedMesh) { + object.type = "BatchedMesh"; + object.perObjectFrustumCulled = this.perObjectFrustumCulled; + object.sortObjects = this.sortObjects; + object.drawRanges = this._drawRanges; + object.reservedRanges = this._reservedRanges; + object.geometryInfo = this._geometryInfo.map((info) => ({ + ...info, + boundingBox: info.boundingBox ? info.boundingBox.toJSON() : void 0, + boundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : void 0 + })); + object.instanceInfo = this._instanceInfo.map((info) => ({ ...info })); + object.availableInstanceIds = this._availableInstanceIds.slice(); + object.availableGeometryIds = this._availableGeometryIds.slice(); + object.nextIndexStart = this._nextIndexStart; + object.nextVertexStart = this._nextVertexStart; + object.geometryCount = this._geometryCount; + object.maxInstanceCount = this._maxInstanceCount; + object.maxVertexCount = this._maxVertexCount; + object.maxIndexCount = this._maxIndexCount; + object.geometryInitialized = this._geometryInitialized; + object.matricesTexture = this._matricesTexture.toJSON(meta); + object.indirectTexture = this._indirectTexture.toJSON(meta); + if (this._colorsTexture !== null) { + object.colorsTexture = this._colorsTexture.toJSON(meta); + } + if (this.boundingSphere !== null) { + object.boundingSphere = this.boundingSphere.toJSON(); + } + if (this.boundingBox !== null) { + object.boundingBox = this.boundingBox.toJSON(); + } + } + function serialize(library, element) { + if (library[element.uuid] === void 0) { + library[element.uuid] = element.toJSON(meta); + } + return element.uuid; + } + if (this.isScene) { + if (this.background) { + if (this.background.isColor) { + object.background = this.background.toJSON(); + } else if (this.background.isTexture) { + object.background = this.background.toJSON(meta).uuid; + } + } + if (this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true) { + object.environment = this.environment.toJSON(meta).uuid; + } + } else if (this.isMesh || this.isLine || this.isPoints) { + object.geometry = serialize(meta.geometries, this.geometry); + const parameters = this.geometry.parameters; + if (parameters !== void 0 && parameters.shapes !== void 0) { + const shapes = parameters.shapes; + if (Array.isArray(shapes)) { + for (let i = 0, l = shapes.length; i < l; i++) { + const shape = shapes[i]; + serialize(meta.shapes, shape); + } + } else { + serialize(meta.shapes, shapes); + } + } + } + if (this.isSkinnedMesh) { + object.bindMode = this.bindMode; + object.bindMatrix = this.bindMatrix.toArray(); + if (this.skeleton !== void 0) { + serialize(meta.skeletons, this.skeleton); + object.skeleton = this.skeleton.uuid; + } + } + if (this.material !== void 0) { + if (Array.isArray(this.material)) { + const uuids = []; + for (let i = 0, l = this.material.length; i < l; i++) { + uuids.push(serialize(meta.materials, this.material[i])); + } + object.material = uuids; + } else { + object.material = serialize(meta.materials, this.material); + } + } + if (this.children.length > 0) { + object.children = []; + for (let i = 0; i < this.children.length; i++) { + object.children.push(this.children[i].toJSON(meta).object); + } + } + if (this.animations.length > 0) { + object.animations = []; + for (let i = 0; i < this.animations.length; i++) { + const animation = this.animations[i]; + object.animations.push(serialize(meta.animations, animation)); + } + } + if (isRootObject) { + const geometries = extractFromCache(meta.geometries); + const materials = extractFromCache(meta.materials); + const textures = extractFromCache(meta.textures); + const images = extractFromCache(meta.images); + const shapes = extractFromCache(meta.shapes); + const skeletons = extractFromCache(meta.skeletons); + const animations = extractFromCache(meta.animations); + const nodes = extractFromCache(meta.nodes); + if (geometries.length > 0) output.geometries = geometries; + if (materials.length > 0) output.materials = materials; + if (textures.length > 0) output.textures = textures; + if (images.length > 0) output.images = images; + if (shapes.length > 0) output.shapes = shapes; + if (skeletons.length > 0) output.skeletons = skeletons; + if (animations.length > 0) output.animations = animations; + if (nodes.length > 0) output.nodes = nodes; + } + output.object = object; + return output; + function extractFromCache(cache) { + const values = []; + for (const key in cache) { + const data = cache[key]; + delete data.metadata; + values.push(data); + } + return values; + } + } + /** + * Returns a new 3D object with copied values from this instance. + * + * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned. + * @return {Object3D} A clone of this instance. + */ + clone(recursive) { + return new this.constructor().copy(this, recursive); + } + /** + * Copies the values of the given 3D object to this instance. + * + * @param {Object3D} source - The 3D object to copy. + * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned. + * @return {Object3D} A reference to this instance. + */ + copy(source, recursive = true) { + this.name = source.name; + this.up.copy(source.up); + this.position.copy(source.position); + this.rotation.order = source.rotation.order; + this.quaternion.copy(source.quaternion); + this.scale.copy(source.scale); + this.matrix.copy(source.matrix); + this.matrixWorld.copy(source.matrixWorld); + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + this.layers.mask = source.layers.mask; + this.visible = source.visible; + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + this.animations = source.animations.slice(); + this.userData = JSON.parse(JSON.stringify(source.userData)); + if (recursive === true) { + for (let i = 0; i < source.children.length; i++) { + const child = source.children[i]; + this.add(child.clone()); + } + } + return this; + } +}; +Object3D.DEFAULT_UP = new Vector3(0, 1, 0); +Object3D.DEFAULT_MATRIX_AUTO_UPDATE = true; +Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true; +var _v0$1 = new Vector3(); +var _v1$3 = new Vector3(); +var _v2$2 = new Vector3(); +var _v3$2 = new Vector3(); +var _vab = new Vector3(); +var _vac = new Vector3(); +var _vbc = new Vector3(); +var _vap = new Vector3(); +var _vbp = new Vector3(); +var _vcp = new Vector3(); +var _v40 = new Vector4(); +var _v41 = new Vector4(); +var _v42 = new Vector4(); +var Triangle = class _Triangle { + /** + * Constructs a new triangle. + * + * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle. + * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle. + * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle. + */ + constructor(a = new Vector3(), b = new Vector3(), c = new Vector3()) { + this.a = a; + this.b = b; + this.c = c; + } + /** + * Computes the normal vector of a triangle. + * + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The triangle's normal. + */ + static getNormal(a, b, c, target) { + target.subVectors(c, b); + _v0$1.subVectors(a, b); + target.cross(_v0$1); + const targetLengthSq = target.lengthSq(); + if (targetLengthSq > 0) { + return target.multiplyScalar(1 / Math.sqrt(targetLengthSq)); + } + return target.set(0, 0, 0); + } + /** + * Computes a barycentric coordinates from the given vector. + * Returns `null` if the triangle is degenerate. + * + * @param {Vector3} point - A point in 3D space. + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The barycentric coordinates for the given point + */ + static getBarycoord(point, a, b, c, target) { + _v0$1.subVectors(c, a); + _v1$3.subVectors(b, a); + _v2$2.subVectors(point, a); + const dot00 = _v0$1.dot(_v0$1); + const dot01 = _v0$1.dot(_v1$3); + const dot02 = _v0$1.dot(_v2$2); + const dot11 = _v1$3.dot(_v1$3); + const dot12 = _v1$3.dot(_v2$2); + const denom = dot00 * dot11 - dot01 * dot01; + if (denom === 0) { + target.set(0, 0, 0); + return null; + } + const invDenom = 1 / denom; + const u = (dot11 * dot02 - dot01 * dot12) * invDenom; + const v = (dot00 * dot12 - dot01 * dot02) * invDenom; + return target.set(1 - u - v, v, u); + } + /** + * Returns `true` if the given point, when projected onto the plane of the + * triangle, lies within the triangle. + * + * @param {Vector3} point - The point in 3D space to test. + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @return {boolean} Whether the given point, when projected onto the plane of the + * triangle, lies within the triangle or not. + */ + static containsPoint(point, a, b, c) { + if (this.getBarycoord(point, a, b, c, _v3$2) === null) { + return false; + } + return _v3$2.x >= 0 && _v3$2.y >= 0 && _v3$2.x + _v3$2.y <= 1; + } + /** + * Computes the value barycentrically interpolated for the given point on the + * triangle. Returns `null` if the triangle is degenerate. + * + * @param {Vector3} point - Position of interpolated point. + * @param {Vector3} p1 - The first corner of the triangle. + * @param {Vector3} p2 - The second corner of the triangle. + * @param {Vector3} p3 - The third corner of the triangle. + * @param {Vector3} v1 - Value to interpolate of first vertex. + * @param {Vector3} v2 - Value to interpolate of second vertex. + * @param {Vector3} v3 - Value to interpolate of third vertex. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The interpolated value. + */ + static getInterpolation(point, p1, p2, p3, v1, v2, v3, target) { + if (this.getBarycoord(point, p1, p2, p3, _v3$2) === null) { + target.x = 0; + target.y = 0; + if ("z" in target) target.z = 0; + if ("w" in target) target.w = 0; + return null; + } + target.setScalar(0); + target.addScaledVector(v1, _v3$2.x); + target.addScaledVector(v2, _v3$2.y); + target.addScaledVector(v3, _v3$2.z); + return target; + } + /** + * Computes the value barycentrically interpolated for the given attribute and indices. + * + * @param {BufferAttribute} attr - The attribute to interpolate. + * @param {number} i1 - Index of first vertex. + * @param {number} i2 - Index of second vertex. + * @param {number} i3 - Index of third vertex. + * @param {Vector3} barycoord - The barycoordinate value to use to interpolate. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The interpolated attribute value. + */ + static getInterpolatedAttribute(attr, i1, i2, i3, barycoord, target) { + _v40.setScalar(0); + _v41.setScalar(0); + _v42.setScalar(0); + _v40.fromBufferAttribute(attr, i1); + _v41.fromBufferAttribute(attr, i2); + _v42.fromBufferAttribute(attr, i3); + target.setScalar(0); + target.addScaledVector(_v40, barycoord.x); + target.addScaledVector(_v41, barycoord.y); + target.addScaledVector(_v42, barycoord.z); + return target; + } + /** + * Returns `true` if the triangle is oriented towards the given direction. + * + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @param {Vector3} direction - The (normalized) direction vector. + * @return {boolean} Whether the triangle is oriented towards the given direction or not. + */ + static isFrontFacing(a, b, c, direction) { + _v0$1.subVectors(c, b); + _v1$3.subVectors(a, b); + return _v0$1.cross(_v1$3).dot(direction) < 0 ? true : false; + } + /** + * Sets the triangle's vertices by copying the given values. + * + * @param {Vector3} a - The first corner of the triangle. + * @param {Vector3} b - The second corner of the triangle. + * @param {Vector3} c - The third corner of the triangle. + * @return {Triangle} A reference to this triangle. + */ + set(a, b, c) { + this.a.copy(a); + this.b.copy(b); + this.c.copy(c); + return this; + } + /** + * Sets the triangle's vertices by copying the given array values. + * + * @param {Array} points - An array with 3D points. + * @param {number} i0 - The array index representing the first corner of the triangle. + * @param {number} i1 - The array index representing the second corner of the triangle. + * @param {number} i2 - The array index representing the third corner of the triangle. + * @return {Triangle} A reference to this triangle. + */ + setFromPointsAndIndices(points, i0, i1, i2) { + this.a.copy(points[i0]); + this.b.copy(points[i1]); + this.c.copy(points[i2]); + return this; + } + /** + * Sets the triangle's vertices by copying the given attribute values. + * + * @param {BufferAttribute} attribute - A buffer attribute with 3D points data. + * @param {number} i0 - The attribute index representing the first corner of the triangle. + * @param {number} i1 - The attribute index representing the second corner of the triangle. + * @param {number} i2 - The attribute index representing the third corner of the triangle. + * @return {Triangle} A reference to this triangle. + */ + setFromAttributeAndIndices(attribute, i0, i1, i2) { + this.a.fromBufferAttribute(attribute, i0); + this.b.fromBufferAttribute(attribute, i1); + this.c.fromBufferAttribute(attribute, i2); + return this; + } + /** + * Returns a new triangle with copied values from this instance. + * + * @return {Triangle} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Copies the values of the given triangle to this instance. + * + * @param {Triangle} triangle - The triangle to copy. + * @return {Triangle} A reference to this triangle. + */ + copy(triangle) { + this.a.copy(triangle.a); + this.b.copy(triangle.b); + this.c.copy(triangle.c); + return this; + } + /** + * Computes the area of the triangle. + * + * @return {number} The triangle's area. + */ + getArea() { + _v0$1.subVectors(this.c, this.b); + _v1$3.subVectors(this.a, this.b); + return _v0$1.cross(_v1$3).length() * 0.5; + } + /** + * Computes the midpoint of the triangle. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The triangle's midpoint. + */ + getMidpoint(target) { + return target.addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3); + } + /** + * Computes the normal of the triangle. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The triangle's normal. + */ + getNormal(target) { + return _Triangle.getNormal(this.a, this.b, this.c, target); + } + /** + * Computes a plane the triangle lies within. + * + * @param {Plane} target - The target vector that is used to store the method's result. + * @return {Plane} The plane the triangle lies within. + */ + getPlane(target) { + return target.setFromCoplanarPoints(this.a, this.b, this.c); + } + /** + * Computes a barycentric coordinates from the given vector. + * Returns `null` if the triangle is degenerate. + * + * @param {Vector3} point - A point in 3D space. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The barycentric coordinates for the given point + */ + getBarycoord(point, target) { + return _Triangle.getBarycoord(point, this.a, this.b, this.c, target); + } + /** + * Computes the value barycentrically interpolated for the given point on the + * triangle. Returns `null` if the triangle is degenerate. + * + * @param {Vector3} point - Position of interpolated point. + * @param {Vector3} v1 - Value to interpolate of first vertex. + * @param {Vector3} v2 - Value to interpolate of second vertex. + * @param {Vector3} v3 - Value to interpolate of third vertex. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The interpolated value. + */ + getInterpolation(point, v1, v2, v3, target) { + return _Triangle.getInterpolation(point, this.a, this.b, this.c, v1, v2, v3, target); + } + /** + * Returns `true` if the given point, when projected onto the plane of the + * triangle, lies within the triangle. + * + * @param {Vector3} point - The point in 3D space to test. + * @return {boolean} Whether the given point, when projected onto the plane of the + * triangle, lies within the triangle or not. + */ + containsPoint(point) { + return _Triangle.containsPoint(point, this.a, this.b, this.c); + } + /** + * Returns `true` if the triangle is oriented towards the given direction. + * + * @param {Vector3} direction - The (normalized) direction vector. + * @return {boolean} Whether the triangle is oriented towards the given direction or not. + */ + isFrontFacing(direction) { + return _Triangle.isFrontFacing(this.a, this.b, this.c, direction); + } + /** + * Returns `true` if this triangle intersects with the given box. + * + * @param {Box3} box - The box to intersect. + * @return {boolean} Whether this triangle intersects with the given box or not. + */ + intersectsBox(box) { + return box.intersectsTriangle(this); + } + /** + * Returns the closest point on the triangle to the given point. + * + * @param {Vector3} p - The point to compute the closest point for. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The closest point on the triangle. + */ + closestPointToPoint(p, target) { + const a = this.a, b = this.b, c = this.c; + let v, w; + _vab.subVectors(b, a); + _vac.subVectors(c, a); + _vap.subVectors(p, a); + const d1 = _vab.dot(_vap); + const d2 = _vac.dot(_vap); + if (d1 <= 0 && d2 <= 0) { + return target.copy(a); + } + _vbp.subVectors(p, b); + const d3 = _vab.dot(_vbp); + const d4 = _vac.dot(_vbp); + if (d3 >= 0 && d4 <= d3) { + return target.copy(b); + } + const vc = d1 * d4 - d3 * d2; + if (vc <= 0 && d1 >= 0 && d3 <= 0) { + v = d1 / (d1 - d3); + return target.copy(a).addScaledVector(_vab, v); + } + _vcp.subVectors(p, c); + const d5 = _vab.dot(_vcp); + const d6 = _vac.dot(_vcp); + if (d6 >= 0 && d5 <= d6) { + return target.copy(c); + } + const vb = d5 * d2 - d1 * d6; + if (vb <= 0 && d2 >= 0 && d6 <= 0) { + w = d2 / (d2 - d6); + return target.copy(a).addScaledVector(_vac, w); + } + const va = d3 * d6 - d5 * d4; + if (va <= 0 && d4 - d3 >= 0 && d5 - d6 >= 0) { + _vbc.subVectors(c, b); + w = (d4 - d3) / (d4 - d3 + (d5 - d6)); + return target.copy(b).addScaledVector(_vbc, w); + } + const denom = 1 / (va + vb + vc); + v = vb * denom; + w = vc * denom; + return target.copy(a).addScaledVector(_vab, v).addScaledVector(_vac, w); + } + /** + * Returns `true` if this triangle is equal with the given one. + * + * @param {Triangle} triangle - The triangle to test for equality. + * @return {boolean} Whether this triangle is equal with the given one. + */ + equals(triangle) { + return triangle.a.equals(this.a) && triangle.b.equals(this.b) && triangle.c.equals(this.c); + } +}; +var _colorKeywords = { + "aliceblue": 15792383, + "antiquewhite": 16444375, + "aqua": 65535, + "aquamarine": 8388564, + "azure": 15794175, + "beige": 16119260, + "bisque": 16770244, + "black": 0, + "blanchedalmond": 16772045, + "blue": 255, + "blueviolet": 9055202, + "brown": 10824234, + "burlywood": 14596231, + "cadetblue": 6266528, + "chartreuse": 8388352, + "chocolate": 13789470, + "coral": 16744272, + "cornflowerblue": 6591981, + "cornsilk": 16775388, + "crimson": 14423100, + "cyan": 65535, + "darkblue": 139, + "darkcyan": 35723, + "darkgoldenrod": 12092939, + "darkgray": 11119017, + "darkgreen": 25600, + "darkgrey": 11119017, + "darkkhaki": 12433259, + "darkmagenta": 9109643, + "darkolivegreen": 5597999, + "darkorange": 16747520, + "darkorchid": 10040012, + "darkred": 9109504, + "darksalmon": 15308410, + "darkseagreen": 9419919, + "darkslateblue": 4734347, + "darkslategray": 3100495, + "darkslategrey": 3100495, + "darkturquoise": 52945, + "darkviolet": 9699539, + "deeppink": 16716947, + "deepskyblue": 49151, + "dimgray": 6908265, + "dimgrey": 6908265, + "dodgerblue": 2003199, + "firebrick": 11674146, + "floralwhite": 16775920, + "forestgreen": 2263842, + "fuchsia": 16711935, + "gainsboro": 14474460, + "ghostwhite": 16316671, + "gold": 16766720, + "goldenrod": 14329120, + "gray": 8421504, + "green": 32768, + "greenyellow": 11403055, + "grey": 8421504, + "honeydew": 15794160, + "hotpink": 16738740, + "indianred": 13458524, + "indigo": 4915330, + "ivory": 16777200, + "khaki": 15787660, + "lavender": 15132410, + "lavenderblush": 16773365, + "lawngreen": 8190976, + "lemonchiffon": 16775885, + "lightblue": 11393254, + "lightcoral": 15761536, + "lightcyan": 14745599, + "lightgoldenrodyellow": 16448210, + "lightgray": 13882323, + "lightgreen": 9498256, + "lightgrey": 13882323, + "lightpink": 16758465, + "lightsalmon": 16752762, + "lightseagreen": 2142890, + "lightskyblue": 8900346, + "lightslategray": 7833753, + "lightslategrey": 7833753, + "lightsteelblue": 11584734, + "lightyellow": 16777184, + "lime": 65280, + "limegreen": 3329330, + "linen": 16445670, + "magenta": 16711935, + "maroon": 8388608, + "mediumaquamarine": 6737322, + "mediumblue": 205, + "mediumorchid": 12211667, + "mediumpurple": 9662683, + "mediumseagreen": 3978097, + "mediumslateblue": 8087790, + "mediumspringgreen": 64154, + "mediumturquoise": 4772300, + "mediumvioletred": 13047173, + "midnightblue": 1644912, + "mintcream": 16121850, + "mistyrose": 16770273, + "moccasin": 16770229, + "navajowhite": 16768685, + "navy": 128, + "oldlace": 16643558, + "olive": 8421376, + "olivedrab": 7048739, + "orange": 16753920, + "orangered": 16729344, + "orchid": 14315734, + "palegoldenrod": 15657130, + "palegreen": 10025880, + "paleturquoise": 11529966, + "palevioletred": 14381203, + "papayawhip": 16773077, + "peachpuff": 16767673, + "peru": 13468991, + "pink": 16761035, + "plum": 14524637, + "powderblue": 11591910, + "purple": 8388736, + "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 +}; +var _hslA = { h: 0, s: 0, l: 0 }; +var _hslB = { h: 0, s: 0, l: 0 }; +function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t); + return p; +} +var Color = class { + /** + * Constructs a new color. + * + * Note that standard method of specifying color in three.js is with a hexadecimal triplet, + * and that method is used throughout the rest of the documentation. + * + * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are + * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance. + * @param {number} [g] - The green component. + * @param {number} [b] - The blue component. + */ + constructor(r, g, b) { + this.isColor = true; + this.r = 1; + this.g = 1; + this.b = 1; + return this.set(r, g, b); + } + /** + * Sets the colors's components from the given values. + * + * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are + * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance. + * @param {number} [g] - The green component. + * @param {number} [b] - The blue component. + * @return {Color} A reference to this color. + */ + set(r, g, b) { + if (g === void 0 && b === void 0) { + const value = r; + if (value && value.isColor) { + this.copy(value); + } else if (typeof value === "number") { + this.setHex(value); + } else if (typeof value === "string") { + this.setStyle(value); + } + } else { + this.setRGB(r, g, b); + } + return this; + } + /** + * Sets the colors's components to the given scalar value. + * + * @param {number} scalar - The scalar value. + * @return {Color} A reference to this color. + */ + setScalar(scalar) { + this.r = scalar; + this.g = scalar; + this.b = scalar; + return this; + } + /** + * Sets this color from a hexadecimal value. + * + * @param {number} hex - The hexadecimal value. + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setHex(hex, colorSpace = SRGBColorSpace) { + hex = Math.floor(hex); + this.r = (hex >> 16 & 255) / 255; + this.g = (hex >> 8 & 255) / 255; + this.b = (hex & 255) / 255; + ColorManagement.colorSpaceToWorking(this, colorSpace); + return this; + } + /** + * Sets this color from RGB values. + * + * @param {number} r - Red channel value between `0.0` and `1.0`. + * @param {number} g - Green channel value between `0.0` and `1.0`. + * @param {number} b - Blue channel value between `0.0` and `1.0`. + * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setRGB(r, g, b, colorSpace = ColorManagement.workingColorSpace) { + this.r = r; + this.g = g; + this.b = b; + ColorManagement.colorSpaceToWorking(this, colorSpace); + return this; + } + /** + * Sets this color from RGB values. + * + * @param {number} h - Hue value between `0.0` and `1.0`. + * @param {number} s - Saturation value between `0.0` and `1.0`. + * @param {number} l - Lightness value between `0.0` and `1.0`. + * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setHSL(h, s, l, colorSpace = ColorManagement.workingColorSpace) { + h = euclideanModulo(h, 1); + s = clamp(s, 0, 1); + l = clamp(l, 0, 1); + if (s === 0) { + this.r = this.g = this.b = l; + } else { + const p = l <= 0.5 ? l * (1 + s) : l + s - l * s; + const q = 2 * l - p; + this.r = hue2rgb(q, p, h + 1 / 3); + this.g = hue2rgb(q, p, h); + this.b = hue2rgb(q, p, h - 1 / 3); + } + ColorManagement.colorSpaceToWorking(this, colorSpace); + return this; + } + /** + * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`, + * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or + * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) - + * all 140 color names are supported). + * + * @param {string} style - Color as a CSS-style string. + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setStyle(style, colorSpace = SRGBColorSpace) { + function handleAlpha(string) { + if (string === void 0) return; + if (parseFloat(string) < 1) { + warn("Color: Alpha component of " + style + " will be ignored."); + } + } + let m; + if (m = /^(\w+)\(([^\)]*)\)/.exec(style)) { + let color; + const name = m[1]; + const components = m[2]; + switch (name) { + case "rgb": + case "rgba": + if (color = /^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { + handleAlpha(color[4]); + return this.setRGB( + Math.min(255, parseInt(color[1], 10)) / 255, + Math.min(255, parseInt(color[2], 10)) / 255, + Math.min(255, parseInt(color[3], 10)) / 255, + colorSpace + ); + } + if (color = /^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { + handleAlpha(color[4]); + return this.setRGB( + Math.min(100, parseInt(color[1], 10)) / 100, + Math.min(100, parseInt(color[2], 10)) / 100, + Math.min(100, parseInt(color[3], 10)) / 100, + colorSpace + ); + } + break; + case "hsl": + case "hsla": + if (color = /^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(components)) { + handleAlpha(color[4]); + return this.setHSL( + parseFloat(color[1]) / 360, + parseFloat(color[2]) / 100, + parseFloat(color[3]) / 100, + colorSpace + ); + } + break; + default: + warn("Color: Unknown color model " + style); + } + } else if (m = /^\#([A-Fa-f\d]+)$/.exec(style)) { + const hex = m[1]; + const size = hex.length; + if (size === 3) { + return this.setRGB( + parseInt(hex.charAt(0), 16) / 15, + parseInt(hex.charAt(1), 16) / 15, + parseInt(hex.charAt(2), 16) / 15, + colorSpace + ); + } else if (size === 6) { + return this.setHex(parseInt(hex, 16), colorSpace); + } else { + warn("Color: Invalid hex color " + style); + } + } else if (style && style.length > 0) { + return this.setColorName(style, colorSpace); + } + return this; + } + /** + * Sets this color from a color name. Faster than {@link Color#setStyle} if + * you don't need the other CSS-style formats. + * + * For convenience, the list of names is exposed in `Color.NAMES` as a hash. + * ```js + * Color.NAMES.aliceblue // returns 0xF0F8FF + * ``` + * + * @param {string} style - The color name. + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {Color} A reference to this color. + */ + setColorName(style, colorSpace = SRGBColorSpace) { + const hex = _colorKeywords[style.toLowerCase()]; + if (hex !== void 0) { + this.setHex(hex, colorSpace); + } else { + warn("Color: Unknown color " + style); + } + return this; + } + /** + * Returns a new color with copied values from this instance. + * + * @return {Color} A clone of this instance. + */ + clone() { + return new this.constructor(this.r, this.g, this.b); + } + /** + * Copies the values of the given color to this instance. + * + * @param {Color} color - The color to copy. + * @return {Color} A reference to this color. + */ + copy(color) { + this.r = color.r; + this.g = color.g; + this.b = color.b; + return this; + } + /** + * Copies the given color into this color, and then converts this color from + * `SRGBColorSpace` to `LinearSRGBColorSpace`. + * + * @param {Color} color - The color to copy/convert. + * @return {Color} A reference to this color. + */ + copySRGBToLinear(color) { + this.r = SRGBToLinear(color.r); + this.g = SRGBToLinear(color.g); + this.b = SRGBToLinear(color.b); + return this; + } + /** + * Copies the given color into this color, and then converts this color from + * `LinearSRGBColorSpace` to `SRGBColorSpace`. + * + * @param {Color} color - The color to copy/convert. + * @return {Color} A reference to this color. + */ + copyLinearToSRGB(color) { + this.r = LinearToSRGB(color.r); + this.g = LinearToSRGB(color.g); + this.b = LinearToSRGB(color.b); + return this; + } + /** + * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`. + * + * @return {Color} A reference to this color. + */ + convertSRGBToLinear() { + this.copySRGBToLinear(this); + return this; + } + /** + * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`. + * + * @return {Color} A reference to this color. + */ + convertLinearToSRGB() { + this.copyLinearToSRGB(this); + return this; + } + /** + * Returns the hexadecimal value of this color. + * + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {number} The hexadecimal value. + */ + getHex(colorSpace = SRGBColorSpace) { + ColorManagement.workingToColorSpace(_color.copy(this), colorSpace); + return Math.round(clamp(_color.r * 255, 0, 255)) * 65536 + Math.round(clamp(_color.g * 255, 0, 255)) * 256 + Math.round(clamp(_color.b * 255, 0, 255)); + } + /** + * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF'). + * + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {string} The hexadecimal value as a string. + */ + getHexString(colorSpace = SRGBColorSpace) { + return ("000000" + this.getHex(colorSpace).toString(16)).slice(-6); + } + /** + * Converts the colors RGB values into the HSL format and stores them into the + * given target object. + * + * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result. + * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space. + * @return {{h:number,s:number,l:number}} The HSL representation of this color. + */ + getHSL(target, colorSpace = ColorManagement.workingColorSpace) { + ColorManagement.workingToColorSpace(_color.copy(this), colorSpace); + const r = _color.r, g = _color.g, b = _color.b; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + let hue, saturation; + const lightness = (min + max) / 2; + if (min === max) { + hue = 0; + saturation = 0; + } else { + const delta = max - min; + saturation = lightness <= 0.5 ? delta / (max + min) : delta / (2 - max - min); + switch (max) { + case r: + hue = (g - b) / delta + (g < b ? 6 : 0); + break; + case g: + hue = (b - r) / delta + 2; + break; + case b: + hue = (r - g) / delta + 4; + break; + } + hue /= 6; + } + target.h = hue; + target.s = saturation; + target.l = lightness; + return target; + } + /** + * Returns the RGB values of this color and stores them into the given target object. + * + * @param {Color} target - The target color that is used to store the method's result. + * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space. + * @return {Color} The RGB representation of this color. + */ + getRGB(target, colorSpace = ColorManagement.workingColorSpace) { + ColorManagement.workingToColorSpace(_color.copy(this), colorSpace); + target.r = _color.r; + target.g = _color.g; + target.b = _color.b; + return target; + } + /** + * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`. + * + * @param {string} [colorSpace=SRGBColorSpace] - The color space. + * @return {string} The CSS representation of this color. + */ + getStyle(colorSpace = SRGBColorSpace) { + ColorManagement.workingToColorSpace(_color.copy(this), colorSpace); + const r = _color.r, g = _color.g, b = _color.b; + if (colorSpace !== SRGBColorSpace) { + return `color(${colorSpace} ${r.toFixed(3)} ${g.toFixed(3)} ${b.toFixed(3)})`; + } + return `rgb(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)})`; + } + /** + * Adds the given HSL values to this color's values. + * Internally, this converts the color's RGB values to HSL, adds HSL + * and then converts the color back to RGB. + * + * @param {number} h - Hue value between `0.0` and `1.0`. + * @param {number} s - Saturation value between `0.0` and `1.0`. + * @param {number} l - Lightness value between `0.0` and `1.0`. + * @return {Color} A reference to this color. + */ + offsetHSL(h, s, l) { + this.getHSL(_hslA); + return this.setHSL(_hslA.h + h, _hslA.s + s, _hslA.l + l); + } + /** + * Adds the RGB values of the given color to the RGB values of this color. + * + * @param {Color} color - The color to add. + * @return {Color} A reference to this color. + */ + add(color) { + this.r += color.r; + this.g += color.g; + this.b += color.b; + return this; + } + /** + * Adds the RGB values of the given colors and stores the result in this instance. + * + * @param {Color} color1 - The first color. + * @param {Color} color2 - The second color. + * @return {Color} A reference to this color. + */ + addColors(color1, color2) { + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + return this; + } + /** + * Adds the given scalar value to the RGB values of this color. + * + * @param {number} s - The scalar to add. + * @return {Color} A reference to this color. + */ + addScalar(s) { + this.r += s; + this.g += s; + this.b += s; + return this; + } + /** + * Subtracts the RGB values of the given color from the RGB values of this color. + * + * @param {Color} color - The color to subtract. + * @return {Color} A reference to this color. + */ + sub(color) { + this.r = Math.max(0, this.r - color.r); + this.g = Math.max(0, this.g - color.g); + this.b = Math.max(0, this.b - color.b); + return this; + } + /** + * Multiplies the RGB values of the given color with the RGB values of this color. + * + * @param {Color} color - The color to multiply. + * @return {Color} A reference to this color. + */ + multiply(color) { + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + return this; + } + /** + * Multiplies the given scalar value with the RGB values of this color. + * + * @param {number} s - The scalar to multiply. + * @return {Color} A reference to this color. + */ + multiplyScalar(s) { + this.r *= s; + this.g *= s; + this.b *= s; + return this; + } + /** + * Linearly interpolates this color's RGB values toward the RGB values of the + * given color. The alpha argument can be thought of as the ratio between + * the two colors, where `0.0` is this color and `1.0` is the first argument. + * + * @param {Color} color - The color to converge on. + * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`. + * @return {Color} A reference to this color. + */ + lerp(color, alpha) { + this.r += (color.r - this.r) * alpha; + this.g += (color.g - this.g) * alpha; + this.b += (color.b - this.b) * alpha; + return this; + } + /** + * Linearly interpolates between the given colors and stores the result in this instance. + * The alpha argument can be thought of as the ratio between the two colors, where `0.0` + * is the first and `1.0` is the second color. + * + * @param {Color} color1 - The first color. + * @param {Color} color2 - The second color. + * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`. + * @return {Color} A reference to this color. + */ + lerpColors(color1, color2, alpha) { + this.r = color1.r + (color2.r - color1.r) * alpha; + this.g = color1.g + (color2.g - color1.g) * alpha; + this.b = color1.b + (color2.b - color1.b) * alpha; + return this; + } + /** + * Linearly interpolates this color's HSL values toward the HSL values of the + * given color. It differs from {@link Color#lerp} by not interpolating straight + * from one color to the other, but instead going through all the hues in between + * those two colors. The alpha argument can be thought of as the ratio between + * the two colors, where 0.0 is this color and 1.0 is the first argument. + * + * @param {Color} color - The color to converge on. + * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`. + * @return {Color} A reference to this color. + */ + lerpHSL(color, alpha) { + this.getHSL(_hslA); + color.getHSL(_hslB); + const h = lerp(_hslA.h, _hslB.h, alpha); + const s = lerp(_hslA.s, _hslB.s, alpha); + const l = lerp(_hslA.l, _hslB.l, alpha); + this.setHSL(h, s, l); + return this; + } + /** + * Sets the color's RGB components from the given 3D vector. + * + * @param {Vector3} v - The vector to set. + * @return {Color} A reference to this color. + */ + setFromVector3(v) { + this.r = v.x; + this.g = v.y; + this.b = v.z; + return this; + } + /** + * Transforms this color with the given 3x3 matrix. + * + * @param {Matrix3} m - The matrix. + * @return {Color} A reference to this color. + */ + applyMatrix3(m) { + const r = this.r, g = this.g, b = this.b; + const e = m.elements; + this.r = e[0] * r + e[3] * g + e[6] * b; + this.g = e[1] * r + e[4] * g + e[7] * b; + this.b = e[2] * r + e[5] * g + e[8] * b; + return this; + } + /** + * Returns `true` if this color is equal with the given one. + * + * @param {Color} c - The color to test for equality. + * @return {boolean} Whether this bounding color is equal with the given one. + */ + equals(c) { + return c.r === this.r && c.g === this.g && c.b === this.b; + } + /** + * Sets this color's RGB components from the given array. + * + * @param {Array} array - An array holding the RGB values. + * @param {number} [offset=0] - The offset into the array. + * @return {Color} A reference to this color. + */ + fromArray(array, offset = 0) { + this.r = array[offset]; + this.g = array[offset + 1]; + this.b = array[offset + 2]; + return this; + } + /** + * Writes the RGB components of this color to the given array. If no array is provided, + * the method returns a new instance. + * + * @param {Array} [array=[]] - The target array holding the color components. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Array} The color components. + */ + toArray(array = [], offset = 0) { + array[offset] = this.r; + array[offset + 1] = this.g; + array[offset + 2] = this.b; + return array; + } + /** + * Sets the components of this color from the given buffer attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute holding color data. + * @param {number} index - The index into the attribute. + * @return {Color} A reference to this color. + */ + fromBufferAttribute(attribute, index) { + this.r = attribute.getX(index); + this.g = attribute.getY(index); + this.b = attribute.getZ(index); + return this; + } + /** + * This methods defines the serialization result of this class. Returns the color + * as a hexadecimal value. + * + * @return {number} The hexadecimal value. + */ + toJSON() { + return this.getHex(); + } + *[Symbol.iterator]() { + yield this.r; + yield this.g; + yield this.b; + } +}; +var _color = new Color(); +Color.NAMES = _colorKeywords; +var _materialId = 0; +var Material = class extends EventDispatcher { + /** + * Constructs a new material. + */ + constructor() { + super(); + this.isMaterial = true; + Object.defineProperty(this, "id", { value: _materialId++ }); + this.uuid = generateUUID(); + this.name = ""; + this.type = "Material"; + this.blending = NormalBlending; + this.side = FrontSide; + this.vertexColors = false; + this.opacity = 1; + this.transparent = false; + this.alphaHash = false; + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + this.blendColor = new Color(0, 0, 0); + this.blendAlpha = 0; + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + this.stencilWriteMask = 255; + this.stencilFunc = AlwaysStencilFunc; + this.stencilRef = 0; + this.stencilFuncMask = 255; + this.stencilFail = KeepStencilOp; + this.stencilZFail = KeepStencilOp; + this.stencilZPass = KeepStencilOp; + this.stencilWrite = false; + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + this.shadowSide = null; + this.colorWrite = true; + this.precision = null; + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + this.dithering = false; + this.alphaToCoverage = false; + this.premultipliedAlpha = false; + this.forceSinglePass = false; + this.allowOverride = true; + this.visible = true; + this.toneMapped = true; + this.userData = {}; + this.version = 0; + this._alphaTest = 0; + } + /** + * Sets the alpha value to be used when running an alpha test. The material + * will not be rendered if the opacity is lower than this value. + * + * @type {number} + * @readonly + * @default 0 + */ + get alphaTest() { + return this._alphaTest; + } + set alphaTest(value) { + if (this._alphaTest > 0 !== value > 0) { + this.version++; + } + this._alphaTest = value; + } + /** + * An optional callback that is executed immediately before the material is used to render a 3D object. + * + * This method can only be used when rendering with {@link WebGLRenderer}. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Scene} scene - The scene. + * @param {Camera} camera - The camera that is used to render the scene. + * @param {BufferGeometry} geometry - The 3D object's geometry. + * @param {Object3D} object - The 3D object. + * @param {Object} group - The geometry group data. + */ + onBeforeRender() { + } + /** + * An optional callback that is executed immediately before the shader + * program is compiled. This function is called with the shader source code + * as a parameter. Useful for the modification of built-in materials. + * + * This method can only be used when rendering with {@link WebGLRenderer}. The + * recommended approach when customizing materials is to use `WebGPURenderer` with the new + * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language). + * + * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source. + * @param {WebGLRenderer} renderer - A reference to the renderer. + */ + onBeforeCompile() { + } + /** + * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify + * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached + * shader or recompile the shader for this material as needed. + * + * This method can only be used when rendering with {@link WebGLRenderer}. + * + * @return {string} The custom program cache key. + */ + customProgramCacheKey() { + return this.onBeforeCompile.toString(); + } + /** + * This method can be used to set default values from parameter objects. + * It is a generic implementation so it can be used with different types + * of materials. + * + * @param {Object} [values] - The material values to set. + */ + setValues(values) { + if (values === void 0) return; + for (const key in values) { + const newValue = values[key]; + if (newValue === void 0) { + warn(`Material: parameter '${key}' has value of undefined.`); + continue; + } + const currentValue = this[key]; + if (currentValue === void 0) { + warn(`Material: '${key}' is not a property of THREE.${this.type}.`); + continue; + } + if (currentValue && currentValue.isColor) { + currentValue.set(newValue); + } else if (currentValue && currentValue.isVector3 && (newValue && newValue.isVector3)) { + currentValue.copy(newValue); + } else { + this[key] = newValue; + } + } + } + /** + * Serializes the material into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized material. + * @see {@link ObjectLoader#parse} + */ + toJSON(meta) { + const isRootObject = meta === void 0 || typeof meta === "string"; + if (isRootObject) { + meta = { + textures: {}, + images: {} + }; + } + const data = { + metadata: { + version: 4.7, + type: "Material", + generator: "Material.toJSON" + } + }; + data.uuid = this.uuid; + data.type = this.type; + if (this.name !== "") data.name = this.name; + if (this.color && this.color.isColor) data.color = this.color.getHex(); + if (this.roughness !== void 0) data.roughness = this.roughness; + if (this.metalness !== void 0) data.metalness = this.metalness; + if (this.sheen !== void 0) data.sheen = this.sheen; + if (this.sheenColor && this.sheenColor.isColor) data.sheenColor = this.sheenColor.getHex(); + if (this.sheenRoughness !== void 0) data.sheenRoughness = this.sheenRoughness; + if (this.emissive && this.emissive.isColor) data.emissive = this.emissive.getHex(); + if (this.emissiveIntensity !== void 0 && this.emissiveIntensity !== 1) data.emissiveIntensity = this.emissiveIntensity; + if (this.specular && this.specular.isColor) data.specular = this.specular.getHex(); + if (this.specularIntensity !== void 0) data.specularIntensity = this.specularIntensity; + if (this.specularColor && this.specularColor.isColor) data.specularColor = this.specularColor.getHex(); + if (this.shininess !== void 0) data.shininess = this.shininess; + if (this.clearcoat !== void 0) data.clearcoat = this.clearcoat; + if (this.clearcoatRoughness !== void 0) data.clearcoatRoughness = this.clearcoatRoughness; + if (this.clearcoatMap && this.clearcoatMap.isTexture) { + data.clearcoatMap = this.clearcoatMap.toJSON(meta).uuid; + } + if (this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture) { + data.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(meta).uuid; + } + if (this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture) { + data.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(meta).uuid; + data.clearcoatNormalScale = this.clearcoatNormalScale.toArray(); + } + if (this.sheenColorMap && this.sheenColorMap.isTexture) { + data.sheenColorMap = this.sheenColorMap.toJSON(meta).uuid; + } + if (this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture) { + data.sheenRoughnessMap = this.sheenRoughnessMap.toJSON(meta).uuid; + } + if (this.dispersion !== void 0) data.dispersion = this.dispersion; + if (this.iridescence !== void 0) data.iridescence = this.iridescence; + if (this.iridescenceIOR !== void 0) data.iridescenceIOR = this.iridescenceIOR; + if (this.iridescenceThicknessRange !== void 0) data.iridescenceThicknessRange = this.iridescenceThicknessRange; + if (this.iridescenceMap && this.iridescenceMap.isTexture) { + data.iridescenceMap = this.iridescenceMap.toJSON(meta).uuid; + } + if (this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture) { + data.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON(meta).uuid; + } + if (this.anisotropy !== void 0) data.anisotropy = this.anisotropy; + if (this.anisotropyRotation !== void 0) data.anisotropyRotation = this.anisotropyRotation; + if (this.anisotropyMap && this.anisotropyMap.isTexture) { + data.anisotropyMap = this.anisotropyMap.toJSON(meta).uuid; + } + if (this.map && this.map.isTexture) data.map = this.map.toJSON(meta).uuid; + if (this.matcap && this.matcap.isTexture) data.matcap = this.matcap.toJSON(meta).uuid; + if (this.alphaMap && this.alphaMap.isTexture) data.alphaMap = this.alphaMap.toJSON(meta).uuid; + if (this.lightMap && this.lightMap.isTexture) { + data.lightMap = this.lightMap.toJSON(meta).uuid; + data.lightMapIntensity = this.lightMapIntensity; + } + if (this.aoMap && this.aoMap.isTexture) { + data.aoMap = this.aoMap.toJSON(meta).uuid; + data.aoMapIntensity = this.aoMapIntensity; + } + if (this.bumpMap && this.bumpMap.isTexture) { + data.bumpMap = this.bumpMap.toJSON(meta).uuid; + data.bumpScale = this.bumpScale; + } + if (this.normalMap && this.normalMap.isTexture) { + data.normalMap = this.normalMap.toJSON(meta).uuid; + data.normalMapType = this.normalMapType; + data.normalScale = this.normalScale.toArray(); + } + if (this.displacementMap && this.displacementMap.isTexture) { + data.displacementMap = this.displacementMap.toJSON(meta).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + } + if (this.roughnessMap && this.roughnessMap.isTexture) data.roughnessMap = this.roughnessMap.toJSON(meta).uuid; + if (this.metalnessMap && this.metalnessMap.isTexture) data.metalnessMap = this.metalnessMap.toJSON(meta).uuid; + if (this.emissiveMap && this.emissiveMap.isTexture) data.emissiveMap = this.emissiveMap.toJSON(meta).uuid; + if (this.specularMap && this.specularMap.isTexture) data.specularMap = this.specularMap.toJSON(meta).uuid; + if (this.specularIntensityMap && this.specularIntensityMap.isTexture) data.specularIntensityMap = this.specularIntensityMap.toJSON(meta).uuid; + if (this.specularColorMap && this.specularColorMap.isTexture) data.specularColorMap = this.specularColorMap.toJSON(meta).uuid; + if (this.envMap && this.envMap.isTexture) { + data.envMap = this.envMap.toJSON(meta).uuid; + if (this.combine !== void 0) data.combine = this.combine; + } + if (this.envMapRotation !== void 0) data.envMapRotation = this.envMapRotation.toArray(); + if (this.envMapIntensity !== void 0) data.envMapIntensity = this.envMapIntensity; + if (this.reflectivity !== void 0) data.reflectivity = this.reflectivity; + if (this.refractionRatio !== void 0) data.refractionRatio = this.refractionRatio; + if (this.gradientMap && this.gradientMap.isTexture) { + data.gradientMap = this.gradientMap.toJSON(meta).uuid; + } + if (this.transmission !== void 0) data.transmission = this.transmission; + if (this.transmissionMap && this.transmissionMap.isTexture) data.transmissionMap = this.transmissionMap.toJSON(meta).uuid; + if (this.thickness !== void 0) data.thickness = this.thickness; + if (this.thicknessMap && this.thicknessMap.isTexture) data.thicknessMap = this.thicknessMap.toJSON(meta).uuid; + if (this.attenuationDistance !== void 0 && this.attenuationDistance !== Infinity) data.attenuationDistance = this.attenuationDistance; + if (this.attenuationColor !== void 0) data.attenuationColor = this.attenuationColor.getHex(); + if (this.size !== void 0) data.size = this.size; + if (this.shadowSide !== null) data.shadowSide = this.shadowSide; + if (this.sizeAttenuation !== void 0) data.sizeAttenuation = this.sizeAttenuation; + if (this.blending !== NormalBlending) data.blending = this.blending; + if (this.side !== FrontSide) data.side = this.side; + if (this.vertexColors === true) data.vertexColors = true; + if (this.opacity < 1) data.opacity = this.opacity; + if (this.transparent === true) data.transparent = true; + if (this.blendSrc !== SrcAlphaFactor) data.blendSrc = this.blendSrc; + if (this.blendDst !== OneMinusSrcAlphaFactor) data.blendDst = this.blendDst; + if (this.blendEquation !== AddEquation) data.blendEquation = this.blendEquation; + if (this.blendSrcAlpha !== null) data.blendSrcAlpha = this.blendSrcAlpha; + if (this.blendDstAlpha !== null) data.blendDstAlpha = this.blendDstAlpha; + if (this.blendEquationAlpha !== null) data.blendEquationAlpha = this.blendEquationAlpha; + if (this.blendColor && this.blendColor.isColor) data.blendColor = this.blendColor.getHex(); + if (this.blendAlpha !== 0) data.blendAlpha = this.blendAlpha; + if (this.depthFunc !== LessEqualDepth) data.depthFunc = this.depthFunc; + if (this.depthTest === false) data.depthTest = this.depthTest; + if (this.depthWrite === false) data.depthWrite = this.depthWrite; + if (this.colorWrite === false) data.colorWrite = this.colorWrite; + if (this.stencilWriteMask !== 255) data.stencilWriteMask = this.stencilWriteMask; + if (this.stencilFunc !== AlwaysStencilFunc) data.stencilFunc = this.stencilFunc; + if (this.stencilRef !== 0) data.stencilRef = this.stencilRef; + if (this.stencilFuncMask !== 255) data.stencilFuncMask = this.stencilFuncMask; + if (this.stencilFail !== KeepStencilOp) data.stencilFail = this.stencilFail; + if (this.stencilZFail !== KeepStencilOp) data.stencilZFail = this.stencilZFail; + if (this.stencilZPass !== KeepStencilOp) data.stencilZPass = this.stencilZPass; + if (this.stencilWrite === true) data.stencilWrite = this.stencilWrite; + if (this.rotation !== void 0 && this.rotation !== 0) data.rotation = this.rotation; + if (this.polygonOffset === true) data.polygonOffset = true; + if (this.polygonOffsetFactor !== 0) data.polygonOffsetFactor = this.polygonOffsetFactor; + if (this.polygonOffsetUnits !== 0) data.polygonOffsetUnits = this.polygonOffsetUnits; + if (this.linewidth !== void 0 && this.linewidth !== 1) data.linewidth = this.linewidth; + if (this.dashSize !== void 0) data.dashSize = this.dashSize; + if (this.gapSize !== void 0) data.gapSize = this.gapSize; + if (this.scale !== void 0) data.scale = this.scale; + if (this.dithering === true) data.dithering = true; + if (this.alphaTest > 0) data.alphaTest = this.alphaTest; + if (this.alphaHash === true) data.alphaHash = true; + if (this.alphaToCoverage === true) data.alphaToCoverage = true; + if (this.premultipliedAlpha === true) data.premultipliedAlpha = true; + if (this.forceSinglePass === true) data.forceSinglePass = true; + if (this.allowOverride === false) data.allowOverride = false; + if (this.wireframe === true) data.wireframe = true; + if (this.wireframeLinewidth > 1) data.wireframeLinewidth = this.wireframeLinewidth; + if (this.wireframeLinecap !== "round") data.wireframeLinecap = this.wireframeLinecap; + if (this.wireframeLinejoin !== "round") data.wireframeLinejoin = this.wireframeLinejoin; + if (this.flatShading === true) data.flatShading = true; + if (this.visible === false) data.visible = false; + if (this.toneMapped === false) data.toneMapped = false; + if (this.fog === false) data.fog = false; + if (Object.keys(this.userData).length > 0) data.userData = this.userData; + function extractFromCache(cache) { + const values = []; + for (const key in cache) { + const data2 = cache[key]; + delete data2.metadata; + values.push(data2); + } + return values; + } + if (isRootObject) { + const textures = extractFromCache(meta.textures); + const images = extractFromCache(meta.images); + if (textures.length > 0) data.textures = textures; + if (images.length > 0) data.images = images; + } + return data; + } + /** + * Returns a new material with copied values from this instance. + * + * @return {Material} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Copies the values of the given material to this instance. + * + * @param {Material} source - The material to copy. + * @return {Material} A reference to this instance. + */ + copy(source) { + this.name = source.name; + this.blending = source.blending; + this.side = source.side; + this.vertexColors = source.vertexColors; + this.opacity = source.opacity; + this.transparent = source.transparent; + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + this.blendColor.copy(source.blendColor); + this.blendAlpha = source.blendAlpha; + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + this.stencilWriteMask = source.stencilWriteMask; + this.stencilFunc = source.stencilFunc; + this.stencilRef = source.stencilRef; + this.stencilFuncMask = source.stencilFuncMask; + this.stencilFail = source.stencilFail; + this.stencilZFail = source.stencilZFail; + this.stencilZPass = source.stencilZPass; + this.stencilWrite = source.stencilWrite; + const srcPlanes = source.clippingPlanes; + let dstPlanes = null; + if (srcPlanes !== null) { + const n = srcPlanes.length; + dstPlanes = new Array(n); + for (let i = 0; i !== n; ++i) { + dstPlanes[i] = srcPlanes[i].clone(); + } + } + this.clippingPlanes = dstPlanes; + this.clipIntersection = source.clipIntersection; + this.clipShadows = source.clipShadows; + this.shadowSide = source.shadowSide; + this.colorWrite = source.colorWrite; + this.precision = source.precision; + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + this.dithering = source.dithering; + this.alphaTest = source.alphaTest; + this.alphaHash = source.alphaHash; + this.alphaToCoverage = source.alphaToCoverage; + this.premultipliedAlpha = source.premultipliedAlpha; + this.forceSinglePass = source.forceSinglePass; + this.allowOverride = source.allowOverride; + this.visible = source.visible; + this.toneMapped = source.toneMapped; + this.userData = JSON.parse(JSON.stringify(source.userData)); + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + * + * @fires Material#dispose + */ + dispose() { + this.dispatchEvent({ type: "dispose" }); + } + /** + * Setting this property to `true` indicates the engine the material + * needs to be recompiled. + * + * @type {boolean} + * @default false + * @param {boolean} value + */ + set needsUpdate(value) { + if (value === true) this.version++; + } +}; +var MeshBasicMaterial = class extends Material { + /** + * Constructs a new mesh basic material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshBasicMaterial = true; + this.type = "MeshBasicMaterial"; + this.color = new Color(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.envMapRotation = new Euler(); + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.specularMap = source.specularMap; + this.alphaMap = source.alphaMap; + this.envMap = source.envMap; + this.envMapRotation.copy(source.envMapRotation); + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.fog = source.fog; + return this; + } +}; +var _tables = _generateTables(); +function _generateTables() { + const buffer = new ArrayBuffer(4); + const floatView = new Float32Array(buffer); + const uint32View = new Uint32Array(buffer); + const baseTable = new Uint32Array(512); + const shiftTable = new Uint32Array(512); + for (let i = 0; i < 256; ++i) { + const e = i - 127; + if (e < -27) { + baseTable[i] = 0; + baseTable[i | 256] = 32768; + shiftTable[i] = 24; + shiftTable[i | 256] = 24; + } else if (e < -14) { + baseTable[i] = 1024 >> -e - 14; + baseTable[i | 256] = 1024 >> -e - 14 | 32768; + shiftTable[i] = -e - 1; + shiftTable[i | 256] = -e - 1; + } else if (e <= 15) { + baseTable[i] = e + 15 << 10; + baseTable[i | 256] = e + 15 << 10 | 32768; + shiftTable[i] = 13; + shiftTable[i | 256] = 13; + } else if (e < 128) { + baseTable[i] = 31744; + baseTable[i | 256] = 64512; + shiftTable[i] = 24; + shiftTable[i | 256] = 24; + } else { + baseTable[i] = 31744; + baseTable[i | 256] = 64512; + shiftTable[i] = 13; + shiftTable[i | 256] = 13; + } + } + const mantissaTable = new Uint32Array(2048); + const exponentTable = new Uint32Array(64); + const offsetTable = new Uint32Array(64); + for (let i = 1; i < 1024; ++i) { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + m <<= 1; + e -= 8388608; + } + m &= -8388609; + e += 947912704; + mantissaTable[i] = m | e; + } + for (let i = 1024; i < 2048; ++i) { + mantissaTable[i] = 939524096 + (i - 1024 << 13); + } + for (let i = 1; i < 31; ++i) { + exponentTable[i] = i << 23; + } + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + for (let i = 33; i < 63; ++i) { + exponentTable[i] = 2147483648 + (i - 32 << 23); + } + exponentTable[63] = 3347054592; + for (let i = 1; i < 64; ++i) { + if (i !== 32) { + offsetTable[i] = 1024; + } + } + return { + floatView, + uint32View, + baseTable, + shiftTable, + mantissaTable, + exponentTable, + offsetTable + }; +} +function toHalfFloat(val) { + if (Math.abs(val) > 65504) warn("DataUtils.toHalfFloat(): Value out of range."); + val = clamp(val, -65504, 65504); + _tables.floatView[0] = val; + const f = _tables.uint32View[0]; + const e = f >> 23 & 511; + return _tables.baseTable[e] + ((f & 8388607) >> _tables.shiftTable[e]); +} +function fromHalfFloat(val) { + const m = val >> 10; + _tables.uint32View[0] = _tables.mantissaTable[_tables.offsetTable[m] + (val & 1023)] + _tables.exponentTable[m]; + return _tables.floatView[0]; +} +var DataUtils = class { + /** + * Returns a half precision floating point value (FP16) from the given single + * precision floating point value (FP32). + * + * @param {number} val - A single precision floating point value. + * @return {number} The FP16 value. + */ + static toHalfFloat(val) { + return toHalfFloat(val); + } + /** + * Returns a single precision floating point value (FP32) from the given half + * precision floating point value (FP16). + * + * @param {number} val - A half precision floating point value. + * @return {number} The FP32 value. + */ + static fromHalfFloat(val) { + return fromHalfFloat(val); + } +}; +var _vector$9 = new Vector3(); +var _vector2$1 = new Vector2(); +var _id$2 = 0; +var BufferAttribute = class { + /** + * Constructs a new buffer attribute. + * + * @param {TypedArray} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized = false) { + if (Array.isArray(array)) { + throw new TypeError("THREE.BufferAttribute: array should be a Typed Array."); + } + this.isBufferAttribute = true; + Object.defineProperty(this, "id", { value: _id$2++ }); + this.name = ""; + this.array = array; + this.itemSize = itemSize; + this.count = array !== void 0 ? array.length / itemSize : 0; + this.normalized = normalized; + this.usage = StaticDrawUsage; + this.updateRanges = []; + this.gpuType = FloatType; + this.version = 0; + } + /** + * A callback function that is executed after the renderer has transferred the attribute + * array data to the GPU. + */ + onUploadCallback() { + } + /** + * Flag to indicate that this attribute has changed and should be re-sent to + * the GPU. Set this to `true` when you modify the value of the array. + * + * @type {number} + * @default false + * @param {boolean} value + */ + set needsUpdate(value) { + if (value === true) this.version++; + } + /** + * Sets the usage of this buffer attribute. + * + * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set. + * @return {BufferAttribute} A reference to this buffer attribute. + */ + setUsage(value) { + this.usage = value; + return this; + } + /** + * Adds a range of data in the data array to be updated on the GPU. + * + * @param {number} start - Position at which to start update. + * @param {number} count - The number of components to update. + */ + addUpdateRange(start, count) { + this.updateRanges.push({ start, count }); + } + /** + * Clears the update ranges. + */ + clearUpdateRanges() { + this.updateRanges.length = 0; + } + /** + * Copies the values of the given buffer attribute to this instance. + * + * @param {BufferAttribute} source - The buffer attribute to copy. + * @return {BufferAttribute} A reference to this instance. + */ + copy(source) { + this.name = source.name; + this.array = new source.array.constructor(source.array); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + this.usage = source.usage; + this.gpuType = source.gpuType; + return this; + } + /** + * Copies a vector from the given buffer attribute to this one. The start + * and destination position in the attribute buffers are represented by the + * given indices. + * + * @param {number} index1 - The destination index into this buffer attribute. + * @param {BufferAttribute} attribute - The buffer attribute to copy from. + * @param {number} index2 - The source index into the given buffer attribute. + * @return {BufferAttribute} A reference to this instance. + */ + copyAt(index1, attribute, index2) { + index1 *= this.itemSize; + index2 *= attribute.itemSize; + for (let i = 0, l = this.itemSize; i < l; i++) { + this.array[index1 + i] = attribute.array[index2 + i]; + } + return this; + } + /** + * Copies the given array data into this buffer attribute. + * + * @param {(TypedArray|Array)} array - The array to copy. + * @return {BufferAttribute} A reference to this instance. + */ + copyArray(array) { + this.array.set(array); + return this; + } + /** + * Applies the given 3x3 matrix to the given attribute. Works with + * item size `2` and `3`. + * + * @param {Matrix3} m - The matrix to apply. + * @return {BufferAttribute} A reference to this instance. + */ + applyMatrix3(m) { + if (this.itemSize === 2) { + for (let i = 0, l = this.count; i < l; i++) { + _vector2$1.fromBufferAttribute(this, i); + _vector2$1.applyMatrix3(m); + this.setXY(i, _vector2$1.x, _vector2$1.y); + } + } else if (this.itemSize === 3) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$9.fromBufferAttribute(this, i); + _vector$9.applyMatrix3(m); + this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); + } + } + return this; + } + /** + * Applies the given 4x4 matrix to the given attribute. Only works with + * item size `3`. + * + * @param {Matrix4} m - The matrix to apply. + * @return {BufferAttribute} A reference to this instance. + */ + applyMatrix4(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$9.fromBufferAttribute(this, i); + _vector$9.applyMatrix4(m); + this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); + } + return this; + } + /** + * Applies the given 3x3 normal matrix to the given attribute. Only works with + * item size `3`. + * + * @param {Matrix3} m - The normal matrix to apply. + * @return {BufferAttribute} A reference to this instance. + */ + applyNormalMatrix(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$9.fromBufferAttribute(this, i); + _vector$9.applyNormalMatrix(m); + this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); + } + return this; + } + /** + * Applies the given 4x4 matrix to the given attribute. Only works with + * item size `3` and with direction vectors. + * + * @param {Matrix4} m - The matrix to apply. + * @return {BufferAttribute} A reference to this instance. + */ + transformDirection(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$9.fromBufferAttribute(this, i); + _vector$9.transformDirection(m); + this.setXYZ(i, _vector$9.x, _vector$9.y, _vector$9.z); + } + return this; + } + /** + * Sets the given array data in the buffer attribute. + * + * @param {(TypedArray|Array)} value - The array data to set. + * @param {number} [offset=0] - The offset in this buffer attribute's array. + * @return {BufferAttribute} A reference to this instance. + */ + set(value, offset = 0) { + this.array.set(value, offset); + return this; + } + /** + * Returns the given component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} component - The component index. + * @return {number} The returned value. + */ + getComponent(index, component) { + let value = this.array[index * this.itemSize + component]; + if (this.normalized) value = denormalize(value, this.array); + return value; + } + /** + * Sets the given value to the given component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} component - The component index. + * @param {number} value - The value to set. + * @return {BufferAttribute} A reference to this instance. + */ + setComponent(index, component, value) { + if (this.normalized) value = normalize(value, this.array); + this.array[index * this.itemSize + component] = value; + return this; + } + /** + * Returns the x component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @return {number} The x component. + */ + getX(index) { + let x = this.array[index * this.itemSize]; + if (this.normalized) x = denormalize(x, this.array); + return x; + } + /** + * Sets the x component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} x - The value to set. + * @return {BufferAttribute} A reference to this instance. + */ + setX(index, x) { + if (this.normalized) x = normalize(x, this.array); + this.array[index * this.itemSize] = x; + return this; + } + /** + * Returns the y component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @return {number} The y component. + */ + getY(index) { + let y = this.array[index * this.itemSize + 1]; + if (this.normalized) y = denormalize(y, this.array); + return y; + } + /** + * Sets the y component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} y - The value to set. + * @return {BufferAttribute} A reference to this instance. + */ + setY(index, y) { + if (this.normalized) y = normalize(y, this.array); + this.array[index * this.itemSize + 1] = y; + return this; + } + /** + * Returns the z component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @return {number} The z component. + */ + getZ(index) { + let z = this.array[index * this.itemSize + 2]; + if (this.normalized) z = denormalize(z, this.array); + return z; + } + /** + * Sets the z component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} z - The value to set. + * @return {BufferAttribute} A reference to this instance. + */ + setZ(index, z) { + if (this.normalized) z = normalize(z, this.array); + this.array[index * this.itemSize + 2] = z; + return this; + } + /** + * Returns the w component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @return {number} The w component. + */ + getW(index) { + let w = this.array[index * this.itemSize + 3]; + if (this.normalized) w = denormalize(w, this.array); + return w; + } + /** + * Sets the w component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} w - The value to set. + * @return {BufferAttribute} A reference to this instance. + */ + setW(index, w) { + if (this.normalized) w = normalize(w, this.array); + this.array[index * this.itemSize + 3] = w; + return this; + } + /** + * Sets the x and y component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} x - The value for the x component to set. + * @param {number} y - The value for the y component to set. + * @return {BufferAttribute} A reference to this instance. + */ + setXY(index, x, y) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + } + this.array[index + 0] = x; + this.array[index + 1] = y; + return this; + } + /** + * Sets the x, y and z component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} x - The value for the x component to set. + * @param {number} y - The value for the y component to set. + * @param {number} z - The value for the z component to set. + * @return {BufferAttribute} A reference to this instance. + */ + setXYZ(index, x, y, z) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + } + this.array[index + 0] = x; + this.array[index + 1] = y; + this.array[index + 2] = z; + return this; + } + /** + * Sets the x, y, z and w component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} x - The value for the x component to set. + * @param {number} y - The value for the y component to set. + * @param {number} z - The value for the z component to set. + * @param {number} w - The value for the w component to set. + * @return {BufferAttribute} A reference to this instance. + */ + setXYZW(index, x, y, z, w) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + w = normalize(w, this.array); + } + this.array[index + 0] = x; + this.array[index + 1] = y; + this.array[index + 2] = z; + this.array[index + 3] = w; + return this; + } + /** + * Sets the given callback function that is executed after the Renderer has transferred + * the attribute array data to the GPU. Can be used to perform clean-up operations after + * the upload when attribute data are not needed anymore on the CPU side. + * + * @param {Function} callback - The `onUpload()` callback. + * @return {BufferAttribute} A reference to this instance. + */ + onUpload(callback) { + this.onUploadCallback = callback; + return this; + } + /** + * Returns a new buffer attribute with copied values from this instance. + * + * @return {BufferAttribute} A clone of this instance. + */ + clone() { + return new this.constructor(this.array, this.itemSize).copy(this); + } + /** + * Serializes the buffer attribute into JSON. + * + * @return {Object} A JSON object representing the serialized buffer attribute. + */ + toJSON() { + const data = { + itemSize: this.itemSize, + type: this.array.constructor.name, + array: Array.from(this.array), + normalized: this.normalized + }; + if (this.name !== "") data.name = this.name; + if (this.usage !== StaticDrawUsage) data.usage = this.usage; + return data; + } +}; +var Int8BufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Int8Array)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Int8Array(array), itemSize, normalized); + } +}; +var Uint8BufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Uint8Array)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Uint8Array(array), itemSize, normalized); + } +}; +var Uint8ClampedBufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Uint8ClampedArray)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Uint8ClampedArray(array), itemSize, normalized); + } +}; +var Int16BufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Int16Array)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Int16Array(array), itemSize, normalized); + } +}; +var Uint16BufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Uint16Array)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Uint16Array(array), itemSize, normalized); + } +}; +var Int32BufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Int32Array)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Int32Array(array), itemSize, normalized); + } +}; +var Uint32BufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Uint32Array)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Uint32Array(array), itemSize, normalized); + } +}; +var Float16BufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Uint16Array)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Uint16Array(array), itemSize, normalized); + this.isFloat16BufferAttribute = true; + } + getX(index) { + let x = fromHalfFloat(this.array[index * this.itemSize]); + if (this.normalized) x = denormalize(x, this.array); + return x; + } + setX(index, x) { + if (this.normalized) x = normalize(x, this.array); + this.array[index * this.itemSize] = toHalfFloat(x); + return this; + } + getY(index) { + let y = fromHalfFloat(this.array[index * this.itemSize + 1]); + if (this.normalized) y = denormalize(y, this.array); + return y; + } + setY(index, y) { + if (this.normalized) y = normalize(y, this.array); + this.array[index * this.itemSize + 1] = toHalfFloat(y); + return this; + } + getZ(index) { + let z = fromHalfFloat(this.array[index * this.itemSize + 2]); + if (this.normalized) z = denormalize(z, this.array); + return z; + } + setZ(index, z) { + if (this.normalized) z = normalize(z, this.array); + this.array[index * this.itemSize + 2] = toHalfFloat(z); + return this; + } + getW(index) { + let w = fromHalfFloat(this.array[index * this.itemSize + 3]); + if (this.normalized) w = denormalize(w, this.array); + return w; + } + setW(index, w) { + if (this.normalized) w = normalize(w, this.array); + this.array[index * this.itemSize + 3] = toHalfFloat(w); + return this; + } + setXY(index, x, y) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + } + this.array[index + 0] = toHalfFloat(x); + this.array[index + 1] = toHalfFloat(y); + return this; + } + setXYZ(index, x, y, z) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + } + this.array[index + 0] = toHalfFloat(x); + this.array[index + 1] = toHalfFloat(y); + this.array[index + 2] = toHalfFloat(z); + return this; + } + setXYZW(index, x, y, z, w) { + index *= this.itemSize; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + w = normalize(w, this.array); + } + this.array[index + 0] = toHalfFloat(x); + this.array[index + 1] = toHalfFloat(y); + this.array[index + 2] = toHalfFloat(z); + this.array[index + 3] = toHalfFloat(w); + return this; + } +}; +var Float32BufferAttribute = class extends BufferAttribute { + /** + * Constructs a new buffer attribute. + * + * @param {(Array|Float32Array)} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(array, itemSize, normalized) { + super(new Float32Array(array), itemSize, normalized); + } +}; +var _id$1 = 0; +var _m1 = new Matrix4(); +var _obj = new Object3D(); +var _offset = new Vector3(); +var _box$2 = new Box3(); +var _boxMorphTargets = new Box3(); +var _vector$8 = new Vector3(); +var BufferGeometry = class _BufferGeometry extends EventDispatcher { + /** + * Constructs a new geometry. + */ + constructor() { + super(); + this.isBufferGeometry = true; + Object.defineProperty(this, "id", { value: _id$1++ }); + this.uuid = generateUUID(); + this.name = ""; + this.type = "BufferGeometry"; + this.index = null; + this.indirect = null; + this.indirectOffset = 0; + this.attributes = {}; + this.morphAttributes = {}; + this.morphTargetsRelative = false; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + this.drawRange = { start: 0, count: Infinity }; + this.userData = {}; + } + /** + * Returns the index of this geometry. + * + * @return {?BufferAttribute} The index. Returns `null` if no index is defined. + */ + getIndex() { + return this.index; + } + /** + * Sets the given index to this geometry. + * + * @param {Array|BufferAttribute} index - The index to set. + * @return {BufferGeometry} A reference to this instance. + */ + setIndex(index) { + if (Array.isArray(index)) { + this.index = new (arrayNeedsUint32(index) ? Uint32BufferAttribute : Uint16BufferAttribute)(index, 1); + } else { + this.index = index; + } + return this; + } + /** + * Sets the given indirect attribute to this geometry. + * + * @param {BufferAttribute} indirect - The attribute holding indirect draw calls. + * @param {number|Array} [indirectOffset=0] - The offset, in bytes, into the indirect drawing buffer where the value data begins. If an array is provided, multiple indirect draw calls will be made for each offset. + * @return {BufferGeometry} A reference to this instance. + */ + setIndirect(indirect, indirectOffset = 0) { + this.indirect = indirect; + this.indirectOffset = indirectOffset; + return this; + } + /** + * Returns the indirect attribute of this geometry. + * + * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined. + */ + getIndirect() { + return this.indirect; + } + /** + * Returns the buffer attribute for the given name. + * + * @param {string} name - The attribute name. + * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute. + * Returns `undefined` if not attribute has been found. + */ + getAttribute(name) { + return this.attributes[name]; + } + /** + * Sets the given attribute for the given name. + * + * @param {string} name - The attribute name. + * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set. + * @return {BufferGeometry} A reference to this instance. + */ + setAttribute(name, attribute) { + this.attributes[name] = attribute; + return this; + } + /** + * Deletes the attribute for the given name. + * + * @param {string} name - The attribute name to delete. + * @return {BufferGeometry} A reference to this instance. + */ + deleteAttribute(name) { + delete this.attributes[name]; + return this; + } + /** + * Returns `true` if this geometry has an attribute for the given name. + * + * @param {string} name - The attribute name. + * @return {boolean} Whether this geometry has an attribute for the given name or not. + */ + hasAttribute(name) { + return this.attributes[name] !== void 0; + } + /** + * Adds a group to this geometry. + * + * @param {number} start - The first element in this draw call. That is the first + * vertex for non-indexed geometry, otherwise the first triangle index. + * @param {number} count - Specifies how many vertices (or indices) are part of this group. + * @param {number} [materialIndex=0] - The material array index to use. + */ + addGroup(start, count, materialIndex = 0) { + this.groups.push({ + start, + count, + materialIndex + }); + } + /** + * Clears all groups. + */ + clearGroups() { + this.groups = []; + } + /** + * Sets the draw range for this geometry. + * + * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index. + * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render. + * For indexed BufferGeometry, `count` is the number of indices to render. + */ + setDrawRange(start, count) { + this.drawRange.start = start; + this.drawRange.count = count; + } + /** + * Applies the given 4x4 transformation matrix to the geometry. + * + * @param {Matrix4} matrix - The matrix to apply. + * @return {BufferGeometry} A reference to this instance. + */ + applyMatrix4(matrix) { + const position = this.attributes.position; + if (position !== void 0) { + position.applyMatrix4(matrix); + position.needsUpdate = true; + } + const normal = this.attributes.normal; + if (normal !== void 0) { + const normalMatrix = new Matrix3().getNormalMatrix(matrix); + normal.applyNormalMatrix(normalMatrix); + normal.needsUpdate = true; + } + const tangent = this.attributes.tangent; + if (tangent !== void 0) { + tangent.transformDirection(matrix); + tangent.needsUpdate = true; + } + if (this.boundingBox !== null) { + this.computeBoundingBox(); + } + if (this.boundingSphere !== null) { + this.computeBoundingSphere(); + } + return this; + } + /** + * Applies the rotation represented by the Quaternion to the geometry. + * + * @param {Quaternion} q - The Quaternion to apply. + * @return {BufferGeometry} A reference to this instance. + */ + applyQuaternion(q) { + _m1.makeRotationFromQuaternion(q); + this.applyMatrix4(_m1); + return this; + } + /** + * Rotates the geometry about the X axis. This is typically done as a one time + * operation, and not during a loop. Use {@link Object3D#rotation} for typical + * real-time mesh rotation. + * + * @param {number} angle - The angle in radians. + * @return {BufferGeometry} A reference to this instance. + */ + rotateX(angle) { + _m1.makeRotationX(angle); + this.applyMatrix4(_m1); + return this; + } + /** + * Rotates the geometry about the Y axis. This is typically done as a one time + * operation, and not during a loop. Use {@link Object3D#rotation} for typical + * real-time mesh rotation. + * + * @param {number} angle - The angle in radians. + * @return {BufferGeometry} A reference to this instance. + */ + rotateY(angle) { + _m1.makeRotationY(angle); + this.applyMatrix4(_m1); + return this; + } + /** + * Rotates the geometry about the Z axis. This is typically done as a one time + * operation, and not during a loop. Use {@link Object3D#rotation} for typical + * real-time mesh rotation. + * + * @param {number} angle - The angle in radians. + * @return {BufferGeometry} A reference to this instance. + */ + rotateZ(angle) { + _m1.makeRotationZ(angle); + this.applyMatrix4(_m1); + return this; + } + /** + * Translates the geometry. This is typically done as a one time + * operation, and not during a loop. Use {@link Object3D#position} for typical + * real-time mesh rotation. + * + * @param {number} x - The x offset. + * @param {number} y - The y offset. + * @param {number} z - The z offset. + * @return {BufferGeometry} A reference to this instance. + */ + translate(x, y, z) { + _m1.makeTranslation(x, y, z); + this.applyMatrix4(_m1); + return this; + } + /** + * Scales the geometry. This is typically done as a one time + * operation, and not during a loop. Use {@link Object3D#scale} for typical + * real-time mesh rotation. + * + * @param {number} x - The x scale. + * @param {number} y - The y scale. + * @param {number} z - The z scale. + * @return {BufferGeometry} A reference to this instance. + */ + scale(x, y, z) { + _m1.makeScale(x, y, z); + this.applyMatrix4(_m1); + return this; + } + /** + * Rotates the geometry to face a point in 3D space. This is typically done as a one time + * operation, and not during a loop. Use {@link Object3D#lookAt} for typical + * real-time mesh rotation. + * + * @param {Vector3} vector - The target point. + * @return {BufferGeometry} A reference to this instance. + */ + lookAt(vector) { + _obj.lookAt(vector); + _obj.updateMatrix(); + this.applyMatrix4(_obj.matrix); + return this; + } + /** + * Center the geometry based on its bounding box. + * + * @return {BufferGeometry} A reference to this instance. + */ + center() { + this.computeBoundingBox(); + this.boundingBox.getCenter(_offset).negate(); + this.translate(_offset.x, _offset.y, _offset.z); + return this; + } + /** + * Defines a geometry by creating a `position` attribute based on the given array of points. The array + * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is + * set to `0`. + * + * If the method is used with an existing `position` attribute, the vertex data are overwritten with the + * data from the array. The length of the array must match the vertex count. + * + * @param {Array|Array} points - The points. + * @return {BufferGeometry} A reference to this instance. + */ + setFromPoints(points) { + const positionAttribute = this.getAttribute("position"); + if (positionAttribute === void 0) { + const position = []; + for (let i = 0, l = points.length; i < l; i++) { + const point = points[i]; + position.push(point.x, point.y, point.z || 0); + } + this.setAttribute("position", new Float32BufferAttribute(position, 3)); + } else { + const l = Math.min(points.length, positionAttribute.count); + for (let i = 0; i < l; i++) { + const point = points[i]; + positionAttribute.setXYZ(i, point.x, point.y, point.z || 0); + } + if (points.length > positionAttribute.count) { + warn("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."); + } + positionAttribute.needsUpdate = true; + } + return this; + } + /** + * Computes the bounding box of the geometry, and updates the `boundingBox` member. + * The bounding box is not computed by the engine; it must be computed by your app. + * You may need to recompute the bounding box if the geometry vertices are modified. + */ + computeBoundingBox() { + if (this.boundingBox === null) { + this.boundingBox = new Box3(); + } + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + if (position && position.isGLBufferAttribute) { + error("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.", this); + this.boundingBox.set( + new Vector3(-Infinity, -Infinity, -Infinity), + new Vector3(Infinity, Infinity, Infinity) + ); + return; + } + if (position !== void 0) { + this.boundingBox.setFromBufferAttribute(position); + if (morphAttributesPosition) { + for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { + const morphAttribute = morphAttributesPosition[i]; + _box$2.setFromBufferAttribute(morphAttribute); + if (this.morphTargetsRelative) { + _vector$8.addVectors(this.boundingBox.min, _box$2.min); + this.boundingBox.expandByPoint(_vector$8); + _vector$8.addVectors(this.boundingBox.max, _box$2.max); + this.boundingBox.expandByPoint(_vector$8); + } else { + this.boundingBox.expandByPoint(_box$2.min); + this.boundingBox.expandByPoint(_box$2.max); + } + } + } + } else { + this.boundingBox.makeEmpty(); + } + if (isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) { + error('BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this); + } + } + /** + * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member. + * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling. + * You may need to recompute the bounding sphere if the geometry vertices are modified. + */ + computeBoundingSphere() { + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere(); + } + const position = this.attributes.position; + const morphAttributesPosition = this.morphAttributes.position; + if (position && position.isGLBufferAttribute) { + error("BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.", this); + this.boundingSphere.set(new Vector3(), Infinity); + return; + } + if (position) { + const center = this.boundingSphere.center; + _box$2.setFromBufferAttribute(position); + if (morphAttributesPosition) { + for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { + const morphAttribute = morphAttributesPosition[i]; + _boxMorphTargets.setFromBufferAttribute(morphAttribute); + if (this.morphTargetsRelative) { + _vector$8.addVectors(_box$2.min, _boxMorphTargets.min); + _box$2.expandByPoint(_vector$8); + _vector$8.addVectors(_box$2.max, _boxMorphTargets.max); + _box$2.expandByPoint(_vector$8); + } else { + _box$2.expandByPoint(_boxMorphTargets.min); + _box$2.expandByPoint(_boxMorphTargets.max); + } + } + } + _box$2.getCenter(center); + let maxRadiusSq = 0; + for (let i = 0, il = position.count; i < il; i++) { + _vector$8.fromBufferAttribute(position, i); + maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$8)); + } + if (morphAttributesPosition) { + for (let i = 0, il = morphAttributesPosition.length; i < il; i++) { + const morphAttribute = morphAttributesPosition[i]; + const morphTargetsRelative = this.morphTargetsRelative; + for (let j = 0, jl = morphAttribute.count; j < jl; j++) { + _vector$8.fromBufferAttribute(morphAttribute, j); + if (morphTargetsRelative) { + _offset.fromBufferAttribute(position, j); + _vector$8.add(_offset); + } + maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$8)); + } + } + } + this.boundingSphere.radius = Math.sqrt(maxRadiusSq); + if (isNaN(this.boundingSphere.radius)) { + error('BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this); + } + } + } + /** + * Calculates and adds a tangent attribute to this geometry. + * + * The computation is only supported for indexed geometries and if position, normal, and uv attributes + * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by + * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead. + */ + computeTangents() { + const index = this.index; + const attributes = this.attributes; + if (index === null || attributes.position === void 0 || attributes.normal === void 0 || attributes.uv === void 0) { + error("BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)"); + return; + } + const positionAttribute = attributes.position; + const normalAttribute = attributes.normal; + const uvAttribute = attributes.uv; + if (this.hasAttribute("tangent") === false) { + this.setAttribute("tangent", new BufferAttribute(new Float32Array(4 * positionAttribute.count), 4)); + } + const tangentAttribute = this.getAttribute("tangent"); + const tan1 = [], tan2 = []; + for (let i = 0; i < positionAttribute.count; i++) { + tan1[i] = new Vector3(); + tan2[i] = new Vector3(); + } + const vA = new Vector3(), vB = new Vector3(), vC = new Vector3(), uvA = new Vector2(), uvB = new Vector2(), uvC = new Vector2(), sdir = new Vector3(), tdir = new Vector3(); + function handleTriangle(a, b, c) { + vA.fromBufferAttribute(positionAttribute, a); + vB.fromBufferAttribute(positionAttribute, b); + vC.fromBufferAttribute(positionAttribute, c); + uvA.fromBufferAttribute(uvAttribute, a); + uvB.fromBufferAttribute(uvAttribute, b); + uvC.fromBufferAttribute(uvAttribute, c); + vB.sub(vA); + vC.sub(vA); + uvB.sub(uvA); + uvC.sub(uvA); + const r = 1 / (uvB.x * uvC.y - uvC.x * uvB.y); + if (!isFinite(r)) return; + sdir.copy(vB).multiplyScalar(uvC.y).addScaledVector(vC, -uvB.y).multiplyScalar(r); + tdir.copy(vC).multiplyScalar(uvB.x).addScaledVector(vB, -uvC.x).multiplyScalar(r); + tan1[a].add(sdir); + tan1[b].add(sdir); + tan1[c].add(sdir); + tan2[a].add(tdir); + tan2[b].add(tdir); + tan2[c].add(tdir); + } + let groups = this.groups; + if (groups.length === 0) { + groups = [{ + start: 0, + count: index.count + }]; + } + for (let i = 0, il = groups.length; i < il; ++i) { + const group = groups[i]; + const start = group.start; + const count = group.count; + for (let j = start, jl = start + count; j < jl; j += 3) { + handleTriangle( + index.getX(j + 0), + index.getX(j + 1), + index.getX(j + 2) + ); + } + } + const tmp2 = new Vector3(), tmp22 = new Vector3(); + const n = new Vector3(), n2 = new Vector3(); + function handleVertex(v) { + n.fromBufferAttribute(normalAttribute, v); + n2.copy(n); + const t = tan1[v]; + tmp2.copy(t); + tmp2.sub(n.multiplyScalar(n.dot(t))).normalize(); + tmp22.crossVectors(n2, t); + const test = tmp22.dot(tan2[v]); + const w = test < 0 ? -1 : 1; + tangentAttribute.setXYZW(v, tmp2.x, tmp2.y, tmp2.z, w); + } + for (let i = 0, il = groups.length; i < il; ++i) { + const group = groups[i]; + const start = group.start; + const count = group.count; + for (let j = start, jl = start + count; j < jl; j += 3) { + handleVertex(index.getX(j + 0)); + handleVertex(index.getX(j + 1)); + handleVertex(index.getX(j + 2)); + } + } + } + /** + * Computes vertex normals for the given vertex data. For indexed geometries, the method sets + * each vertex normal to be the average of the face normals of the faces that share that vertex. + * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal + * to be the same as the face normal. + */ + computeVertexNormals() { + const index = this.index; + const positionAttribute = this.getAttribute("position"); + if (positionAttribute !== void 0) { + let normalAttribute = this.getAttribute("normal"); + if (normalAttribute === void 0) { + normalAttribute = new BufferAttribute(new Float32Array(positionAttribute.count * 3), 3); + this.setAttribute("normal", normalAttribute); + } else { + for (let i = 0, il = normalAttribute.count; i < il; i++) { + normalAttribute.setXYZ(i, 0, 0, 0); + } + } + const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(); + const nA = new Vector3(), nB = new Vector3(), nC = new Vector3(); + const cb = new Vector3(), ab = new Vector3(); + if (index) { + for (let i = 0, il = index.count; i < il; i += 3) { + const vA = index.getX(i + 0); + const vB = index.getX(i + 1); + const vC = index.getX(i + 2); + pA.fromBufferAttribute(positionAttribute, vA); + pB.fromBufferAttribute(positionAttribute, vB); + pC.fromBufferAttribute(positionAttribute, vC); + cb.subVectors(pC, pB); + ab.subVectors(pA, pB); + cb.cross(ab); + nA.fromBufferAttribute(normalAttribute, vA); + nB.fromBufferAttribute(normalAttribute, vB); + nC.fromBufferAttribute(normalAttribute, vC); + nA.add(cb); + nB.add(cb); + nC.add(cb); + normalAttribute.setXYZ(vA, nA.x, nA.y, nA.z); + normalAttribute.setXYZ(vB, nB.x, nB.y, nB.z); + normalAttribute.setXYZ(vC, nC.x, nC.y, nC.z); + } + } else { + for (let i = 0, il = positionAttribute.count; i < il; i += 3) { + pA.fromBufferAttribute(positionAttribute, i + 0); + pB.fromBufferAttribute(positionAttribute, i + 1); + pC.fromBufferAttribute(positionAttribute, i + 2); + cb.subVectors(pC, pB); + ab.subVectors(pA, pB); + cb.cross(ab); + normalAttribute.setXYZ(i + 0, cb.x, cb.y, cb.z); + normalAttribute.setXYZ(i + 1, cb.x, cb.y, cb.z); + normalAttribute.setXYZ(i + 2, cb.x, cb.y, cb.z); + } + } + this.normalizeNormals(); + normalAttribute.needsUpdate = true; + } + } + /** + * Ensures every normal vector in a geometry will have a magnitude of `1`. This will + * correct lighting on the geometry surfaces. + */ + normalizeNormals() { + const normals = this.attributes.normal; + for (let i = 0, il = normals.count; i < il; i++) { + _vector$8.fromBufferAttribute(normals, i); + _vector$8.normalize(); + normals.setXYZ(i, _vector$8.x, _vector$8.y, _vector$8.z); + } + } + /** + * Return a new non-index version of this indexed geometry. If the geometry + * is already non-indexed, the method is a NOOP. + * + * @return {BufferGeometry} The non-indexed version of this indexed geometry. + */ + toNonIndexed() { + function convertBufferAttribute(attribute, indices2) { + const array = attribute.array; + const itemSize = attribute.itemSize; + const normalized = attribute.normalized; + const array2 = new array.constructor(indices2.length * itemSize); + let index = 0, index2 = 0; + for (let i = 0, l = indices2.length; i < l; i++) { + if (attribute.isInterleavedBufferAttribute) { + index = indices2[i] * attribute.data.stride + attribute.offset; + } else { + index = indices2[i] * itemSize; + } + for (let j = 0; j < itemSize; j++) { + array2[index2++] = array[index++]; + } + } + return new BufferAttribute(array2, itemSize, normalized); + } + if (this.index === null) { + warn("BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."); + return this; + } + const geometry2 = new _BufferGeometry(); + const indices = this.index.array; + const attributes = this.attributes; + for (const name in attributes) { + const attribute = attributes[name]; + const newAttribute = convertBufferAttribute(attribute, indices); + geometry2.setAttribute(name, newAttribute); + } + const morphAttributes = this.morphAttributes; + for (const name in morphAttributes) { + const morphArray = []; + const morphAttribute = morphAttributes[name]; + for (let i = 0, il = morphAttribute.length; i < il; i++) { + const attribute = morphAttribute[i]; + const newAttribute = convertBufferAttribute(attribute, indices); + morphArray.push(newAttribute); + } + geometry2.morphAttributes[name] = morphArray; + } + geometry2.morphTargetsRelative = this.morphTargetsRelative; + const groups = this.groups; + for (let i = 0, l = groups.length; i < l; i++) { + const group = groups[i]; + geometry2.addGroup(group.start, group.count, group.materialIndex); + } + return geometry2; + } + /** + * Serializes the geometry into JSON. + * + * @return {Object} A JSON object representing the serialized geometry. + */ + toJSON() { + const data = { + metadata: { + version: 4.7, + type: "BufferGeometry", + generator: "BufferGeometry.toJSON" + } + }; + data.uuid = this.uuid; + data.type = this.type; + if (this.name !== "") data.name = this.name; + if (Object.keys(this.userData).length > 0) data.userData = this.userData; + if (this.parameters !== void 0) { + const parameters = this.parameters; + for (const key in parameters) { + if (parameters[key] !== void 0) data[key] = parameters[key]; + } + return data; + } + data.data = { attributes: {} }; + const index = this.index; + if (index !== null) { + data.data.index = { + type: index.array.constructor.name, + array: Array.prototype.slice.call(index.array) + }; + } + const attributes = this.attributes; + for (const key in attributes) { + const attribute = attributes[key]; + data.data.attributes[key] = attribute.toJSON(data.data); + } + const morphAttributes = {}; + let hasMorphAttributes = false; + for (const key in this.morphAttributes) { + const attributeArray = this.morphAttributes[key]; + const array = []; + for (let i = 0, il = attributeArray.length; i < il; i++) { + const attribute = attributeArray[i]; + array.push(attribute.toJSON(data.data)); + } + if (array.length > 0) { + morphAttributes[key] = array; + hasMorphAttributes = true; + } + } + if (hasMorphAttributes) { + data.data.morphAttributes = morphAttributes; + data.data.morphTargetsRelative = this.morphTargetsRelative; + } + const groups = this.groups; + if (groups.length > 0) { + data.data.groups = JSON.parse(JSON.stringify(groups)); + } + const boundingSphere = this.boundingSphere; + if (boundingSphere !== null) { + data.data.boundingSphere = boundingSphere.toJSON(); + } + return data; + } + /** + * Returns a new geometry with copied values from this instance. + * + * @return {BufferGeometry} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Copies the values of the given geometry to this instance. + * + * @param {BufferGeometry} source - The geometry to copy. + * @return {BufferGeometry} A reference to this instance. + */ + copy(source) { + this.index = null; + this.attributes = {}; + this.morphAttributes = {}; + this.groups = []; + this.boundingBox = null; + this.boundingSphere = null; + const data = {}; + this.name = source.name; + const index = source.index; + if (index !== null) { + this.setIndex(index.clone()); + } + const attributes = source.attributes; + for (const name in attributes) { + const attribute = attributes[name]; + this.setAttribute(name, attribute.clone(data)); + } + const morphAttributes = source.morphAttributes; + for (const name in morphAttributes) { + const array = []; + const morphAttribute = morphAttributes[name]; + for (let i = 0, l = morphAttribute.length; i < l; i++) { + array.push(morphAttribute[i].clone(data)); + } + this.morphAttributes[name] = array; + } + this.morphTargetsRelative = source.morphTargetsRelative; + const groups = source.groups; + for (let i = 0, l = groups.length; i < l; i++) { + const group = groups[i]; + this.addGroup(group.start, group.count, group.materialIndex); + } + const boundingBox = source.boundingBox; + if (boundingBox !== null) { + this.boundingBox = boundingBox.clone(); + } + const boundingSphere = source.boundingSphere; + if (boundingSphere !== null) { + this.boundingSphere = boundingSphere.clone(); + } + this.drawRange.start = source.drawRange.start; + this.drawRange.count = source.drawRange.count; + this.userData = source.userData; + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + * + * @fires BufferGeometry#dispose + */ + dispose() { + this.dispatchEvent({ type: "dispose" }); + } +}; +var _inverseMatrix$3 = new Matrix4(); +var _ray$3 = new Ray(); +var _sphere$6 = new Sphere(); +var _sphereHitAt = new Vector3(); +var _vA$1 = new Vector3(); +var _vB$1 = new Vector3(); +var _vC$1 = new Vector3(); +var _tempA = new Vector3(); +var _morphA = new Vector3(); +var _intersectionPoint = new Vector3(); +var _intersectionPointWorld = new Vector3(); +var Mesh = class extends Object3D { + /** + * Constructs a new mesh. + * + * @param {BufferGeometry} [geometry] - The mesh geometry. + * @param {Material|Array} [material] - The mesh material. + */ + constructor(geometry = new BufferGeometry(), material = new MeshBasicMaterial()) { + super(); + this.isMesh = true; + this.type = "Mesh"; + this.geometry = geometry; + this.material = material; + this.morphTargetDictionary = void 0; + this.morphTargetInfluences = void 0; + this.count = 1; + this.updateMorphTargets(); + } + copy(source, recursive) { + super.copy(source, recursive); + if (source.morphTargetInfluences !== void 0) { + this.morphTargetInfluences = source.morphTargetInfluences.slice(); + } + if (source.morphTargetDictionary !== void 0) { + this.morphTargetDictionary = Object.assign({}, source.morphTargetDictionary); + } + this.material = Array.isArray(source.material) ? source.material.slice() : source.material; + this.geometry = source.geometry; + return this; + } + /** + * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences} + * to make sure existing morph targets can influence this 3D object. + */ + updateMorphTargets() { + const geometry = this.geometry; + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys(morphAttributes); + if (keys.length > 0) { + const morphAttribute = morphAttributes[keys[0]]; + if (morphAttribute !== void 0) { + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + for (let m = 0, ml = morphAttribute.length; m < ml; m++) { + const name = morphAttribute[m].name || String(m); + this.morphTargetInfluences.push(0); + this.morphTargetDictionary[name] = m; + } + } + } + } + /** + * Returns the local-space position of the vertex at the given index, taking into + * account the current animation state of both morph targets and skinning. + * + * @param {number} index - The vertex index. + * @param {Vector3} target - The target object that is used to store the method's result. + * @return {Vector3} The vertex position in local space. + */ + getVertexPosition(index, target) { + const geometry = this.geometry; + const position = geometry.attributes.position; + const morphPosition = geometry.morphAttributes.position; + const morphTargetsRelative = geometry.morphTargetsRelative; + target.fromBufferAttribute(position, index); + const morphInfluences = this.morphTargetInfluences; + if (morphPosition && morphInfluences) { + _morphA.set(0, 0, 0); + for (let i = 0, il = morphPosition.length; i < il; i++) { + const influence = morphInfluences[i]; + const morphAttribute = morphPosition[i]; + if (influence === 0) continue; + _tempA.fromBufferAttribute(morphAttribute, index); + if (morphTargetsRelative) { + _morphA.addScaledVector(_tempA, influence); + } else { + _morphA.addScaledVector(_tempA.sub(target), influence); + } + } + target.add(_morphA); + } + return target; + } + /** + * Computes intersection points between a casted ray and this line. + * + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - The target array that holds the intersection points. + */ + raycast(raycaster, intersects2) { + const geometry = this.geometry; + const material = this.material; + const matrixWorld = this.matrixWorld; + if (material === void 0) return; + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _sphere$6.copy(geometry.boundingSphere); + _sphere$6.applyMatrix4(matrixWorld); + _ray$3.copy(raycaster.ray).recast(raycaster.near); + if (_sphere$6.containsPoint(_ray$3.origin) === false) { + if (_ray$3.intersectSphere(_sphere$6, _sphereHitAt) === null) return; + if (_ray$3.origin.distanceToSquared(_sphereHitAt) > (raycaster.far - raycaster.near) ** 2) return; + } + _inverseMatrix$3.copy(matrixWorld).invert(); + _ray$3.copy(raycaster.ray).applyMatrix4(_inverseMatrix$3); + if (geometry.boundingBox !== null) { + if (_ray$3.intersectsBox(geometry.boundingBox) === false) return; + } + this._computeIntersections(raycaster, intersects2, _ray$3); + } + _computeIntersections(raycaster, intersects2, rayLocalSpace) { + let intersection; + const geometry = this.geometry; + const material = this.material; + const index = geometry.index; + const position = geometry.attributes.position; + const uv = geometry.attributes.uv; + const uv1 = geometry.attributes.uv1; + const normal = geometry.attributes.normal; + const groups = geometry.groups; + const drawRange = geometry.drawRange; + if (index !== null) { + if (Array.isArray(material)) { + for (let i = 0, il = groups.length; i < il; i++) { + const group = groups[i]; + const groupMaterial = material[group.materialIndex]; + const start = Math.max(group.start, drawRange.start); + const end = Math.min(index.count, Math.min(group.start + group.count, drawRange.start + drawRange.count)); + for (let j = start, jl = end; j < jl; j += 3) { + const a = index.getX(j); + const b = index.getX(j + 1); + const c = index.getX(j + 2); + intersection = checkGeometryIntersection(this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); + if (intersection) { + intersection.faceIndex = Math.floor(j / 3); + intersection.face.materialIndex = group.materialIndex; + intersects2.push(intersection); + } + } + } + } else { + const start = Math.max(0, drawRange.start); + const end = Math.min(index.count, drawRange.start + drawRange.count); + for (let i = start, il = end; i < il; i += 3) { + const a = index.getX(i); + const b = index.getX(i + 1); + const c = index.getX(i + 2); + intersection = checkGeometryIntersection(this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); + if (intersection) { + intersection.faceIndex = Math.floor(i / 3); + intersects2.push(intersection); + } + } + } + } else if (position !== void 0) { + if (Array.isArray(material)) { + for (let i = 0, il = groups.length; i < il; i++) { + const group = groups[i]; + const groupMaterial = material[group.materialIndex]; + const start = Math.max(group.start, drawRange.start); + const end = Math.min(position.count, Math.min(group.start + group.count, drawRange.start + drawRange.count)); + for (let j = start, jl = end; j < jl; j += 3) { + const a = j; + const b = j + 1; + const c = j + 2; + intersection = checkGeometryIntersection(this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); + if (intersection) { + intersection.faceIndex = Math.floor(j / 3); + intersection.face.materialIndex = group.materialIndex; + intersects2.push(intersection); + } + } + } + } else { + const start = Math.max(0, drawRange.start); + const end = Math.min(position.count, drawRange.start + drawRange.count); + for (let i = start, il = end; i < il; i += 3) { + const a = i; + const b = i + 1; + const c = i + 2; + intersection = checkGeometryIntersection(this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c); + if (intersection) { + intersection.faceIndex = Math.floor(i / 3); + intersects2.push(intersection); + } + } + } + } + } +}; +function checkIntersection$1(object, material, raycaster, ray, pA, pB, pC, point) { + let intersect2; + if (material.side === BackSide) { + intersect2 = ray.intersectTriangle(pC, pB, pA, true, point); + } else { + intersect2 = ray.intersectTriangle(pA, pB, pC, material.side === FrontSide, point); + } + if (intersect2 === null) return null; + _intersectionPointWorld.copy(point); + _intersectionPointWorld.applyMatrix4(object.matrixWorld); + const distance = raycaster.ray.origin.distanceTo(_intersectionPointWorld); + if (distance < raycaster.near || distance > raycaster.far) return null; + return { + distance, + point: _intersectionPointWorld.clone(), + object + }; +} +function checkGeometryIntersection(object, material, raycaster, ray, uv, uv1, normal, a, b, c) { + object.getVertexPosition(a, _vA$1); + object.getVertexPosition(b, _vB$1); + object.getVertexPosition(c, _vC$1); + const intersection = checkIntersection$1(object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint); + if (intersection) { + const barycoord = new Vector3(); + Triangle.getBarycoord(_intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord); + if (uv) { + intersection.uv = Triangle.getInterpolatedAttribute(uv, a, b, c, barycoord, new Vector2()); + } + if (uv1) { + intersection.uv1 = Triangle.getInterpolatedAttribute(uv1, a, b, c, barycoord, new Vector2()); + } + if (normal) { + intersection.normal = Triangle.getInterpolatedAttribute(normal, a, b, c, barycoord, new Vector3()); + if (intersection.normal.dot(ray.direction) > 0) { + intersection.normal.multiplyScalar(-1); + } + } + const face = { + a, + b, + c, + normal: new Vector3(), + materialIndex: 0 + }; + Triangle.getNormal(_vA$1, _vB$1, _vC$1, face.normal); + intersection.face = face; + intersection.barycoord = barycoord; + } + return intersection; +} +var BoxGeometry = class _BoxGeometry extends BufferGeometry { + /** + * Constructs a new box geometry. + * + * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis. + * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis. + * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis. + * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides. + * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides. + * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides. + */ + constructor(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1) { + super(); + this.type = "BoxGeometry"; + this.parameters = { + width, + height, + depth, + widthSegments, + heightSegments, + depthSegments + }; + const scope = this; + widthSegments = Math.floor(widthSegments); + heightSegments = Math.floor(heightSegments); + depthSegments = Math.floor(depthSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + let numberOfVertices = 0; + let groupStart = 0; + buildPlane("z", "y", "x", -1, -1, depth, height, width, depthSegments, heightSegments, 0); + buildPlane("z", "y", "x", 1, -1, depth, height, -width, depthSegments, heightSegments, 1); + buildPlane("x", "z", "y", 1, 1, width, depth, height, widthSegments, depthSegments, 2); + buildPlane("x", "z", "y", 1, -1, width, depth, -height, widthSegments, depthSegments, 3); + buildPlane("x", "y", "z", 1, -1, width, height, depth, widthSegments, heightSegments, 4); + buildPlane("x", "y", "z", -1, -1, width, height, -depth, widthSegments, heightSegments, 5); + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function buildPlane(u, v, w, udir, vdir, width2, height2, depth2, gridX, gridY, materialIndex) { + const segmentWidth = width2 / gridX; + const segmentHeight = height2 / gridY; + const widthHalf = width2 / 2; + const heightHalf = height2 / 2; + const depthHalf = depth2 / 2; + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + let vertexCounter = 0; + let groupCount = 0; + const vector = new Vector3(); + for (let iy = 0; iy < gridY1; iy++) { + const y = iy * segmentHeight - heightHalf; + for (let ix = 0; ix < gridX1; ix++) { + const x = ix * segmentWidth - widthHalf; + vector[u] = x * udir; + vector[v] = y * vdir; + vector[w] = depthHalf; + vertices.push(vector.x, vector.y, vector.z); + vector[u] = 0; + vector[v] = 0; + vector[w] = depth2 > 0 ? 1 : -1; + normals.push(vector.x, vector.y, vector.z); + uvs.push(ix / gridX); + uvs.push(1 - iy / gridY); + vertexCounter += 1; + } + } + for (let iy = 0; iy < gridY; iy++) { + for (let ix = 0; ix < gridX; ix++) { + const a = numberOfVertices + ix + gridX1 * iy; + const b = numberOfVertices + ix + gridX1 * (iy + 1); + const c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1); + const d = numberOfVertices + (ix + 1) + gridX1 * iy; + indices.push(a, b, d); + indices.push(b, c, d); + groupCount += 6; + } + } + scope.addGroup(groupStart, groupCount, materialIndex); + groupStart += groupCount; + numberOfVertices += vertexCounter; + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {BoxGeometry} A new instance. + */ + static fromJSON(data) { + return new _BoxGeometry(data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments); + } +}; +function cloneUniforms(src) { + const dst = {}; + for (const u in src) { + dst[u] = {}; + for (const p in src[u]) { + const property = src[u][p]; + if (property && (property.isColor || property.isMatrix3 || property.isMatrix4 || property.isVector2 || property.isVector3 || property.isVector4 || property.isTexture || property.isQuaternion)) { + if (property.isRenderTargetTexture) { + warn("UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms()."); + dst[u][p] = null; + } else { + dst[u][p] = property.clone(); + } + } else if (Array.isArray(property)) { + dst[u][p] = property.slice(); + } else { + dst[u][p] = property; + } + } + } + return dst; +} +function mergeUniforms(uniforms) { + const merged = {}; + for (let u = 0; u < uniforms.length; u++) { + const tmp2 = cloneUniforms(uniforms[u]); + for (const p in tmp2) { + merged[p] = tmp2[p]; + } + } + return merged; +} +function cloneUniformsGroups(src) { + const dst = []; + for (let u = 0; u < src.length; u++) { + dst.push(src[u].clone()); + } + return dst; +} +function getUnlitUniformColorSpace(renderer) { + const currentRenderTarget = renderer.getRenderTarget(); + if (currentRenderTarget === null) { + return renderer.outputColorSpace; + } + if (currentRenderTarget.isXRRenderTarget === true) { + return currentRenderTarget.texture.colorSpace; + } + return ColorManagement.workingColorSpace; +} +var UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms }; +var default_vertex = "void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; +var default_fragment = "void main() {\n gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"; +var ShaderMaterial = class extends Material { + /** + * Constructs a new shader material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isShaderMaterial = true; + this.type = "ShaderMaterial"; + this.defines = {}; + this.uniforms = {}; + this.uniformsGroups = []; + this.vertexShader = default_vertex; + this.fragmentShader = default_fragment; + this.linewidth = 1; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.fog = false; + this.lights = false; + this.clipping = false; + this.forceSinglePass = true; + this.extensions = { + clipCullDistance: false, + // set to use vertex shader clipping + multiDraw: false + // set to use vertex shader multi_draw / enable gl_DrawID + }; + this.defaultAttributeValues = { + "color": [1, 1, 1], + "uv": [0, 0], + "uv1": [0, 0] + }; + this.index0AttributeName = void 0; + this.uniformsNeedUpdate = false; + this.glslVersion = null; + if (parameters !== void 0) { + this.setValues(parameters); + } + } + copy(source) { + super.copy(source); + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + this.uniforms = cloneUniforms(source.uniforms); + this.uniformsGroups = cloneUniformsGroups(source.uniformsGroups); + this.defines = Object.assign({}, source.defines); + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.fog = source.fog; + this.lights = source.lights; + this.clipping = source.clipping; + this.extensions = Object.assign({}, source.extensions); + this.glslVersion = source.glslVersion; + this.defaultAttributeValues = Object.assign({}, source.defaultAttributeValues); + this.index0AttributeName = source.index0AttributeName; + this.uniformsNeedUpdate = source.uniformsNeedUpdate; + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.glslVersion = this.glslVersion; + data.uniforms = {}; + for (const name in this.uniforms) { + const uniform = this.uniforms[name]; + const value = uniform.value; + if (value && value.isTexture) { + data.uniforms[name] = { + type: "t", + value: value.toJSON(meta).uuid + }; + } else if (value && value.isColor) { + data.uniforms[name] = { + type: "c", + value: value.getHex() + }; + } else if (value && value.isVector2) { + data.uniforms[name] = { + type: "v2", + value: value.toArray() + }; + } else if (value && value.isVector3) { + data.uniforms[name] = { + type: "v3", + value: value.toArray() + }; + } else if (value && value.isVector4) { + data.uniforms[name] = { + type: "v4", + value: value.toArray() + }; + } else if (value && value.isMatrix3) { + data.uniforms[name] = { + type: "m3", + value: value.toArray() + }; + } else if (value && value.isMatrix4) { + data.uniforms[name] = { + type: "m4", + value: value.toArray() + }; + } else { + data.uniforms[name] = { + value + }; + } + } + if (Object.keys(this.defines).length > 0) data.defines = this.defines; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + data.lights = this.lights; + data.clipping = this.clipping; + const extensions = {}; + for (const key in this.extensions) { + if (this.extensions[key] === true) extensions[key] = true; + } + if (Object.keys(extensions).length > 0) data.extensions = extensions; + return data; + } +}; +var Camera = class extends Object3D { + /** + * Constructs a new camera. + */ + constructor() { + super(); + this.isCamera = true; + this.type = "Camera"; + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + this.projectionMatrixInverse = new Matrix4(); + this.coordinateSystem = WebGLCoordinateSystem; + this._reversedDepth = false; + } + /** + * The flag that indicates whether the camera uses a reversed depth buffer. + * + * @type {boolean} + * @default false + */ + get reversedDepth() { + return this._reversedDepth; + } + copy(source, recursive) { + super.copy(source, recursive); + this.matrixWorldInverse.copy(source.matrixWorldInverse); + this.projectionMatrix.copy(source.projectionMatrix); + this.projectionMatrixInverse.copy(source.projectionMatrixInverse); + this.coordinateSystem = source.coordinateSystem; + return this; + } + /** + * Returns a vector representing the ("look") direction of the 3D object in world space. + * + * This method is overwritten since cameras have a different forward vector compared to other + * 3D objects. A camera looks down its local, negative z-axis by default. + * + * @param {Vector3} target - The target vector the result is stored to. + * @return {Vector3} The 3D object's direction in world space. + */ + getWorldDirection(target) { + return super.getWorldDirection(target).negate(); + } + updateMatrixWorld(force) { + super.updateMatrixWorld(force); + this.matrixWorldInverse.copy(this.matrixWorld).invert(); + } + updateWorldMatrix(updateParents, updateChildren) { + super.updateWorldMatrix(updateParents, updateChildren); + this.matrixWorldInverse.copy(this.matrixWorld).invert(); + } + clone() { + return new this.constructor().copy(this); + } +}; +var _v3$1 = new Vector3(); +var _minTarget = new Vector2(); +var _maxTarget = new Vector2(); +var PerspectiveCamera = class extends Camera { + /** + * Constructs a new perspective camera. + * + * @param {number} [fov=50] - The vertical field of view. + * @param {number} [aspect=1] - The aspect ratio. + * @param {number} [near=0.1] - The camera's near plane. + * @param {number} [far=2000] - The camera's far plane. + */ + constructor(fov2 = 50, aspect2 = 1, near = 0.1, far = 2e3) { + super(); + this.isPerspectiveCamera = true; + this.type = "PerspectiveCamera"; + this.fov = fov2; + this.zoom = 1; + this.near = near; + this.far = far; + this.focus = 10; + this.aspect = aspect2; + this.view = null; + this.filmGauge = 35; + this.filmOffset = 0; + this.updateProjectionMatrix(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.fov = source.fov; + this.zoom = source.zoom; + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign({}, source.view); + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + return this; + } + /** + * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * @param {number} focalLength - Values for focal length and film gauge must have the same unit. + */ + setFocalLength(focalLength) { + const vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + this.fov = RAD2DEG * 2 * Math.atan(vExtentSlope); + this.updateProjectionMatrix(); + } + /** + * Returns the focal length from the current {@link PerspectiveCamera#fov} and + * {@link PerspectiveCamera#filmGauge}. + * + * @return {number} The computed focal length. + */ + getFocalLength() { + const vExtentSlope = Math.tan(DEG2RAD * 0.5 * this.fov); + return 0.5 * this.getFilmHeight() / vExtentSlope; + } + /** + * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}. + * + * @return {number} The effective FOV. + */ + getEffectiveFOV() { + return RAD2DEG * 2 * Math.atan( + Math.tan(DEG2RAD * 0.5 * this.fov) / this.zoom + ); + } + /** + * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or + * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}. + * + * @return {number} The film width. + */ + getFilmWidth() { + return this.filmGauge * Math.min(this.aspect, 1); + } + /** + * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or + * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}. + * + * @return {number} The film width. + */ + getFilmHeight() { + return this.filmGauge / Math.max(this.aspect, 1); + } + /** + * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction. + * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle. + * + * @param {number} distance - The viewing distance. + * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector. + * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector. + */ + getViewBounds(distance, minTarget, maxTarget) { + _v3$1.set(-1, -1, 0.5).applyMatrix4(this.projectionMatrixInverse); + minTarget.set(_v3$1.x, _v3$1.y).multiplyScalar(-distance / _v3$1.z); + _v3$1.set(1, 1, 0.5).applyMatrix4(this.projectionMatrixInverse); + maxTarget.set(_v3$1.x, _v3$1.y).multiplyScalar(-distance / _v3$1.z); + } + /** + * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction. + * + * @param {number} distance - The viewing distance. + * @param {Vector2} target - The target vector that is used to store result where x is width and y is height. + * @returns {Vector2} The view size. + */ + getViewSize(distance, target) { + this.getViewBounds(distance, _minTarget, _maxTarget); + return target.subVectors(_maxTarget, _minTarget); + } + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + *``` + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + *``` + * then for each monitor you would call it like this: + *```js + * const w = 1920; + * const h = 1080; + * const fullWidth = w * 3; + * const fullHeight = h * 2; + * + * // --A-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * // --B-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * // --C-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * // --D-- + * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * // --E-- + * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * // --F-- + * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * ``` + * + * Note there is no reason monitors have to be the same size or in a grid. + * + * @param {number} fullWidth - The full width of multiview setup. + * @param {number} fullHeight - The full height of multiview setup. + * @param {number} x - The horizontal offset of the subcamera. + * @param {number} y - The vertical offset of the subcamera. + * @param {number} width - The width of subcamera. + * @param {number} height - The height of subcamera. + */ + setViewOffset(fullWidth, fullHeight, x, y, width, height) { + this.aspect = fullWidth / fullHeight; + if (this.view === null) { + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + } + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + this.updateProjectionMatrix(); + } + /** + * Removes the view offset from the projection matrix. + */ + clearViewOffset() { + if (this.view !== null) { + this.view.enabled = false; + } + this.updateProjectionMatrix(); + } + /** + * Updates the camera's projection matrix. Must be called after any change of + * camera properties. + */ + updateProjectionMatrix() { + const near = this.near; + let top = near * Math.tan(DEG2RAD * 0.5 * this.fov) / this.zoom; + let height = 2 * top; + let width = this.aspect * height; + let left = -0.5 * width; + const view = this.view; + if (this.view !== null && this.view.enabled) { + const fullWidth = view.fullWidth, fullHeight = view.fullHeight; + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + } + const skew = this.filmOffset; + if (skew !== 0) left += near * skew / this.getFilmWidth(); + this.projectionMatrix.makePerspective(left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth); + this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.fov = this.fov; + data.object.zoom = this.zoom; + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + data.object.aspect = this.aspect; + if (this.view !== null) data.object.view = Object.assign({}, this.view); + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + return data; + } +}; +var fov = -90; +var aspect = 1; +var CubeCamera = class extends Object3D { + /** + * Constructs a new cube camera. + * + * @param {number} near - The camera's near plane. + * @param {number} far - The camera's far plane. + * @param {WebGLCubeRenderTarget} renderTarget - The cube render target. + */ + constructor(near, far, renderTarget) { + super(); + this.type = "CubeCamera"; + this.renderTarget = renderTarget; + this.coordinateSystem = null; + this.activeMipmapLevel = 0; + const cameraPX = new PerspectiveCamera(fov, aspect, near, far); + cameraPX.layers = this.layers; + this.add(cameraPX); + const cameraNX = new PerspectiveCamera(fov, aspect, near, far); + cameraNX.layers = this.layers; + this.add(cameraNX); + const cameraPY = new PerspectiveCamera(fov, aspect, near, far); + cameraPY.layers = this.layers; + this.add(cameraPY); + const cameraNY = new PerspectiveCamera(fov, aspect, near, far); + cameraNY.layers = this.layers; + this.add(cameraNY); + const cameraPZ = new PerspectiveCamera(fov, aspect, near, far); + cameraPZ.layers = this.layers; + this.add(cameraPZ); + const cameraNZ = new PerspectiveCamera(fov, aspect, near, far); + cameraNZ.layers = this.layers; + this.add(cameraNZ); + } + /** + * Must be called when the coordinate system of the cube camera is changed. + */ + updateCoordinateSystem() { + const coordinateSystem = this.coordinateSystem; + const cameras = this.children.concat(); + const [cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ] = cameras; + for (const camera of cameras) this.remove(camera); + if (coordinateSystem === WebGLCoordinateSystem) { + cameraPX.up.set(0, 1, 0); + cameraPX.lookAt(1, 0, 0); + cameraNX.up.set(0, 1, 0); + cameraNX.lookAt(-1, 0, 0); + cameraPY.up.set(0, 0, -1); + cameraPY.lookAt(0, 1, 0); + cameraNY.up.set(0, 0, 1); + cameraNY.lookAt(0, -1, 0); + cameraPZ.up.set(0, 1, 0); + cameraPZ.lookAt(0, 0, 1); + cameraNZ.up.set(0, 1, 0); + cameraNZ.lookAt(0, 0, -1); + } else if (coordinateSystem === WebGPUCoordinateSystem) { + cameraPX.up.set(0, -1, 0); + cameraPX.lookAt(-1, 0, 0); + cameraNX.up.set(0, -1, 0); + cameraNX.lookAt(1, 0, 0); + cameraPY.up.set(0, 0, 1); + cameraPY.lookAt(0, 1, 0); + cameraNY.up.set(0, 0, -1); + cameraNY.lookAt(0, -1, 0); + cameraPZ.up.set(0, -1, 0); + cameraPZ.lookAt(0, 0, 1); + cameraNZ.up.set(0, -1, 0); + cameraNZ.lookAt(0, 0, -1); + } else { + throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: " + coordinateSystem); + } + for (const camera of cameras) { + this.add(camera); + camera.updateMatrixWorld(); + } + } + /** + * Calling this method will render the given scene with the given renderer + * into the cube render target of the camera. + * + * @param {(Renderer|WebGLRenderer)} renderer - The renderer. + * @param {Scene} scene - The scene to render. + */ + update(renderer, scene) { + if (this.parent === null) this.updateMatrixWorld(); + const { renderTarget, activeMipmapLevel } = this; + if (this.coordinateSystem !== renderer.coordinateSystem) { + this.coordinateSystem = renderer.coordinateSystem; + this.updateCoordinateSystem(); + } + const [cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ] = this.children; + const currentRenderTarget = renderer.getRenderTarget(); + const currentActiveCubeFace = renderer.getActiveCubeFace(); + const currentActiveMipmapLevel = renderer.getActiveMipmapLevel(); + const currentXrEnabled = renderer.xr.enabled; + renderer.xr.enabled = false; + const generateMipmaps = renderTarget.texture.generateMipmaps; + renderTarget.texture.generateMipmaps = false; + renderer.setRenderTarget(renderTarget, 0, activeMipmapLevel); + renderer.render(scene, cameraPX); + renderer.setRenderTarget(renderTarget, 1, activeMipmapLevel); + renderer.render(scene, cameraNX); + renderer.setRenderTarget(renderTarget, 2, activeMipmapLevel); + renderer.render(scene, cameraPY); + renderer.setRenderTarget(renderTarget, 3, activeMipmapLevel); + renderer.render(scene, cameraNY); + renderer.setRenderTarget(renderTarget, 4, activeMipmapLevel); + renderer.render(scene, cameraPZ); + renderTarget.texture.generateMipmaps = generateMipmaps; + renderer.setRenderTarget(renderTarget, 5, activeMipmapLevel); + renderer.render(scene, cameraNZ); + renderer.setRenderTarget(currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel); + renderer.xr.enabled = currentXrEnabled; + renderTarget.texture.needsPMREMUpdate = true; + } +}; +var CubeTexture = class extends Texture { + /** + * Constructs a new cube texture. + * + * @param {Array} [images=[]] - An array holding a image for each side of a cube. + * @param {number} [mapping=CubeReflectionMapping] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=LinearFilter] - The mag filter value. + * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value. + * @param {number} [format=RGBAFormat] - The texture format. + * @param {number} [type=UnsignedByteType] - The texture type. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + * @param {string} [colorSpace=NoColorSpace] - The color space value. + */ + constructor(images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace) { + super(images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); + this.isCubeTexture = true; + this.flipY = false; + } + /** + * Alias for {@link CubeTexture#image}. + * + * @type {Array} + */ + get images() { + return this.image; + } + set images(value) { + this.image = value; + } +}; +var WebGLCubeRenderTarget = class extends WebGLRenderTarget { + /** + * Constructs a new cube render target. + * + * @param {number} [size=1] - The size of the render target. + * @param {RenderTarget~Options} [options] - The configuration object. + */ + constructor(size = 1, options = {}) { + super(size, size, options); + this.isWebGLCubeRenderTarget = true; + const image = { width: size, height: size, depth: 1 }; + const images = [image, image, image, image, image, image]; + this.texture = new CubeTexture(images); + this._setTextureOptions(options); + this.texture.isRenderTargetTexture = true; + } + /** + * Converts the given equirectangular texture to a cube map. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Texture} texture - The equirectangular texture. + * @return {WebGLCubeRenderTarget} A reference to this cube render target. + */ + fromEquirectangularTexture(renderer, texture) { + this.texture.type = texture.type; + this.texture.colorSpace = texture.colorSpace; + this.texture.generateMipmaps = texture.generateMipmaps; + this.texture.minFilter = texture.minFilter; + this.texture.magFilter = texture.magFilter; + const shader = { + uniforms: { + tEquirect: { value: null } + }, + vertexShader: ( + /* glsl */ + ` + + varying vec3 vWorldDirection; + + vec3 transformDirection( in vec3 dir, in mat4 matrix ) { + + return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); + + } + + void main() { + + vWorldDirection = transformDirection( position, modelMatrix ); + + #include + #include + + } + ` + ), + fragmentShader: ( + /* glsl */ + ` + + uniform sampler2D tEquirect; + + varying vec3 vWorldDirection; + + #include + + void main() { + + vec3 direction = normalize( vWorldDirection ); + + vec2 sampleUV = equirectUv( direction ); + + gl_FragColor = texture2D( tEquirect, sampleUV ); + + } + ` + ) + }; + const geometry = new BoxGeometry(5, 5, 5); + const material = new ShaderMaterial({ + name: "CubemapFromEquirect", + uniforms: cloneUniforms(shader.uniforms), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + side: BackSide, + blending: NoBlending + }); + material.uniforms.tEquirect.value = texture; + const mesh = new Mesh(geometry, material); + const currentMinFilter = texture.minFilter; + if (texture.minFilter === LinearMipmapLinearFilter) texture.minFilter = LinearFilter; + const camera = new CubeCamera(1, 10, this); + camera.update(renderer, mesh); + texture.minFilter = currentMinFilter; + mesh.geometry.dispose(); + mesh.material.dispose(); + return this; + } + /** + * Clears this cube render target. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {boolean} [color=true] - Whether the color buffer should be cleared or not. + * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not. + * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not. + */ + clear(renderer, color = true, depth = true, stencil = true) { + const currentRenderTarget = renderer.getRenderTarget(); + for (let i = 0; i < 6; i++) { + renderer.setRenderTarget(this, i); + renderer.clear(color, depth, stencil); + } + renderer.setRenderTarget(currentRenderTarget); + } +}; +var Group = class extends Object3D { + constructor() { + super(); + this.isGroup = true; + this.type = "Group"; + } +}; +var _moveEvent = { type: "move" }; +var WebXRController = class { + /** + * Constructs a new XR controller. + */ + constructor() { + this._targetRay = null; + this._grip = null; + this._hand = null; + } + /** + * Returns a group representing the hand space of the XR controller. + * + * @return {Group} A group representing the hand space of the XR controller. + */ + getHandSpace() { + if (this._hand === null) { + this._hand = new Group(); + this._hand.matrixAutoUpdate = false; + this._hand.visible = false; + this._hand.joints = {}; + this._hand.inputState = { pinching: false }; + } + return this._hand; + } + /** + * Returns a group representing the target ray space of the XR controller. + * + * @return {Group} A group representing the target ray space of the XR controller. + */ + getTargetRaySpace() { + if (this._targetRay === null) { + this._targetRay = new Group(); + this._targetRay.matrixAutoUpdate = false; + this._targetRay.visible = false; + this._targetRay.hasLinearVelocity = false; + this._targetRay.linearVelocity = new Vector3(); + this._targetRay.hasAngularVelocity = false; + this._targetRay.angularVelocity = new Vector3(); + } + return this._targetRay; + } + /** + * Returns a group representing the grip space of the XR controller. + * + * @return {Group} A group representing the grip space of the XR controller. + */ + getGripSpace() { + if (this._grip === null) { + this._grip = new Group(); + this._grip.matrixAutoUpdate = false; + this._grip.visible = false; + this._grip.hasLinearVelocity = false; + this._grip.linearVelocity = new Vector3(); + this._grip.hasAngularVelocity = false; + this._grip.angularVelocity = new Vector3(); + } + return this._grip; + } + /** + * Dispatches the given event to the groups representing + * the different coordinate spaces of the XR controller. + * + * @param {Object} event - The event to dispatch. + * @return {WebXRController} A reference to this instance. + */ + dispatchEvent(event) { + if (this._targetRay !== null) { + this._targetRay.dispatchEvent(event); + } + if (this._grip !== null) { + this._grip.dispatchEvent(event); + } + if (this._hand !== null) { + this._hand.dispatchEvent(event); + } + return this; + } + /** + * Connects the controller with the given XR input source. + * + * @param {XRInputSource} inputSource - The input source. + * @return {WebXRController} A reference to this instance. + */ + connect(inputSource) { + if (inputSource && inputSource.hand) { + const hand = this._hand; + if (hand) { + for (const inputjoint of inputSource.hand.values()) { + this._getHandJoint(hand, inputjoint); + } + } + } + this.dispatchEvent({ type: "connected", data: inputSource }); + return this; + } + /** + * Disconnects the controller from the given XR input source. + * + * @param {XRInputSource} inputSource - The input source. + * @return {WebXRController} A reference to this instance. + */ + disconnect(inputSource) { + this.dispatchEvent({ type: "disconnected", data: inputSource }); + if (this._targetRay !== null) { + this._targetRay.visible = false; + } + if (this._grip !== null) { + this._grip.visible = false; + } + if (this._hand !== null) { + this._hand.visible = false; + } + return this; + } + /** + * Updates the controller with the given input source, XR frame and reference space. + * This updates the transformations of the groups that represent the different + * coordinate systems of the controller. + * + * @param {XRInputSource} inputSource - The input source. + * @param {XRFrame} frame - The XR frame. + * @param {XRReferenceSpace} referenceSpace - The reference space. + * @return {WebXRController} A reference to this instance. + */ + update(inputSource, frame, referenceSpace) { + let inputPose = null; + let gripPose = null; + let handPose = null; + const targetRay = this._targetRay; + const grip = this._grip; + const hand = this._hand; + if (inputSource && frame.session.visibilityState !== "visible-blurred") { + if (hand && inputSource.hand) { + handPose = true; + for (const inputjoint of inputSource.hand.values()) { + const jointPose = frame.getJointPose(inputjoint, referenceSpace); + const joint = this._getHandJoint(hand, inputjoint); + if (jointPose !== null) { + joint.matrix.fromArray(jointPose.transform.matrix); + joint.matrix.decompose(joint.position, joint.rotation, joint.scale); + joint.matrixWorldNeedsUpdate = true; + joint.jointRadius = jointPose.radius; + } + joint.visible = jointPose !== null; + } + const indexTip = hand.joints["index-finger-tip"]; + const thumbTip = hand.joints["thumb-tip"]; + const distance = indexTip.position.distanceTo(thumbTip.position); + const distanceToPinch = 0.02; + const threshold = 5e-3; + if (hand.inputState.pinching && distance > distanceToPinch + threshold) { + hand.inputState.pinching = false; + this.dispatchEvent({ + type: "pinchend", + handedness: inputSource.handedness, + target: this + }); + } else if (!hand.inputState.pinching && distance <= distanceToPinch - threshold) { + hand.inputState.pinching = true; + this.dispatchEvent({ + type: "pinchstart", + handedness: inputSource.handedness, + target: this + }); + } + } else { + if (grip !== null && inputSource.gripSpace) { + gripPose = frame.getPose(inputSource.gripSpace, referenceSpace); + if (gripPose !== null) { + grip.matrix.fromArray(gripPose.transform.matrix); + grip.matrix.decompose(grip.position, grip.rotation, grip.scale); + grip.matrixWorldNeedsUpdate = true; + if (gripPose.linearVelocity) { + grip.hasLinearVelocity = true; + grip.linearVelocity.copy(gripPose.linearVelocity); + } else { + grip.hasLinearVelocity = false; + } + if (gripPose.angularVelocity) { + grip.hasAngularVelocity = true; + grip.angularVelocity.copy(gripPose.angularVelocity); + } else { + grip.hasAngularVelocity = false; + } + } + } + } + if (targetRay !== null) { + inputPose = frame.getPose(inputSource.targetRaySpace, referenceSpace); + if (inputPose === null && gripPose !== null) { + inputPose = gripPose; + } + if (inputPose !== null) { + targetRay.matrix.fromArray(inputPose.transform.matrix); + targetRay.matrix.decompose(targetRay.position, targetRay.rotation, targetRay.scale); + targetRay.matrixWorldNeedsUpdate = true; + if (inputPose.linearVelocity) { + targetRay.hasLinearVelocity = true; + targetRay.linearVelocity.copy(inputPose.linearVelocity); + } else { + targetRay.hasLinearVelocity = false; + } + if (inputPose.angularVelocity) { + targetRay.hasAngularVelocity = true; + targetRay.angularVelocity.copy(inputPose.angularVelocity); + } else { + targetRay.hasAngularVelocity = false; + } + this.dispatchEvent(_moveEvent); + } + } + } + if (targetRay !== null) { + targetRay.visible = inputPose !== null; + } + if (grip !== null) { + grip.visible = gripPose !== null; + } + if (hand !== null) { + hand.visible = handPose !== null; + } + return this; + } + /** + * Returns a group representing the hand joint for the given input joint. + * + * @private + * @param {Group} hand - The group representing the hand space. + * @param {XRJointSpace} inputjoint - The hand joint data. + * @return {Group} A group representing the hand joint for the given input joint. + */ + _getHandJoint(hand, inputjoint) { + if (hand.joints[inputjoint.jointName] === void 0) { + const joint = new Group(); + joint.matrixAutoUpdate = false; + joint.visible = false; + hand.joints[inputjoint.jointName] = joint; + hand.add(joint); + } + return hand.joints[inputjoint.jointName]; + } +}; +var FogExp2 = class _FogExp2 { + /** + * Constructs a new fog. + * + * @param {number|Color} color - The fog's color. + * @param {number} [density=0.00025] - Defines how fast the fog will grow dense. + */ + constructor(color, density = 25e-5) { + this.isFogExp2 = true; + this.name = ""; + this.color = new Color(color); + this.density = density; + } + /** + * Returns a new fog with copied values from this instance. + * + * @return {FogExp2} A clone of this instance. + */ + clone() { + return new _FogExp2(this.color, this.density); + } + /** + * Serializes the fog into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized fog + */ + toJSON() { + return { + type: "FogExp2", + name: this.name, + color: this.color.getHex(), + density: this.density + }; + } +}; +var Fog = class _Fog { + /** + * Constructs a new fog. + * + * @param {number|Color} color - The fog's color. + * @param {number} [near=1] - The minimum distance to start applying fog. + * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied. + */ + constructor(color, near = 1, far = 1e3) { + this.isFog = true; + this.name = ""; + this.color = new Color(color); + this.near = near; + this.far = far; + } + /** + * Returns a new fog with copied values from this instance. + * + * @return {Fog} A clone of this instance. + */ + clone() { + return new _Fog(this.color, this.near, this.far); + } + /** + * Serializes the fog into JSON. + * + * @param {?(Object|string)} meta - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized fog + */ + toJSON() { + return { + type: "Fog", + name: this.name, + color: this.color.getHex(), + near: this.near, + far: this.far + }; + } +}; +var Scene = class extends Object3D { + /** + * Constructs a new scene. + */ + constructor() { + super(); + this.isScene = true; + this.type = "Scene"; + this.background = null; + this.environment = null; + this.fog = null; + this.backgroundBlurriness = 0; + this.backgroundIntensity = 1; + this.backgroundRotation = new Euler(); + this.environmentIntensity = 1; + this.environmentRotation = new Euler(); + this.overrideMaterial = null; + if (typeof __THREE_DEVTOOLS__ !== "undefined") { + __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this })); + } + } + copy(source, recursive) { + super.copy(source, recursive); + if (source.background !== null) this.background = source.background.clone(); + if (source.environment !== null) this.environment = source.environment.clone(); + if (source.fog !== null) this.fog = source.fog.clone(); + this.backgroundBlurriness = source.backgroundBlurriness; + this.backgroundIntensity = source.backgroundIntensity; + this.backgroundRotation.copy(source.backgroundRotation); + this.environmentIntensity = source.environmentIntensity; + this.environmentRotation.copy(source.environmentRotation); + if (source.overrideMaterial !== null) this.overrideMaterial = source.overrideMaterial.clone(); + this.matrixAutoUpdate = source.matrixAutoUpdate; + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + if (this.fog !== null) data.object.fog = this.fog.toJSON(); + if (this.backgroundBlurriness > 0) data.object.backgroundBlurriness = this.backgroundBlurriness; + if (this.backgroundIntensity !== 1) data.object.backgroundIntensity = this.backgroundIntensity; + data.object.backgroundRotation = this.backgroundRotation.toArray(); + if (this.environmentIntensity !== 1) data.object.environmentIntensity = this.environmentIntensity; + data.object.environmentRotation = this.environmentRotation.toArray(); + return data; + } +}; +var InterleavedBuffer = class { + /** + * Constructs a new interleaved buffer. + * + * @param {TypedArray} array - A typed array with a shared buffer storing attribute data. + * @param {number} stride - The number of typed-array elements per vertex. + */ + constructor(array, stride) { + this.isInterleavedBuffer = true; + this.array = array; + this.stride = stride; + this.count = array !== void 0 ? array.length / stride : 0; + this.usage = StaticDrawUsage; + this.updateRanges = []; + this.version = 0; + this.uuid = generateUUID(); + } + /** + * A callback function that is executed after the renderer has transferred the attribute array + * data to the GPU. + */ + onUploadCallback() { + } + /** + * Flag to indicate that this attribute has changed and should be re-sent to + * the GPU. Set this to `true` when you modify the value of the array. + * + * @type {number} + * @default false + * @param {boolean} value + */ + set needsUpdate(value) { + if (value === true) this.version++; + } + /** + * Sets the usage of this interleaved buffer. + * + * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set. + * @return {InterleavedBuffer} A reference to this interleaved buffer. + */ + setUsage(value) { + this.usage = value; + return this; + } + /** + * Adds a range of data in the data array to be updated on the GPU. + * + * @param {number} start - Position at which to start update. + * @param {number} count - The number of components to update. + */ + addUpdateRange(start, count) { + this.updateRanges.push({ start, count }); + } + /** + * Clears the update ranges. + */ + clearUpdateRanges() { + this.updateRanges.length = 0; + } + /** + * Copies the values of the given interleaved buffer to this instance. + * + * @param {InterleavedBuffer} source - The interleaved buffer to copy. + * @return {InterleavedBuffer} A reference to this instance. + */ + copy(source) { + this.array = new source.array.constructor(source.array); + this.count = source.count; + this.stride = source.stride; + this.usage = source.usage; + return this; + } + /** + * Copies a vector from the given interleaved buffer to this one. The start + * and destination position in the attribute buffers are represented by the + * given indices. + * + * @param {number} index1 - The destination index into this interleaved buffer. + * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from. + * @param {number} index2 - The source index into the given interleaved buffer. + * @return {InterleavedBuffer} A reference to this instance. + */ + copyAt(index1, interleavedBuffer, index2) { + index1 *= this.stride; + index2 *= interleavedBuffer.stride; + for (let i = 0, l = this.stride; i < l; i++) { + this.array[index1 + i] = interleavedBuffer.array[index2 + i]; + } + return this; + } + /** + * Sets the given array data in the interleaved buffer. + * + * @param {(TypedArray|Array)} value - The array data to set. + * @param {number} [offset=0] - The offset in this interleaved buffer's array. + * @return {InterleavedBuffer} A reference to this instance. + */ + set(value, offset = 0) { + this.array.set(value, offset); + return this; + } + /** + * Returns a new interleaved buffer with copied values from this instance. + * + * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures. + * @return {InterleavedBuffer} A clone of this instance. + */ + clone(data) { + if (data.arrayBuffers === void 0) { + data.arrayBuffers = {}; + } + if (this.array.buffer._uuid === void 0) { + this.array.buffer._uuid = generateUUID(); + } + if (data.arrayBuffers[this.array.buffer._uuid] === void 0) { + data.arrayBuffers[this.array.buffer._uuid] = this.array.slice(0).buffer; + } + const array = new this.array.constructor(data.arrayBuffers[this.array.buffer._uuid]); + const ib = new this.constructor(array, this.stride); + ib.setUsage(this.usage); + return ib; + } + /** + * Sets the given callback function that is executed after the Renderer has transferred + * the array data to the GPU. Can be used to perform clean-up operations after + * the upload when data are not needed anymore on the CPU side. + * + * @param {Function} callback - The `onUpload()` callback. + * @return {InterleavedBuffer} A reference to this instance. + */ + onUpload(callback) { + this.onUploadCallback = callback; + return this; + } + /** + * Serializes the interleaved buffer into JSON. + * + * @param {Object} [data] - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized interleaved buffer. + */ + toJSON(data) { + if (data.arrayBuffers === void 0) { + data.arrayBuffers = {}; + } + if (this.array.buffer._uuid === void 0) { + this.array.buffer._uuid = generateUUID(); + } + if (data.arrayBuffers[this.array.buffer._uuid] === void 0) { + data.arrayBuffers[this.array.buffer._uuid] = Array.from(new Uint32Array(this.array.buffer)); + } + return { + uuid: this.uuid, + buffer: this.array.buffer._uuid, + type: this.array.constructor.name, + stride: this.stride + }; + } +}; +var _vector$7 = new Vector3(); +var InterleavedBufferAttribute = class _InterleavedBufferAttribute { + /** + * Constructs a new interleaved buffer attribute. + * + * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data. + * @param {number} itemSize - The item size. + * @param {number} offset - The attribute offset into the buffer. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(interleavedBuffer, itemSize, offset, normalized = false) { + this.isInterleavedBufferAttribute = true; + this.name = ""; + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + this.normalized = normalized; + } + /** + * The item count of this buffer attribute. + * + * @type {number} + * @readonly + */ + get count() { + return this.data.count; + } + /** + * The array holding the interleaved buffer attribute data. + * + * @type {TypedArray} + */ + get array() { + return this.data.array; + } + /** + * Flag to indicate that this attribute has changed and should be re-sent to + * the GPU. Set this to `true` when you modify the value of the array. + * + * @type {number} + * @default false + * @param {boolean} value + */ + set needsUpdate(value) { + this.data.needsUpdate = value; + } + /** + * Applies the given 4x4 matrix to the given attribute. Only works with + * item size `3`. + * + * @param {Matrix4} m - The matrix to apply. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + applyMatrix4(m) { + for (let i = 0, l = this.data.count; i < l; i++) { + _vector$7.fromBufferAttribute(this, i); + _vector$7.applyMatrix4(m); + this.setXYZ(i, _vector$7.x, _vector$7.y, _vector$7.z); + } + return this; + } + /** + * Applies the given 3x3 normal matrix to the given attribute. Only works with + * item size `3`. + * + * @param {Matrix3} m - The normal matrix to apply. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + applyNormalMatrix(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$7.fromBufferAttribute(this, i); + _vector$7.applyNormalMatrix(m); + this.setXYZ(i, _vector$7.x, _vector$7.y, _vector$7.z); + } + return this; + } + /** + * Applies the given 4x4 matrix to the given attribute. Only works with + * item size `3` and with direction vectors. + * + * @param {Matrix4} m - The matrix to apply. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + transformDirection(m) { + for (let i = 0, l = this.count; i < l; i++) { + _vector$7.fromBufferAttribute(this, i); + _vector$7.transformDirection(m); + this.setXYZ(i, _vector$7.x, _vector$7.y, _vector$7.z); + } + return this; + } + /** + * Returns the given component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} component - The component index. + * @return {number} The returned value. + */ + getComponent(index, component) { + let value = this.array[index * this.data.stride + this.offset + component]; + if (this.normalized) value = denormalize(value, this.array); + return value; + } + /** + * Sets the given value to the given component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} component - The component index. + * @param {number} value - The value to set. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + setComponent(index, component, value) { + if (this.normalized) value = normalize(value, this.array); + this.data.array[index * this.data.stride + this.offset + component] = value; + return this; + } + /** + * Sets the x component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} x - The value to set. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + setX(index, x) { + if (this.normalized) x = normalize(x, this.array); + this.data.array[index * this.data.stride + this.offset] = x; + return this; + } + /** + * Sets the y component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} y - The value to set. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + setY(index, y) { + if (this.normalized) y = normalize(y, this.array); + this.data.array[index * this.data.stride + this.offset + 1] = y; + return this; + } + /** + * Sets the z component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} z - The value to set. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + setZ(index, z) { + if (this.normalized) z = normalize(z, this.array); + this.data.array[index * this.data.stride + this.offset + 2] = z; + return this; + } + /** + * Sets the w component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} w - The value to set. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + setW(index, w) { + if (this.normalized) w = normalize(w, this.array); + this.data.array[index * this.data.stride + this.offset + 3] = w; + return this; + } + /** + * Returns the x component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @return {number} The x component. + */ + getX(index) { + let x = this.data.array[index * this.data.stride + this.offset]; + if (this.normalized) x = denormalize(x, this.array); + return x; + } + /** + * Returns the y component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @return {number} The y component. + */ + getY(index) { + let y = this.data.array[index * this.data.stride + this.offset + 1]; + if (this.normalized) y = denormalize(y, this.array); + return y; + } + /** + * Returns the z component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @return {number} The z component. + */ + getZ(index) { + let z = this.data.array[index * this.data.stride + this.offset + 2]; + if (this.normalized) z = denormalize(z, this.array); + return z; + } + /** + * Returns the w component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @return {number} The w component. + */ + getW(index) { + let w = this.data.array[index * this.data.stride + this.offset + 3]; + if (this.normalized) w = denormalize(w, this.array); + return w; + } + /** + * Sets the x and y component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} x - The value for the x component to set. + * @param {number} y - The value for the y component to set. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + setXY(index, x, y) { + index = index * this.data.stride + this.offset; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + } + this.data.array[index + 0] = x; + this.data.array[index + 1] = y; + return this; + } + /** + * Sets the x, y and z component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} x - The value for the x component to set. + * @param {number} y - The value for the y component to set. + * @param {number} z - The value for the z component to set. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + setXYZ(index, x, y, z) { + index = index * this.data.stride + this.offset; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + } + this.data.array[index + 0] = x; + this.data.array[index + 1] = y; + this.data.array[index + 2] = z; + return this; + } + /** + * Sets the x, y, z and w component of the vector at the given index. + * + * @param {number} index - The index into the buffer attribute. + * @param {number} x - The value for the x component to set. + * @param {number} y - The value for the y component to set. + * @param {number} z - The value for the z component to set. + * @param {number} w - The value for the w component to set. + * @return {InterleavedBufferAttribute} A reference to this instance. + */ + setXYZW(index, x, y, z, w) { + index = index * this.data.stride + this.offset; + if (this.normalized) { + x = normalize(x, this.array); + y = normalize(y, this.array); + z = normalize(z, this.array); + w = normalize(w, this.array); + } + this.data.array[index + 0] = x; + this.data.array[index + 1] = y; + this.data.array[index + 2] = z; + this.data.array[index + 3] = w; + return this; + } + /** + * Returns a new buffer attribute with copied values from this instance. + * + * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data. + * + * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property. + * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance. + */ + clone(data) { + if (data === void 0) { + log("InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data."); + const array = []; + for (let i = 0; i < this.count; i++) { + const index = i * this.data.stride + this.offset; + for (let j = 0; j < this.itemSize; j++) { + array.push(this.data.array[index + j]); + } + } + return new BufferAttribute(new this.array.constructor(array), this.itemSize, this.normalized); + } else { + if (data.interleavedBuffers === void 0) { + data.interleavedBuffers = {}; + } + if (data.interleavedBuffers[this.data.uuid] === void 0) { + data.interleavedBuffers[this.data.uuid] = this.data.clone(data); + } + return new _InterleavedBufferAttribute(data.interleavedBuffers[this.data.uuid], this.itemSize, this.offset, this.normalized); + } + } + /** + * Serializes the buffer attribute into JSON. + * + * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data. + * + * @param {Object} [data] - An optional value holding meta information about the serialization. + * @return {Object} A JSON object representing the serialized buffer attribute. + */ + toJSON(data) { + if (data === void 0) { + log("InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data."); + const array = []; + for (let i = 0; i < this.count; i++) { + const index = i * this.data.stride + this.offset; + for (let j = 0; j < this.itemSize; j++) { + array.push(this.data.array[index + j]); + } + } + return { + itemSize: this.itemSize, + type: this.array.constructor.name, + array, + normalized: this.normalized + }; + } else { + if (data.interleavedBuffers === void 0) { + data.interleavedBuffers = {}; + } + if (data.interleavedBuffers[this.data.uuid] === void 0) { + data.interleavedBuffers[this.data.uuid] = this.data.toJSON(data); + } + return { + isInterleavedBufferAttribute: true, + itemSize: this.itemSize, + data: this.data.uuid, + offset: this.offset, + normalized: this.normalized + }; + } + } +}; +var SpriteMaterial = class extends Material { + /** + * Constructs a new sprite material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isSpriteMaterial = true; + this.type = "SpriteMaterial"; + this.color = new Color(16777215); + this.map = null; + this.alphaMap = null; + this.rotation = 0; + this.sizeAttenuation = true; + this.transparent = true; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.alphaMap = source.alphaMap; + this.rotation = source.rotation; + this.sizeAttenuation = source.sizeAttenuation; + this.fog = source.fog; + return this; + } +}; +var _geometry; +var _intersectPoint = new Vector3(); +var _worldScale = new Vector3(); +var _mvPosition = new Vector3(); +var _alignedPosition = new Vector2(); +var _rotatedPosition = new Vector2(); +var _viewWorldMatrix = new Matrix4(); +var _vA = new Vector3(); +var _vB = new Vector3(); +var _vC = new Vector3(); +var _uvA = new Vector2(); +var _uvB = new Vector2(); +var _uvC = new Vector2(); +var Sprite = class extends Object3D { + /** + * Constructs a new sprite. + * + * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material. + */ + constructor(material = new SpriteMaterial()) { + super(); + this.isSprite = true; + this.type = "Sprite"; + if (_geometry === void 0) { + _geometry = new BufferGeometry(); + const float32Array = 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 + ]); + const interleavedBuffer = new InterleavedBuffer(float32Array, 5); + _geometry.setIndex([0, 1, 2, 0, 2, 3]); + _geometry.setAttribute("position", new InterleavedBufferAttribute(interleavedBuffer, 3, 0, false)); + _geometry.setAttribute("uv", new InterleavedBufferAttribute(interleavedBuffer, 2, 3, false)); + } + this.geometry = _geometry; + this.material = material; + this.center = new Vector2(0.5, 0.5); + this.count = 1; + } + /** + * Computes intersection points between a casted ray and this sprite. + * + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - The target array that holds the intersection points. + */ + raycast(raycaster, intersects2) { + if (raycaster.camera === null) { + error('Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'); + } + _worldScale.setFromMatrixScale(this.matrixWorld); + _viewWorldMatrix.copy(raycaster.camera.matrixWorld); + this.modelViewMatrix.multiplyMatrices(raycaster.camera.matrixWorldInverse, this.matrixWorld); + _mvPosition.setFromMatrixPosition(this.modelViewMatrix); + if (raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false) { + _worldScale.multiplyScalar(-_mvPosition.z); + } + const rotation = this.material.rotation; + let sin, cos; + if (rotation !== 0) { + cos = Math.cos(rotation); + sin = Math.sin(rotation); + } + const center = this.center; + transformVertex(_vA.set(-0.5, -0.5, 0), _mvPosition, center, _worldScale, sin, cos); + transformVertex(_vB.set(0.5, -0.5, 0), _mvPosition, center, _worldScale, sin, cos); + transformVertex(_vC.set(0.5, 0.5, 0), _mvPosition, center, _worldScale, sin, cos); + _uvA.set(0, 0); + _uvB.set(1, 0); + _uvC.set(1, 1); + let intersect2 = raycaster.ray.intersectTriangle(_vA, _vB, _vC, false, _intersectPoint); + if (intersect2 === null) { + transformVertex(_vB.set(-0.5, 0.5, 0), _mvPosition, center, _worldScale, sin, cos); + _uvB.set(0, 1); + intersect2 = raycaster.ray.intersectTriangle(_vA, _vC, _vB, false, _intersectPoint); + if (intersect2 === null) { + return; + } + } + const distance = raycaster.ray.origin.distanceTo(_intersectPoint); + if (distance < raycaster.near || distance > raycaster.far) return; + intersects2.push({ + distance, + point: _intersectPoint.clone(), + uv: Triangle.getInterpolation(_intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2()), + face: null, + object: this + }); + } + copy(source, recursive) { + super.copy(source, recursive); + if (source.center !== void 0) this.center.copy(source.center); + this.material = source.material; + return this; + } +}; +function transformVertex(vertexPosition, mvPosition, center, scale, sin, cos) { + _alignedPosition.subVectors(vertexPosition, center).addScalar(0.5).multiply(scale); + if (sin !== void 0) { + _rotatedPosition.x = cos * _alignedPosition.x - sin * _alignedPosition.y; + _rotatedPosition.y = sin * _alignedPosition.x + cos * _alignedPosition.y; + } else { + _rotatedPosition.copy(_alignedPosition); + } + vertexPosition.copy(mvPosition); + vertexPosition.x += _rotatedPosition.x; + vertexPosition.y += _rotatedPosition.y; + vertexPosition.applyMatrix4(_viewWorldMatrix); +} +var _v1$2 = new Vector3(); +var _v2$1 = new Vector3(); +var LOD = class extends Object3D { + /** + * Constructs a new LOD. + */ + constructor() { + super(); + this.isLOD = true; + this._currentLevel = 0; + this.type = "LOD"; + Object.defineProperties(this, { + /** + * This array holds the LOD levels. + * + * @name LOD#levels + * @type {Array<{object:Object3D,distance:number,hysteresis:number}>} + */ + levels: { + enumerable: true, + value: [] + } + }); + this.autoUpdate = true; + } + copy(source) { + super.copy(source, false); + const levels = source.levels; + for (let i = 0, l = levels.length; i < l; i++) { + const level = levels[i]; + this.addLevel(level.object.clone(), level.distance, level.hysteresis); + } + this.autoUpdate = source.autoUpdate; + return this; + } + /** + * Adds a mesh that will display at a certain distance and greater. Typically + * the further away the distance, the lower the detail on the mesh. + * + * @param {Object3D} object - The 3D object to display at this level. + * @param {number} [distance=0] - The distance at which to display this level of detail. + * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance. + * @return {LOD} A reference to this instance. + */ + addLevel(object, distance = 0, hysteresis = 0) { + distance = Math.abs(distance); + const levels = this.levels; + let l; + for (l = 0; l < levels.length; l++) { + if (distance < levels[l].distance) { + break; + } + } + levels.splice(l, 0, { distance, hysteresis, object }); + this.add(object); + return this; + } + /** + * Removes an existing level, based on the distance from the camera. + * Returns `true` when the level has been removed. Otherwise `false`. + * + * @param {number} distance - Distance of the level to remove. + * @return {boolean} Whether the level has been removed or not. + */ + removeLevel(distance) { + const levels = this.levels; + for (let i = 0; i < levels.length; i++) { + if (levels[i].distance === distance) { + const removedElements = levels.splice(i, 1); + this.remove(removedElements[0].object); + return true; + } + } + return false; + } + /** + * Returns the currently active LOD level index. + * + * @return {number} The current active LOD level index. + */ + getCurrentLevel() { + return this._currentLevel; + } + /** + * Returns a reference to the first 3D object that is greater than + * the given distance. + * + * @param {number} distance - The LOD distance. + * @return {?Object3D} The found 3D object. `null` if no 3D object has been found. + */ + getObjectForDistance(distance) { + const levels = this.levels; + if (levels.length > 0) { + let i, l; + for (i = 1, l = levels.length; i < l; i++) { + let levelDistance = levels[i].distance; + if (levels[i].object.visible) { + levelDistance -= levelDistance * levels[i].hysteresis; + } + if (distance < levelDistance) { + break; + } + } + return levels[i - 1].object; + } + return null; + } + /** + * Computes intersection points between a casted ray and this LOD. + * + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - The target array that holds the intersection points. + */ + raycast(raycaster, intersects2) { + const levels = this.levels; + if (levels.length > 0) { + _v1$2.setFromMatrixPosition(this.matrixWorld); + const distance = raycaster.ray.origin.distanceTo(_v1$2); + this.getObjectForDistance(distance).raycast(raycaster, intersects2); + } + } + /** + * Updates the LOD by computing which LOD level should be visible according + * to the current distance of the given camera. + * + * @param {Camera} camera - The camera the scene is rendered with. + */ + update(camera) { + const levels = this.levels; + if (levels.length > 1) { + _v1$2.setFromMatrixPosition(camera.matrixWorld); + _v2$1.setFromMatrixPosition(this.matrixWorld); + const distance = _v1$2.distanceTo(_v2$1) / camera.zoom; + levels[0].object.visible = true; + let i, l; + for (i = 1, l = levels.length; i < l; i++) { + let levelDistance = levels[i].distance; + if (levels[i].object.visible) { + levelDistance -= levelDistance * levels[i].hysteresis; + } + if (distance >= levelDistance) { + levels[i - 1].object.visible = false; + levels[i].object.visible = true; + } else { + break; + } + } + this._currentLevel = i - 1; + for (; i < l; i++) { + levels[i].object.visible = false; + } + } + } + toJSON(meta) { + const data = super.toJSON(meta); + if (this.autoUpdate === false) data.object.autoUpdate = false; + data.object.levels = []; + const levels = this.levels; + for (let i = 0, l = levels.length; i < l; i++) { + const level = levels[i]; + data.object.levels.push({ + object: level.object.uuid, + distance: level.distance, + hysteresis: level.hysteresis + }); + } + return data; + } +}; +var _basePosition = new Vector3(); +var _skinIndex = new Vector4(); +var _skinWeight = new Vector4(); +var _vector3 = new Vector3(); +var _matrix4 = new Matrix4(); +var _vertex = new Vector3(); +var _sphere$5 = new Sphere(); +var _inverseMatrix$2 = new Matrix4(); +var _ray$2 = new Ray(); +var SkinnedMesh = class extends Mesh { + /** + * Constructs a new skinned mesh. + * + * @param {BufferGeometry} [geometry] - The mesh geometry. + * @param {Material|Array} [material] - The mesh material. + */ + constructor(geometry, material) { + super(geometry, material); + this.isSkinnedMesh = true; + this.type = "SkinnedMesh"; + this.bindMode = AttachedBindMode; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + this.boundingBox = null; + this.boundingSphere = null; + } + /** + * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}. + * The bounding box is not automatically computed by the engine; this method must be called by your app. + * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect + * the current animation state. + */ + computeBoundingBox() { + const geometry = this.geometry; + if (this.boundingBox === null) { + this.boundingBox = new Box3(); + } + this.boundingBox.makeEmpty(); + const positionAttribute = geometry.getAttribute("position"); + for (let i = 0; i < positionAttribute.count; i++) { + this.getVertexPosition(i, _vertex); + this.boundingBox.expandByPoint(_vertex); + } + } + /** + * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}. + * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting + * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed + * per frame in order to reflect the current animation state. + */ + computeBoundingSphere() { + const geometry = this.geometry; + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere(); + } + this.boundingSphere.makeEmpty(); + const positionAttribute = geometry.getAttribute("position"); + for (let i = 0; i < positionAttribute.count; i++) { + this.getVertexPosition(i, _vertex); + this.boundingSphere.expandByPoint(_vertex); + } + } + copy(source, recursive) { + super.copy(source, recursive); + this.bindMode = source.bindMode; + this.bindMatrix.copy(source.bindMatrix); + this.bindMatrixInverse.copy(source.bindMatrixInverse); + this.skeleton = source.skeleton; + if (source.boundingBox !== null) this.boundingBox = source.boundingBox.clone(); + if (source.boundingSphere !== null) this.boundingSphere = source.boundingSphere.clone(); + return this; + } + raycast(raycaster, intersects2) { + const material = this.material; + const matrixWorld = this.matrixWorld; + if (material === void 0) return; + if (this.boundingSphere === null) this.computeBoundingSphere(); + _sphere$5.copy(this.boundingSphere); + _sphere$5.applyMatrix4(matrixWorld); + if (raycaster.ray.intersectsSphere(_sphere$5) === false) return; + _inverseMatrix$2.copy(matrixWorld).invert(); + _ray$2.copy(raycaster.ray).applyMatrix4(_inverseMatrix$2); + if (this.boundingBox !== null) { + if (_ray$2.intersectsBox(this.boundingBox) === false) return; + } + this._computeIntersections(raycaster, intersects2, _ray$2); + } + getVertexPosition(index, target) { + super.getVertexPosition(index, target); + this.applyBoneTransform(index, target); + return target; + } + /** + * Binds the given skeleton to the skinned mesh. + * + * @param {Skeleton} skeleton - The skeleton to bind. + * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided, + * the skinned mesh's world matrix will be used instead. + */ + bind(skeleton, bindMatrix) { + this.skeleton = skeleton; + if (bindMatrix === void 0) { + this.updateMatrixWorld(true); + this.skeleton.calculateInverses(); + bindMatrix = this.matrixWorld; + } + this.bindMatrix.copy(bindMatrix); + this.bindMatrixInverse.copy(bindMatrix).invert(); + } + /** + * This method sets the skinned mesh in the rest pose). + */ + pose() { + this.skeleton.pose(); + } + /** + * Normalizes the skin weights which are defined as a buffer attribute + * in the skinned mesh's geometry. + */ + normalizeSkinWeights() { + const vector = new Vector4(); + const skinWeight = this.geometry.attributes.skinWeight; + for (let i = 0, l = skinWeight.count; i < l; i++) { + vector.fromBufferAttribute(skinWeight, i); + const scale = 1 / vector.manhattanLength(); + if (scale !== Infinity) { + vector.multiplyScalar(scale); + } else { + vector.set(1, 0, 0, 0); + } + skinWeight.setXYZW(i, vector.x, vector.y, vector.z, vector.w); + } + } + updateMatrixWorld(force) { + super.updateMatrixWorld(force); + if (this.bindMode === AttachedBindMode) { + this.bindMatrixInverse.copy(this.matrixWorld).invert(); + } else if (this.bindMode === DetachedBindMode) { + this.bindMatrixInverse.copy(this.bindMatrix).invert(); + } else { + warn("SkinnedMesh: Unrecognized bindMode: " + this.bindMode); + } + } + /** + * Applies the bone transform associated with the given index to the given + * vertex position. Returns the updated vector. + * + * @param {number} index - The vertex index. + * @param {Vector3} target - The target object that is used to store the method's result. + * the skinned mesh's world matrix will be used instead. + * @return {Vector3} The updated vertex position. + */ + applyBoneTransform(index, target) { + const skeleton = this.skeleton; + const geometry = this.geometry; + _skinIndex.fromBufferAttribute(geometry.attributes.skinIndex, index); + _skinWeight.fromBufferAttribute(geometry.attributes.skinWeight, index); + _basePosition.copy(target).applyMatrix4(this.bindMatrix); + target.set(0, 0, 0); + for (let i = 0; i < 4; i++) { + const weight = _skinWeight.getComponent(i); + if (weight !== 0) { + const boneIndex = _skinIndex.getComponent(i); + _matrix4.multiplyMatrices(skeleton.bones[boneIndex].matrixWorld, skeleton.boneInverses[boneIndex]); + target.addScaledVector(_vector3.copy(_basePosition).applyMatrix4(_matrix4), weight); + } + } + return target.applyMatrix4(this.bindMatrixInverse); + } +}; +var Bone = class extends Object3D { + /** + * Constructs a new bone. + */ + constructor() { + super(); + this.isBone = true; + this.type = "Bone"; + } +}; +var DataTexture = class extends Texture { + /** + * Constructs a new data texture. + * + * @param {?TypedArray} [data=null] - The buffer data. + * @param {number} [width=1] - The width of the texture. + * @param {number} [height=1] - The height of the texture. + * @param {number} [format=RGBAFormat] - The texture format. + * @param {number} [type=UnsignedByteType] - The texture type. + * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=NearestFilter] - The mag filter value. + * @param {number} [minFilter=NearestFilter] - The min filter value. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + * @param {string} [colorSpace=NoColorSpace] - The color space. + */ + constructor(data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace) { + super(null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); + this.isDataTexture = true; + this.image = { data, width, height }; + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + } +}; +var _offsetMatrix = new Matrix4(); +var _identityMatrix = new Matrix4(); +var Skeleton = class _Skeleton { + /** + * Constructs a new skeleton. + * + * @param {Array} [bones] - An array of bones. + * @param {Array} [boneInverses] - An array of bone inverse matrices. + * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}. + */ + constructor(bones = [], boneInverses = []) { + this.uuid = generateUUID(); + this.bones = bones.slice(0); + this.boneInverses = boneInverses; + this.boneMatrices = null; + this.previousBoneMatrices = null; + this.boneTexture = null; + this.init(); + } + /** + * Initializes the skeleton. This method gets automatically called by the constructor + * but depending on how the skeleton is created it might be necessary to call this method + * manually. + */ + init() { + const bones = this.bones; + const boneInverses = this.boneInverses; + this.boneMatrices = new Float32Array(bones.length * 16); + if (boneInverses.length === 0) { + this.calculateInverses(); + } else { + if (bones.length !== boneInverses.length) { + warn("Skeleton: Number of inverse bone matrices does not match amount of bones."); + this.boneInverses = []; + for (let i = 0, il = this.bones.length; i < il; i++) { + this.boneInverses.push(new Matrix4()); + } + } + } + } + /** + * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses} + * and fills it with new matrices. + */ + calculateInverses() { + this.boneInverses.length = 0; + for (let i = 0, il = this.bones.length; i < il; i++) { + const inverse = new Matrix4(); + if (this.bones[i]) { + inverse.copy(this.bones[i].matrixWorld).invert(); + } + this.boneInverses.push(inverse); + } + } + /** + * Resets the skeleton to the base pose. + */ + pose() { + for (let i = 0, il = this.bones.length; i < il; i++) { + const bone = this.bones[i]; + if (bone) { + bone.matrixWorld.copy(this.boneInverses[i]).invert(); + } + } + for (let i = 0, il = this.bones.length; i < il; i++) { + const bone = this.bones[i]; + if (bone) { + if (bone.parent && bone.parent.isBone) { + bone.matrix.copy(bone.parent.matrixWorld).invert(); + bone.matrix.multiply(bone.matrixWorld); + } else { + bone.matrix.copy(bone.matrixWorld); + } + bone.matrix.decompose(bone.position, bone.quaternion, bone.scale); + } + } + } + /** + * Resets the skeleton to the base pose. + */ + update() { + const bones = this.bones; + const boneInverses = this.boneInverses; + const boneMatrices = this.boneMatrices; + const boneTexture = this.boneTexture; + for (let i = 0, il = bones.length; i < il; i++) { + const matrix = bones[i] ? bones[i].matrixWorld : _identityMatrix; + _offsetMatrix.multiplyMatrices(matrix, boneInverses[i]); + _offsetMatrix.toArray(boneMatrices, i * 16); + } + if (boneTexture !== null) { + boneTexture.needsUpdate = true; + } + } + /** + * Returns a new skeleton with copied values from this instance. + * + * @return {Skeleton} A clone of this instance. + */ + clone() { + return new _Skeleton(this.bones, this.boneInverses); + } + /** + * Computes a data texture for passing bone data to the vertex shader. + * + * @return {Skeleton} A reference of this instance. + */ + computeBoneTexture() { + let size = Math.sqrt(this.bones.length * 4); + size = Math.ceil(size / 4) * 4; + size = Math.max(size, 4); + const boneMatrices = new Float32Array(size * size * 4); + boneMatrices.set(this.boneMatrices); + const boneTexture = new DataTexture(boneMatrices, size, size, RGBAFormat, FloatType); + boneTexture.needsUpdate = true; + this.boneMatrices = boneMatrices; + this.boneTexture = boneTexture; + return this; + } + /** + * Searches through the skeleton's bone array and returns the first with a + * matching name. + * + * @param {string} name - The name of the bone. + * @return {Bone|undefined} The found bone. `undefined` if no bone has been found. + */ + getBoneByName(name) { + for (let i = 0, il = this.bones.length; i < il; i++) { + const bone = this.bones[i]; + if (bone.name === name) { + return bone; + } + } + return void 0; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + if (this.boneTexture !== null) { + this.boneTexture.dispose(); + this.boneTexture = null; + } + } + /** + * Setups the skeleton by the given JSON and bones. + * + * @param {Object} json - The skeleton as serialized JSON. + * @param {Object} bones - An array of bones. + * @return {Skeleton} A reference of this instance. + */ + fromJSON(json, bones) { + this.uuid = json.uuid; + for (let i = 0, l = json.bones.length; i < l; i++) { + const uuid = json.bones[i]; + let bone = bones[uuid]; + if (bone === void 0) { + warn("Skeleton: No bone found with UUID:", uuid); + bone = new Bone(); + } + this.bones.push(bone); + this.boneInverses.push(new Matrix4().fromArray(json.boneInverses[i])); + } + this.init(); + return this; + } + /** + * Serializes the skeleton into JSON. + * + * @return {Object} A JSON object representing the serialized skeleton. + * @see {@link ObjectLoader#parse} + */ + toJSON() { + const data = { + metadata: { + version: 4.7, + type: "Skeleton", + generator: "Skeleton.toJSON" + }, + bones: [], + boneInverses: [] + }; + data.uuid = this.uuid; + const bones = this.bones; + const boneInverses = this.boneInverses; + for (let i = 0, l = bones.length; i < l; i++) { + const bone = bones[i]; + data.bones.push(bone.uuid); + const boneInverse = boneInverses[i]; + data.boneInverses.push(boneInverse.toArray()); + } + return data; + } +}; +var InstancedBufferAttribute = class extends BufferAttribute { + /** + * Constructs a new instanced buffer attribute. + * + * @param {TypedArray} array - The array holding the attribute data. + * @param {number} itemSize - The item size. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated. + */ + constructor(array, itemSize, normalized, meshPerAttribute = 1) { + super(array, itemSize, normalized); + this.isInstancedBufferAttribute = true; + this.meshPerAttribute = meshPerAttribute; + } + copy(source) { + super.copy(source); + this.meshPerAttribute = source.meshPerAttribute; + return this; + } + toJSON() { + const data = super.toJSON(); + data.meshPerAttribute = this.meshPerAttribute; + data.isInstancedBufferAttribute = true; + return data; + } +}; +var _instanceLocalMatrix = new Matrix4(); +var _instanceWorldMatrix = new Matrix4(); +var _instanceIntersects = []; +var _box3 = new Box3(); +var _identity = new Matrix4(); +var _mesh$1 = new Mesh(); +var _sphere$4 = new Sphere(); +var InstancedMesh = class extends Mesh { + /** + * Constructs a new instanced mesh. + * + * @param {BufferGeometry} [geometry] - The mesh geometry. + * @param {Material|Array} [material] - The mesh material. + * @param {number} count - The number of instances. + */ + constructor(geometry, material, count) { + super(geometry, material); + this.isInstancedMesh = true; + this.instanceMatrix = new InstancedBufferAttribute(new Float32Array(count * 16), 16); + this.instanceColor = null; + this.morphTexture = null; + this.count = count; + this.boundingBox = null; + this.boundingSphere = null; + for (let i = 0; i < count; i++) { + this.setMatrixAt(i, _identity); + } + } + /** + * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}. + * The bounding box is not automatically computed by the engine; this method must be called by your app. + * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}. + */ + computeBoundingBox() { + const geometry = this.geometry; + const count = this.count; + if (this.boundingBox === null) { + this.boundingBox = new Box3(); + } + if (geometry.boundingBox === null) { + geometry.computeBoundingBox(); + } + this.boundingBox.makeEmpty(); + for (let i = 0; i < count; i++) { + this.getMatrixAt(i, _instanceLocalMatrix); + _box3.copy(geometry.boundingBox).applyMatrix4(_instanceLocalMatrix); + this.boundingBox.union(_box3); + } + } + /** + * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere} + * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling. + * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}. + */ + computeBoundingSphere() { + const geometry = this.geometry; + const count = this.count; + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere(); + } + if (geometry.boundingSphere === null) { + geometry.computeBoundingSphere(); + } + this.boundingSphere.makeEmpty(); + for (let i = 0; i < count; i++) { + this.getMatrixAt(i, _instanceLocalMatrix); + _sphere$4.copy(geometry.boundingSphere).applyMatrix4(_instanceLocalMatrix); + this.boundingSphere.union(_sphere$4); + } + } + copy(source, recursive) { + super.copy(source, recursive); + this.instanceMatrix.copy(source.instanceMatrix); + if (source.morphTexture !== null) this.morphTexture = source.morphTexture.clone(); + if (source.instanceColor !== null) this.instanceColor = source.instanceColor.clone(); + this.count = source.count; + if (source.boundingBox !== null) this.boundingBox = source.boundingBox.clone(); + if (source.boundingSphere !== null) this.boundingSphere = source.boundingSphere.clone(); + return this; + } + /** + * Gets the color of the defined instance. + * + * @param {number} index - The instance index. + * @param {Color} color - The target object that is used to store the method's result. + */ + getColorAt(index, color) { + color.fromArray(this.instanceColor.array, index * 3); + } + /** + * Gets the local transformation matrix of the defined instance. + * + * @param {number} index - The instance index. + * @param {Matrix4} matrix - The target object that is used to store the method's result. + */ + getMatrixAt(index, matrix) { + matrix.fromArray(this.instanceMatrix.array, index * 16); + } + /** + * Gets the morph target weights of the defined instance. + * + * @param {number} index - The instance index. + * @param {Mesh} object - The target object that is used to store the method's result. + */ + getMorphAt(index, object) { + const objectInfluences = object.morphTargetInfluences; + const array = this.morphTexture.source.data.data; + const len = objectInfluences.length + 1; + const dataIndex = index * len + 1; + for (let i = 0; i < objectInfluences.length; i++) { + objectInfluences[i] = array[dataIndex + i]; + } + } + raycast(raycaster, intersects2) { + const matrixWorld = this.matrixWorld; + const raycastTimes = this.count; + _mesh$1.geometry = this.geometry; + _mesh$1.material = this.material; + if (_mesh$1.material === void 0) return; + if (this.boundingSphere === null) this.computeBoundingSphere(); + _sphere$4.copy(this.boundingSphere); + _sphere$4.applyMatrix4(matrixWorld); + if (raycaster.ray.intersectsSphere(_sphere$4) === false) return; + for (let instanceId = 0; instanceId < raycastTimes; instanceId++) { + this.getMatrixAt(instanceId, _instanceLocalMatrix); + _instanceWorldMatrix.multiplyMatrices(matrixWorld, _instanceLocalMatrix); + _mesh$1.matrixWorld = _instanceWorldMatrix; + _mesh$1.raycast(raycaster, _instanceIntersects); + for (let i = 0, l = _instanceIntersects.length; i < l; i++) { + const intersect2 = _instanceIntersects[i]; + intersect2.instanceId = instanceId; + intersect2.object = this; + intersects2.push(intersect2); + } + _instanceIntersects.length = 0; + } + } + /** + * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of + * {@link InstancedMesh#instanceColor} to `true` after updating all the colors. + * + * @param {number} index - The instance index. + * @param {Color} color - The instance color. + */ + setColorAt(index, color) { + if (this.instanceColor === null) { + this.instanceColor = new InstancedBufferAttribute(new Float32Array(this.instanceMatrix.count * 3).fill(1), 3); + } + color.toArray(this.instanceColor.array, index * 3); + } + /** + * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of + * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors. + * + * @param {number} index - The instance index. + * @param {Matrix4} matrix - The local transformation. + */ + setMatrixAt(index, matrix) { + matrix.toArray(this.instanceMatrix.array, index * 16); + } + /** + * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of + * {@link InstancedMesh#morphTexture} to `true` after updating all the influences. + * + * @param {number} index - The instance index. + * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights + * of a single instance. + */ + setMorphAt(index, object) { + const objectInfluences = object.morphTargetInfluences; + const len = objectInfluences.length + 1; + if (this.morphTexture === null) { + this.morphTexture = new DataTexture(new Float32Array(len * this.count), len, this.count, RedFormat, FloatType); + } + const array = this.morphTexture.source.data.data; + let morphInfluencesSum = 0; + for (let i = 0; i < objectInfluences.length; i++) { + morphInfluencesSum += objectInfluences[i]; + } + const morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + const dataIndex = len * index; + array[dataIndex] = morphBaseInfluence; + array.set(objectInfluences, dataIndex + 1); + } + updateMorphTargets() { + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.dispatchEvent({ type: "dispose" }); + if (this.morphTexture !== null) { + this.morphTexture.dispose(); + this.morphTexture = null; + } + } +}; +var _vector1 = new Vector3(); +var _vector2 = new Vector3(); +var _normalMatrix = new Matrix3(); +var Plane = class { + /** + * Constructs a new plane. + * + * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane. + * @param {number} [constant=0] - The signed distance from the origin to the plane. + */ + constructor(normal = new Vector3(1, 0, 0), constant = 0) { + this.isPlane = true; + this.normal = normal; + this.constant = constant; + } + /** + * Sets the plane components by copying the given values. + * + * @param {Vector3} normal - The normal. + * @param {number} constant - The constant. + * @return {Plane} A reference to this plane. + */ + set(normal, constant) { + this.normal.copy(normal); + this.constant = constant; + return this; + } + /** + * Sets the plane components by defining `x`, `y`, `z` as the + * plane normal and `w` as the constant. + * + * @param {number} x - The value for the normal's x component. + * @param {number} y - The value for the normal's y component. + * @param {number} z - The value for the normal's z component. + * @param {number} w - The constant value. + * @return {Plane} A reference to this plane. + */ + setComponents(x, y, z, w) { + this.normal.set(x, y, z); + this.constant = w; + return this; + } + /** + * Sets the plane from the given normal and coplanar point (that is a point + * that lies onto the plane). + * + * @param {Vector3} normal - The normal. + * @param {Vector3} point - A coplanar point. + * @return {Plane} A reference to this plane. + */ + setFromNormalAndCoplanarPoint(normal, point) { + this.normal.copy(normal); + this.constant = -point.dot(this.normal); + return this; + } + /** + * Sets the plane from three coplanar points. The winding order is + * assumed to be counter-clockwise, and determines the direction of + * the plane normal. + * + * @param {Vector3} a - The first coplanar point. + * @param {Vector3} b - The second coplanar point. + * @param {Vector3} c - The third coplanar point. + * @return {Plane} A reference to this plane. + */ + setFromCoplanarPoints(a, b, c) { + const normal = _vector1.subVectors(c, b).cross(_vector2.subVectors(a, b)).normalize(); + this.setFromNormalAndCoplanarPoint(normal, a); + return this; + } + /** + * Copies the values of the given plane to this instance. + * + * @param {Plane} plane - The plane to copy. + * @return {Plane} A reference to this plane. + */ + copy(plane) { + this.normal.copy(plane.normal); + this.constant = plane.constant; + return this; + } + /** + * Normalizes the plane normal and adjusts the constant accordingly. + * + * @return {Plane} A reference to this plane. + */ + normalize() { + const inverseNormalLength = 1 / this.normal.length(); + this.normal.multiplyScalar(inverseNormalLength); + this.constant *= inverseNormalLength; + return this; + } + /** + * Negates both the plane normal and the constant. + * + * @return {Plane} A reference to this plane. + */ + negate() { + this.constant *= -1; + this.normal.negate(); + return this; + } + /** + * Returns the signed distance from the given point to this plane. + * + * @param {Vector3} point - The point to compute the distance for. + * @return {number} The signed distance. + */ + distanceToPoint(point) { + return this.normal.dot(point) + this.constant; + } + /** + * Returns the signed distance from the given sphere to this plane. + * + * @param {Sphere} sphere - The sphere to compute the distance for. + * @return {number} The signed distance. + */ + distanceToSphere(sphere) { + return this.distanceToPoint(sphere.center) - sphere.radius; + } + /** + * Projects a the given point onto the plane. + * + * @param {Vector3} point - The point to project. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The projected point on the plane. + */ + projectPoint(point, target) { + return target.copy(point).addScaledVector(this.normal, -this.distanceToPoint(point)); + } + /** + * Returns the intersection point of the passed line and the plane. Returns + * `null` if the line does not intersect. Returns the line's starting point if + * the line is coplanar with the plane. + * + * @param {Line3} line - The line to compute the intersection for. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {?Vector3} The intersection point. + */ + intersectLine(line, target) { + const direction = line.delta(_vector1); + const denominator = this.normal.dot(direction); + if (denominator === 0) { + if (this.distanceToPoint(line.start) === 0) { + return target.copy(line.start); + } + return null; + } + const t = -(line.start.dot(this.normal) + this.constant) / denominator; + if (t < 0 || t > 1) { + return null; + } + return target.copy(line.start).addScaledVector(direction, t); + } + /** + * Returns `true` if the given line segment intersects with (passes through) the plane. + * + * @param {Line3} line - The line to test. + * @return {boolean} Whether the given line segment intersects with the plane or not. + */ + intersectsLine(line) { + const startSign = this.distanceToPoint(line.start); + const endSign = this.distanceToPoint(line.end); + return startSign < 0 && endSign > 0 || endSign < 0 && startSign > 0; + } + /** + * Returns `true` if the given bounding box intersects with the plane. + * + * @param {Box3} box - The bounding box to test. + * @return {boolean} Whether the given bounding box intersects with the plane or not. + */ + intersectsBox(box) { + return box.intersectsPlane(this); + } + /** + * Returns `true` if the given bounding sphere intersects with the plane. + * + * @param {Sphere} sphere - The bounding sphere to test. + * @return {boolean} Whether the given bounding sphere intersects with the plane or not. + */ + intersectsSphere(sphere) { + return sphere.intersectsPlane(this); + } + /** + * Returns a coplanar vector to the plane, by calculating the + * projection of the normal at the origin onto the plane. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The coplanar point. + */ + coplanarPoint(target) { + return target.copy(this.normal).multiplyScalar(-this.constant); + } + /** + * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform. + * + * The optional normal matrix can be pre-computed like so: + * ```js + * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); + * ``` + * + * @param {Matrix4} matrix - The transformation matrix. + * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix. + * @return {Plane} A reference to this plane. + */ + applyMatrix4(matrix, optionalNormalMatrix) { + const normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix(matrix); + const referencePoint = this.coplanarPoint(_vector1).applyMatrix4(matrix); + const normal = this.normal.applyMatrix3(normalMatrix).normalize(); + this.constant = -referencePoint.dot(normal); + return this; + } + /** + * Translates the plane by the distance defined by the given offset vector. + * Note that this only affects the plane constant and will not affect the normal vector. + * + * @param {Vector3} offset - The offset vector. + * @return {Plane} A reference to this plane. + */ + translate(offset) { + this.constant -= offset.dot(this.normal); + return this; + } + /** + * Returns `true` if this plane is equal with the given one. + * + * @param {Plane} plane - The plane to test for equality. + * @return {boolean} Whether this plane is equal with the given one. + */ + equals(plane) { + return plane.normal.equals(this.normal) && plane.constant === this.constant; + } + /** + * Returns a new plane with copied values from this instance. + * + * @return {Plane} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } +}; +var _sphere$3 = new Sphere(); +var _defaultSpriteCenter = new Vector2(0.5, 0.5); +var _vector$6 = new Vector3(); +var Frustum = class { + /** + * Constructs a new frustum. + * + * @param {Plane} [p0] - The first plane that encloses the frustum. + * @param {Plane} [p1] - The second plane that encloses the frustum. + * @param {Plane} [p2] - The third plane that encloses the frustum. + * @param {Plane} [p3] - The fourth plane that encloses the frustum. + * @param {Plane} [p4] - The fifth plane that encloses the frustum. + * @param {Plane} [p5] - The sixth plane that encloses the frustum. + */ + constructor(p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane()) { + this.planes = [p0, p1, p2, p3, p4, p5]; + } + /** + * Sets the frustum planes by copying the given planes. + * + * @param {Plane} [p0] - The first plane that encloses the frustum. + * @param {Plane} [p1] - The second plane that encloses the frustum. + * @param {Plane} [p2] - The third plane that encloses the frustum. + * @param {Plane} [p3] - The fourth plane that encloses the frustum. + * @param {Plane} [p4] - The fifth plane that encloses the frustum. + * @param {Plane} [p5] - The sixth plane that encloses the frustum. + * @return {Frustum} A reference to this frustum. + */ + set(p0, p1, p2, p3, p4, p5) { + const planes = this.planes; + planes[0].copy(p0); + planes[1].copy(p1); + planes[2].copy(p2); + planes[3].copy(p3); + planes[4].copy(p4); + planes[5].copy(p5); + return this; + } + /** + * Copies the values of the given frustum to this instance. + * + * @param {Frustum} frustum - The frustum to copy. + * @return {Frustum} A reference to this frustum. + */ + copy(frustum) { + const planes = this.planes; + for (let i = 0; i < 6; i++) { + planes[i].copy(frustum.planes[i]); + } + return this; + } + /** + * Sets the frustum planes from the given projection matrix. + * + * @param {Matrix4} m - The projection matrix. + * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system. + * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth. + * @return {Frustum} A reference to this frustum. + */ + setFromProjectionMatrix(m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false) { + const planes = this.planes; + const me = m.elements; + const me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3]; + const me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7]; + const me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11]; + const me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15]; + planes[0].setComponents(me3 - me0, me7 - me4, me11 - me8, me15 - me12).normalize(); + planes[1].setComponents(me3 + me0, me7 + me4, me11 + me8, me15 + me12).normalize(); + planes[2].setComponents(me3 + me1, me7 + me5, me11 + me9, me15 + me13).normalize(); + planes[3].setComponents(me3 - me1, me7 - me5, me11 - me9, me15 - me13).normalize(); + if (reversedDepth) { + planes[4].setComponents(me2, me6, me10, me14).normalize(); + planes[5].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize(); + } else { + planes[4].setComponents(me3 - me2, me7 - me6, me11 - me10, me15 - me14).normalize(); + if (coordinateSystem === WebGLCoordinateSystem) { + planes[5].setComponents(me3 + me2, me7 + me6, me11 + me10, me15 + me14).normalize(); + } else if (coordinateSystem === WebGPUCoordinateSystem) { + planes[5].setComponents(me2, me6, me10, me14).normalize(); + } else { + throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: " + coordinateSystem); + } + } + return this; + } + /** + * Returns `true` if the 3D object's bounding sphere is intersecting this frustum. + * + * Note that the 3D object must have a geometry so that the bounding sphere can be calculated. + * + * @param {Object3D} object - The 3D object to test. + * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not. + */ + intersectsObject(object) { + if (object.boundingSphere !== void 0) { + if (object.boundingSphere === null) object.computeBoundingSphere(); + _sphere$3.copy(object.boundingSphere).applyMatrix4(object.matrixWorld); + } else { + const geometry = object.geometry; + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _sphere$3.copy(geometry.boundingSphere).applyMatrix4(object.matrixWorld); + } + return this.intersectsSphere(_sphere$3); + } + /** + * Returns `true` if the given sprite is intersecting this frustum. + * + * @param {Sprite} sprite - The sprite to test. + * @return {boolean} Whether the sprite is intersecting this frustum or not. + */ + intersectsSprite(sprite) { + _sphere$3.center.set(0, 0, 0); + const offset = _defaultSpriteCenter.distanceTo(sprite.center); + _sphere$3.radius = 0.7071067811865476 + offset; + _sphere$3.applyMatrix4(sprite.matrixWorld); + return this.intersectsSphere(_sphere$3); + } + /** + * Returns `true` if the given bounding sphere is intersecting this frustum. + * + * @param {Sphere} sphere - The bounding sphere to test. + * @return {boolean} Whether the bounding sphere is intersecting this frustum or not. + */ + intersectsSphere(sphere) { + const planes = this.planes; + const center = sphere.center; + const negRadius = -sphere.radius; + for (let i = 0; i < 6; i++) { + const distance = planes[i].distanceToPoint(center); + if (distance < negRadius) { + return false; + } + } + return true; + } + /** + * Returns `true` if the given bounding box is intersecting this frustum. + * + * @param {Box3} box - The bounding box to test. + * @return {boolean} Whether the bounding box is intersecting this frustum or not. + */ + intersectsBox(box) { + const planes = this.planes; + for (let i = 0; i < 6; i++) { + const plane = planes[i]; + _vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x; + _vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y; + _vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z; + if (plane.distanceToPoint(_vector$6) < 0) { + return false; + } + } + return true; + } + /** + * Returns `true` if the given point lies within the frustum. + * + * @param {Vector3} point - The point to test. + * @return {boolean} Whether the point lies within this frustum or not. + */ + containsPoint(point) { + const planes = this.planes; + for (let i = 0; i < 6; i++) { + if (planes[i].distanceToPoint(point) < 0) { + return false; + } + } + return true; + } + /** + * Returns a new frustum with copied values from this instance. + * + * @return {Frustum} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } +}; +var _projScreenMatrix$1 = new Matrix4(); +var _frustum$1 = new Frustum(); +var FrustumArray = class _FrustumArray { + /** + * Constructs a new frustum array. + * + */ + constructor() { + this.coordinateSystem = WebGLCoordinateSystem; + } + /** + * Returns `true` if the 3D object's bounding sphere is intersecting any frustum + * from the camera array. + * + * @param {Object3D} object - The 3D object to test. + * @param {Object} cameraArray - An object with a cameras property containing an array of cameras. + * @return {boolean} Whether the 3D object is visible in any camera. + */ + intersectsObject(object, cameraArray) { + if (!cameraArray.isArrayCamera || cameraArray.cameras.length === 0) { + return false; + } + for (let i = 0; i < cameraArray.cameras.length; i++) { + const camera = cameraArray.cameras[i]; + _projScreenMatrix$1.multiplyMatrices( + camera.projectionMatrix, + camera.matrixWorldInverse + ); + _frustum$1.setFromProjectionMatrix( + _projScreenMatrix$1, + camera.coordinateSystem, + camera.reversedDepth + ); + if (_frustum$1.intersectsObject(object)) { + return true; + } + } + return false; + } + /** + * Returns `true` if the given sprite is intersecting any frustum + * from the camera array. + * + * @param {Sprite} sprite - The sprite to test. + * @param {Object} cameraArray - An object with a cameras property containing an array of cameras. + * @return {boolean} Whether the sprite is visible in any camera. + */ + intersectsSprite(sprite, cameraArray) { + if (!cameraArray || !cameraArray.cameras || cameraArray.cameras.length === 0) { + return false; + } + for (let i = 0; i < cameraArray.cameras.length; i++) { + const camera = cameraArray.cameras[i]; + _projScreenMatrix$1.multiplyMatrices( + camera.projectionMatrix, + camera.matrixWorldInverse + ); + _frustum$1.setFromProjectionMatrix( + _projScreenMatrix$1, + camera.coordinateSystem, + camera.reversedDepth + ); + if (_frustum$1.intersectsSprite(sprite)) { + return true; + } + } + return false; + } + /** + * Returns `true` if the given bounding sphere is intersecting any frustum + * from the camera array. + * + * @param {Sphere} sphere - The bounding sphere to test. + * @param {Object} cameraArray - An object with a cameras property containing an array of cameras. + * @return {boolean} Whether the sphere is visible in any camera. + */ + intersectsSphere(sphere, cameraArray) { + if (!cameraArray || !cameraArray.cameras || cameraArray.cameras.length === 0) { + return false; + } + for (let i = 0; i < cameraArray.cameras.length; i++) { + const camera = cameraArray.cameras[i]; + _projScreenMatrix$1.multiplyMatrices( + camera.projectionMatrix, + camera.matrixWorldInverse + ); + _frustum$1.setFromProjectionMatrix( + _projScreenMatrix$1, + camera.coordinateSystem, + camera.reversedDepth + ); + if (_frustum$1.intersectsSphere(sphere)) { + return true; + } + } + return false; + } + /** + * Returns `true` if the given bounding box is intersecting any frustum + * from the camera array. + * + * @param {Box3} box - The bounding box to test. + * @param {Object} cameraArray - An object with a cameras property containing an array of cameras. + * @return {boolean} Whether the box is visible in any camera. + */ + intersectsBox(box, cameraArray) { + if (!cameraArray || !cameraArray.cameras || cameraArray.cameras.length === 0) { + return false; + } + for (let i = 0; i < cameraArray.cameras.length; i++) { + const camera = cameraArray.cameras[i]; + _projScreenMatrix$1.multiplyMatrices( + camera.projectionMatrix, + camera.matrixWorldInverse + ); + _frustum$1.setFromProjectionMatrix( + _projScreenMatrix$1, + camera.coordinateSystem, + camera.reversedDepth + ); + if (_frustum$1.intersectsBox(box)) { + return true; + } + } + return false; + } + /** + * Returns `true` if the given point lies within any frustum + * from the camera array. + * + * @param {Vector3} point - The point to test. + * @param {Object} cameraArray - An object with a cameras property containing an array of cameras. + * @return {boolean} Whether the point is visible in any camera. + */ + containsPoint(point, cameraArray) { + if (!cameraArray || !cameraArray.cameras || cameraArray.cameras.length === 0) { + return false; + } + for (let i = 0; i < cameraArray.cameras.length; i++) { + const camera = cameraArray.cameras[i]; + _projScreenMatrix$1.multiplyMatrices( + camera.projectionMatrix, + camera.matrixWorldInverse + ); + _frustum$1.setFromProjectionMatrix( + _projScreenMatrix$1, + camera.coordinateSystem, + camera.reversedDepth + ); + if (_frustum$1.containsPoint(point)) { + return true; + } + } + return false; + } + /** + * Returns a new frustum array with copied values from this instance. + * + * @return {FrustumArray} A clone of this instance. + */ + clone() { + return new _FrustumArray(); + } +}; +function ascIdSort(a, b) { + return a - b; +} +function sortOpaque(a, b) { + return a.z - b.z; +} +function sortTransparent(a, b) { + return b.z - a.z; +} +var MultiDrawRenderList = class { + constructor() { + this.index = 0; + this.pool = []; + this.list = []; + } + push(start, count, z, index) { + const pool = this.pool; + const list = this.list; + if (this.index >= pool.length) { + pool.push({ + start: -1, + count: -1, + z: -1, + index: -1 + }); + } + const item = pool[this.index]; + list.push(item); + this.index++; + item.start = start; + item.count = count; + item.z = z; + item.index = index; + } + reset() { + this.list.length = 0; + this.index = 0; + } +}; +var _matrix$1 = new Matrix4(); +var _whiteColor = new Color(1, 1, 1); +var _frustum = new Frustum(); +var _frustumArray = new FrustumArray(); +var _box$1 = new Box3(); +var _sphere$2 = new Sphere(); +var _vector$5 = new Vector3(); +var _forward$1 = new Vector3(); +var _temp = new Vector3(); +var _renderList = new MultiDrawRenderList(); +var _mesh = new Mesh(); +var _batchIntersects = []; +function copyAttributeData(src, target, targetOffset = 0) { + const itemSize = target.itemSize; + if (src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor) { + const vertexCount = src.count; + for (let i = 0; i < vertexCount; i++) { + for (let c = 0; c < itemSize; c++) { + target.setComponent(i + targetOffset, c, src.getComponent(i, c)); + } + } + } else { + target.array.set(src.array, targetOffset * itemSize); + } + target.needsUpdate = true; +} +function copyArrayContents(src, target) { + if (src.constructor !== target.constructor) { + const len = Math.min(src.length, target.length); + for (let i = 0; i < len; i++) { + target[i] = src[i]; + } + } else { + const len = Math.min(src.length, target.length); + target.set(new src.constructor(src.buffer, 0, len)); + } +} +var BatchedMesh = class extends Mesh { + /** + * Constructs a new batched mesh. + * + * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered. + * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries. + * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries + * @param {Material|Array} [material] - The mesh material. + */ + constructor(maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material) { + super(new BufferGeometry(), material); + this.isBatchedMesh = true; + this.perObjectFrustumCulled = true; + this.sortObjects = true; + this.boundingBox = null; + this.boundingSphere = null; + this.customSort = null; + this._instanceInfo = []; + this._geometryInfo = []; + this._availableInstanceIds = []; + this._availableGeometryIds = []; + this._nextIndexStart = 0; + this._nextVertexStart = 0; + this._geometryCount = 0; + this._visibilityChanged = true; + this._geometryInitialized = false; + this._maxInstanceCount = maxInstanceCount; + this._maxVertexCount = maxVertexCount; + this._maxIndexCount = maxIndexCount; + this._multiDrawCounts = new Int32Array(maxInstanceCount); + this._multiDrawStarts = new Int32Array(maxInstanceCount); + this._multiDrawCount = 0; + this._multiDrawInstances = null; + this._matricesTexture = null; + this._indirectTexture = null; + this._colorsTexture = null; + this._initMatricesTexture(); + this._initIndirectTexture(); + } + /** + * The maximum number of individual instances that can be stored in the batch. + * + * @type {number} + * @readonly + */ + get maxInstanceCount() { + return this._maxInstanceCount; + } + /** + * The instance count. + * + * @type {number} + * @readonly + */ + get instanceCount() { + return this._instanceInfo.length - this._availableInstanceIds.length; + } + /** + * The number of unused vertices. + * + * @type {number} + * @readonly + */ + get unusedVertexCount() { + return this._maxVertexCount - this._nextVertexStart; + } + /** + * The number of unused indices. + * + * @type {number} + * @readonly + */ + get unusedIndexCount() { + return this._maxIndexCount - this._nextIndexStart; + } + _initMatricesTexture() { + let size = Math.sqrt(this._maxInstanceCount * 4); + size = Math.ceil(size / 4) * 4; + size = Math.max(size, 4); + const matricesArray = new Float32Array(size * size * 4); + const matricesTexture = new DataTexture(matricesArray, size, size, RGBAFormat, FloatType); + this._matricesTexture = matricesTexture; + } + _initIndirectTexture() { + let size = Math.sqrt(this._maxInstanceCount); + size = Math.ceil(size); + const indirectArray = new Uint32Array(size * size); + const indirectTexture = new DataTexture(indirectArray, size, size, RedIntegerFormat, UnsignedIntType); + this._indirectTexture = indirectTexture; + } + _initColorsTexture() { + let size = Math.sqrt(this._maxInstanceCount); + size = Math.ceil(size); + const colorsArray = new Float32Array(size * size * 4).fill(1); + const colorsTexture = new DataTexture(colorsArray, size, size, RGBAFormat, FloatType); + colorsTexture.colorSpace = ColorManagement.workingColorSpace; + this._colorsTexture = colorsTexture; + } + _initializeGeometry(reference) { + const geometry = this.geometry; + const maxVertexCount = this._maxVertexCount; + const maxIndexCount = this._maxIndexCount; + if (this._geometryInitialized === false) { + for (const attributeName in reference.attributes) { + const srcAttribute = reference.getAttribute(attributeName); + const { array, itemSize, normalized } = srcAttribute; + const dstArray = new array.constructor(maxVertexCount * itemSize); + const dstAttribute = new BufferAttribute(dstArray, itemSize, normalized); + geometry.setAttribute(attributeName, dstAttribute); + } + if (reference.getIndex() !== null) { + const indexArray = maxVertexCount > 65535 ? new Uint32Array(maxIndexCount) : new Uint16Array(maxIndexCount); + geometry.setIndex(new BufferAttribute(indexArray, 1)); + } + this._geometryInitialized = true; + } + } + // Make sure the geometry is compatible with the existing combined geometry attributes + _validateGeometry(geometry) { + const batchGeometry = this.geometry; + if (Boolean(geometry.getIndex()) !== Boolean(batchGeometry.getIndex())) { + throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".'); + } + for (const attributeName in batchGeometry.attributes) { + if (!geometry.hasAttribute(attributeName)) { + throw new Error(`THREE.BatchedMesh: Added geometry missing "${attributeName}". All geometries must have consistent attributes.`); + } + const srcAttribute = geometry.getAttribute(attributeName); + const dstAttribute = batchGeometry.getAttribute(attributeName); + if (srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized) { + throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value."); + } + } + } + /** + * Validates the instance defined by the given ID. + * + * @param {number} instanceId - The instance to validate. + */ + validateInstanceId(instanceId) { + const instanceInfo = this._instanceInfo; + if (instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[instanceId].active === false) { + throw new Error(`THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.`); + } + } + /** + * Validates the geometry defined by the given ID. + * + * @param {number} geometryId - The geometry to validate. + */ + validateGeometryId(geometryId) { + const geometryInfoList = this._geometryInfo; + if (geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[geometryId].active === false) { + throw new Error(`THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.`); + } + } + /** + * Takes a sort a function that is run before render. The function takes a list of instances to + * sort and a camera. The objects in the list include a "z" field to perform a depth-ordered sort with. + * + * @param {Function} func - The custom sort function. + * @return {BatchedMesh} A reference to this batched mesh. + */ + setCustomSort(func) { + this.customSort = func; + return this; + } + /** + * Computes the bounding box, updating {@link BatchedMesh#boundingBox}. + * Bounding boxes aren't computed by default. They need to be explicitly computed, + * otherwise they are `null`. + */ + computeBoundingBox() { + if (this.boundingBox === null) { + this.boundingBox = new Box3(); + } + const boundingBox = this.boundingBox; + const instanceInfo = this._instanceInfo; + boundingBox.makeEmpty(); + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].active === false) continue; + const geometryId = instanceInfo[i].geometryIndex; + this.getMatrixAt(i, _matrix$1); + this.getBoundingBoxAt(geometryId, _box$1).applyMatrix4(_matrix$1); + boundingBox.union(_box$1); + } + } + /** + * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}. + * Bounding spheres aren't computed by default. They need to be explicitly computed, + * otherwise they are `null`. + */ + computeBoundingSphere() { + if (this.boundingSphere === null) { + this.boundingSphere = new Sphere(); + } + const boundingSphere = this.boundingSphere; + const instanceInfo = this._instanceInfo; + boundingSphere.makeEmpty(); + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].active === false) continue; + const geometryId = instanceInfo[i].geometryIndex; + this.getMatrixAt(i, _matrix$1); + this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); + boundingSphere.union(_sphere$2); + } + } + /** + * Adds a new instance to the batch using the geometry of the given ID and returns + * a new id referring to the new instance to be used by other functions. + * + * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}. + * @return {number} The instance ID. + */ + addInstance(geometryId) { + const atCapacity = this._instanceInfo.length >= this.maxInstanceCount; + if (atCapacity && this._availableInstanceIds.length === 0) { + throw new Error("THREE.BatchedMesh: Maximum item count reached."); + } + const instanceInfo = { + visible: true, + active: true, + geometryIndex: geometryId + }; + let drawId = null; + if (this._availableInstanceIds.length > 0) { + this._availableInstanceIds.sort(ascIdSort); + drawId = this._availableInstanceIds.shift(); + this._instanceInfo[drawId] = instanceInfo; + } else { + drawId = this._instanceInfo.length; + this._instanceInfo.push(instanceInfo); + } + const matricesTexture = this._matricesTexture; + _matrix$1.identity().toArray(matricesTexture.image.data, drawId * 16); + matricesTexture.needsUpdate = true; + const colorsTexture = this._colorsTexture; + if (colorsTexture) { + _whiteColor.toArray(colorsTexture.image.data, drawId * 4); + colorsTexture.needsUpdate = true; + } + this._visibilityChanged = true; + return drawId; + } + /** + * Adds the given geometry to the batch and returns the associated + * geometry id referring to it to be used in other functions. + * + * @param {BufferGeometry} geometry - The geometry to add. + * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of + * vertex buffer space to reserve for the added geometry. This is necessary if it is planned + * to set a new geometry at this index at a later time that is larger than the original geometry. + * Defaults to the length of the given geometry vertex buffer. + * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index + * buffer space to reserve for the added geometry. This is necessary if it is planned to set a + * new geometry at this index at a later time that is larger than the original geometry. Defaults to + * the length of the given geometry index buffer. + * @return {number} The geometry ID. + */ + addGeometry(geometry, reservedVertexCount = -1, reservedIndexCount = -1) { + this._initializeGeometry(geometry); + this._validateGeometry(geometry); + const geometryInfo = { + // geometry information + vertexStart: -1, + vertexCount: -1, + reservedVertexCount: -1, + indexStart: -1, + indexCount: -1, + reservedIndexCount: -1, + // draw range information + start: -1, + count: -1, + // state + boundingBox: null, + boundingSphere: null, + active: true + }; + const geometryInfoList = this._geometryInfo; + geometryInfo.vertexStart = this._nextVertexStart; + geometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute("position").count : reservedVertexCount; + const index = geometry.getIndex(); + const hasIndex = index !== null; + if (hasIndex) { + geometryInfo.indexStart = this._nextIndexStart; + geometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount; + } + if (geometryInfo.indexStart !== -1 && geometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount || geometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount) { + throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size."); + } + let geometryId; + if (this._availableGeometryIds.length > 0) { + this._availableGeometryIds.sort(ascIdSort); + geometryId = this._availableGeometryIds.shift(); + geometryInfoList[geometryId] = geometryInfo; + } else { + geometryId = this._geometryCount; + this._geometryCount++; + geometryInfoList.push(geometryInfo); + } + this.setGeometryAt(geometryId, geometry); + this._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount; + this._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount; + return geometryId; + } + /** + * Replaces the geometry at the given ID with the provided geometry. Throws an error if there + * is not enough space reserved for geometry. Calling this will change all instances that are + * rendering that geometry. + * + * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry. + * @param {BufferGeometry} geometry - The new geometry. + * @return {number} The geometry ID. + */ + setGeometryAt(geometryId, geometry) { + if (geometryId >= this._geometryCount) { + throw new Error("THREE.BatchedMesh: Maximum geometry count reached."); + } + this._validateGeometry(geometry); + const batchGeometry = this.geometry; + const hasIndex = batchGeometry.getIndex() !== null; + const dstIndex = batchGeometry.getIndex(); + const srcIndex = geometry.getIndex(); + const geometryInfo = this._geometryInfo[geometryId]; + if (hasIndex && srcIndex.count > geometryInfo.reservedIndexCount || geometry.attributes.position.count > geometryInfo.reservedVertexCount) { + throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry."); + } + const vertexStart = geometryInfo.vertexStart; + const reservedVertexCount = geometryInfo.reservedVertexCount; + geometryInfo.vertexCount = geometry.getAttribute("position").count; + for (const attributeName in batchGeometry.attributes) { + const srcAttribute = geometry.getAttribute(attributeName); + const dstAttribute = batchGeometry.getAttribute(attributeName); + copyAttributeData(srcAttribute, dstAttribute, vertexStart); + const itemSize = srcAttribute.itemSize; + for (let i = srcAttribute.count, l = reservedVertexCount; i < l; i++) { + const index = vertexStart + i; + for (let c = 0; c < itemSize; c++) { + dstAttribute.setComponent(index, c, 0); + } + } + dstAttribute.needsUpdate = true; + dstAttribute.addUpdateRange(vertexStart * itemSize, reservedVertexCount * itemSize); + } + if (hasIndex) { + const indexStart = geometryInfo.indexStart; + const reservedIndexCount = geometryInfo.reservedIndexCount; + geometryInfo.indexCount = geometry.getIndex().count; + for (let i = 0; i < srcIndex.count; i++) { + dstIndex.setX(indexStart + i, vertexStart + srcIndex.getX(i)); + } + for (let i = srcIndex.count, l = reservedIndexCount; i < l; i++) { + dstIndex.setX(indexStart + i, vertexStart); + } + dstIndex.needsUpdate = true; + dstIndex.addUpdateRange(indexStart, geometryInfo.reservedIndexCount); + } + geometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart; + geometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount; + geometryInfo.boundingBox = null; + if (geometry.boundingBox !== null) { + geometryInfo.boundingBox = geometry.boundingBox.clone(); + } + geometryInfo.boundingSphere = null; + if (geometry.boundingSphere !== null) { + geometryInfo.boundingSphere = geometry.boundingSphere.clone(); + } + this._visibilityChanged = true; + return geometryId; + } + /** + * Deletes the geometry defined by the given ID from this batch. Any instances referencing + * this geometry will also be removed as a side effect. + * + * @param {number} geometryId - The ID of the geometry to remove from the batch. + * @return {BatchedMesh} A reference to this batched mesh. + */ + deleteGeometry(geometryId) { + const geometryInfoList = this._geometryInfo; + if (geometryId >= geometryInfoList.length || geometryInfoList[geometryId].active === false) { + return this; + } + const instanceInfo = this._instanceInfo; + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].active && instanceInfo[i].geometryIndex === geometryId) { + this.deleteInstance(i); + } + } + geometryInfoList[geometryId].active = false; + this._availableGeometryIds.push(geometryId); + this._visibilityChanged = true; + return this; + } + /** + * Deletes an existing instance from the batch using the given ID. + * + * @param {number} instanceId - The ID of the instance to remove from the batch. + * @return {BatchedMesh} A reference to this batched mesh. + */ + deleteInstance(instanceId) { + this.validateInstanceId(instanceId); + this._instanceInfo[instanceId].active = false; + this._availableInstanceIds.push(instanceId); + this._visibilityChanged = true; + return this; + } + /** + * Repacks the sub geometries in BatchedMesh to remove any unused space remaining from + * previously deleted geometry, freeing up space to add new geometry. + * + * @return {BatchedMesh} A reference to this batched mesh. + */ + optimize() { + let nextVertexStart = 0; + let nextIndexStart = 0; + const geometryInfoList = this._geometryInfo; + const indices = geometryInfoList.map((e, i) => i).sort((a, b) => { + return geometryInfoList[a].vertexStart - geometryInfoList[b].vertexStart; + }); + const geometry = this.geometry; + for (let i = 0, l = geometryInfoList.length; i < l; i++) { + const index = indices[i]; + const geometryInfo = geometryInfoList[index]; + if (geometryInfo.active === false) { + continue; + } + if (geometry.index !== null) { + if (geometryInfo.indexStart !== nextIndexStart) { + const { indexStart, vertexStart, reservedIndexCount } = geometryInfo; + const index2 = geometry.index; + const array = index2.array; + const elementDelta = nextVertexStart - vertexStart; + for (let j = indexStart; j < indexStart + reservedIndexCount; j++) { + array[j] = array[j] + elementDelta; + } + index2.array.copyWithin(nextIndexStart, indexStart, indexStart + reservedIndexCount); + index2.addUpdateRange(nextIndexStart, reservedIndexCount); + index2.needsUpdate = true; + geometryInfo.indexStart = nextIndexStart; + } + nextIndexStart += geometryInfo.reservedIndexCount; + } + if (geometryInfo.vertexStart !== nextVertexStart) { + const { vertexStart, reservedVertexCount } = geometryInfo; + const attributes = geometry.attributes; + for (const key in attributes) { + const attribute = attributes[key]; + const { array, itemSize } = attribute; + array.copyWithin(nextVertexStart * itemSize, vertexStart * itemSize, (vertexStart + reservedVertexCount) * itemSize); + attribute.addUpdateRange(nextVertexStart * itemSize, reservedVertexCount * itemSize); + attribute.needsUpdate = true; + } + geometryInfo.vertexStart = nextVertexStart; + } + nextVertexStart += geometryInfo.reservedVertexCount; + geometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart; + this._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0; + this._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount; + } + this._visibilityChanged = true; + return this; + } + /** + * Returns the bounding box for the given geometry. + * + * @param {number} geometryId - The ID of the geometry to return the bounding box for. + * @param {Box3} target - The target object that is used to store the method's result. + * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID. + */ + getBoundingBoxAt(geometryId, target) { + if (geometryId >= this._geometryCount) { + return null; + } + const geometry = this.geometry; + const geometryInfo = this._geometryInfo[geometryId]; + if (geometryInfo.boundingBox === null) { + const box = new Box3(); + const index = geometry.index; + const position = geometry.attributes.position; + for (let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i++) { + let iv = i; + if (index) { + iv = index.getX(iv); + } + box.expandByPoint(_vector$5.fromBufferAttribute(position, iv)); + } + geometryInfo.boundingBox = box; + } + target.copy(geometryInfo.boundingBox); + return target; + } + /** + * Returns the bounding sphere for the given geometry. + * + * @param {number} geometryId - The ID of the geometry to return the bounding sphere for. + * @param {Sphere} target - The target object that is used to store the method's result. + * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID. + */ + getBoundingSphereAt(geometryId, target) { + if (geometryId >= this._geometryCount) { + return null; + } + const geometry = this.geometry; + const geometryInfo = this._geometryInfo[geometryId]; + if (geometryInfo.boundingSphere === null) { + const sphere = new Sphere(); + this.getBoundingBoxAt(geometryId, _box$1); + _box$1.getCenter(sphere.center); + const index = geometry.index; + const position = geometry.attributes.position; + let maxRadiusSq = 0; + for (let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i++) { + let iv = i; + if (index) { + iv = index.getX(iv); + } + _vector$5.fromBufferAttribute(position, iv); + maxRadiusSq = Math.max(maxRadiusSq, sphere.center.distanceToSquared(_vector$5)); + } + sphere.radius = Math.sqrt(maxRadiusSq); + geometryInfo.boundingSphere = sphere; + } + target.copy(geometryInfo.boundingSphere); + return target; + } + /** + * Sets the given local transformation matrix to the defined instance. + * Negatively scaled matrices are not supported. + * + * @param {number} instanceId - The ID of an instance to set the matrix of. + * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance. + * @return {BatchedMesh} A reference to this batched mesh. + */ + setMatrixAt(instanceId, matrix) { + this.validateInstanceId(instanceId); + const matricesTexture = this._matricesTexture; + const matricesArray = this._matricesTexture.image.data; + matrix.toArray(matricesArray, instanceId * 16); + matricesTexture.needsUpdate = true; + return this; + } + /** + * Returns the local transformation matrix of the defined instance. + * + * @param {number} instanceId - The ID of an instance to get the matrix of. + * @param {Matrix4} matrix - The target object that is used to store the method's result. + * @return {Matrix4} The instance's local transformation matrix. + */ + getMatrixAt(instanceId, matrix) { + this.validateInstanceId(instanceId); + return matrix.fromArray(this._matricesTexture.image.data, instanceId * 16); + } + /** + * Sets the given color to the defined instance. + * + * @param {number} instanceId - The ID of an instance to set the color of. + * @param {Color} color - The color to set the instance to. + * @return {BatchedMesh} A reference to this batched mesh. + */ + setColorAt(instanceId, color) { + this.validateInstanceId(instanceId); + if (this._colorsTexture === null) { + this._initColorsTexture(); + } + color.toArray(this._colorsTexture.image.data, instanceId * 4); + this._colorsTexture.needsUpdate = true; + return this; + } + /** + * Returns the color of the defined instance. + * + * @param {number} instanceId - The ID of an instance to get the color of. + * @param {Color} color - The target object that is used to store the method's result. + * @return {Color} The instance's color. + */ + getColorAt(instanceId, color) { + this.validateInstanceId(instanceId); + return color.fromArray(this._colorsTexture.image.data, instanceId * 4); + } + /** + * Sets the visibility of the instance. + * + * @param {number} instanceId - The id of the instance to set the visibility of. + * @param {boolean} visible - Whether the instance is visible or not. + * @return {BatchedMesh} A reference to this batched mesh. + */ + setVisibleAt(instanceId, visible) { + this.validateInstanceId(instanceId); + if (this._instanceInfo[instanceId].visible === visible) { + return this; + } + this._instanceInfo[instanceId].visible = visible; + this._visibilityChanged = true; + return this; + } + /** + * Returns the visibility state of the defined instance. + * + * @param {number} instanceId - The ID of an instance to get the visibility state of. + * @return {boolean} Whether the instance is visible or not. + */ + getVisibleAt(instanceId) { + this.validateInstanceId(instanceId); + return this._instanceInfo[instanceId].visible; + } + /** + * Sets the geometry ID of the instance at the given index. + * + * @param {number} instanceId - The ID of the instance to set the geometry ID of. + * @param {number} geometryId - The geometry ID to be use by the instance. + * @return {BatchedMesh} A reference to this batched mesh. + */ + setGeometryIdAt(instanceId, geometryId) { + this.validateInstanceId(instanceId); + this.validateGeometryId(geometryId); + this._instanceInfo[instanceId].geometryIndex = geometryId; + return this; + } + /** + * Returns the geometry ID of the defined instance. + * + * @param {number} instanceId - The ID of an instance to get the geometry ID of. + * @return {number} The instance's geometry ID. + */ + getGeometryIdAt(instanceId) { + this.validateInstanceId(instanceId); + return this._instanceInfo[instanceId].geometryIndex; + } + /** + * Get the range representing the subset of triangles related to the attached geometry, + * indicating the starting offset and count, or `null` if invalid. + * + * @param {number} geometryId - The id of the geometry to get the range of. + * @param {Object} [target] - The target object that is used to store the method's result. + * @return {{ + * vertexStart:number,vertexCount:number,reservedVertexCount:number, + * indexStart:number,indexCount:number,reservedIndexCount:number, + * start:number,count:number + * }} The result object with range data. + */ + getGeometryRangeAt(geometryId, target = {}) { + this.validateGeometryId(geometryId); + const geometryInfo = this._geometryInfo[geometryId]; + target.vertexStart = geometryInfo.vertexStart; + target.vertexCount = geometryInfo.vertexCount; + target.reservedVertexCount = geometryInfo.reservedVertexCount; + target.indexStart = geometryInfo.indexStart; + target.indexCount = geometryInfo.indexCount; + target.reservedIndexCount = geometryInfo.reservedIndexCount; + target.start = geometryInfo.start; + target.count = geometryInfo.count; + return target; + } + /** + * Resizes the necessary buffers to support the provided number of instances. + * If the provided arguments shrink the number of instances but there are not enough + * unused Ids at the end of the list then an error is thrown. + * + * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch. + */ + setInstanceCount(maxInstanceCount) { + const availableInstanceIds = this._availableInstanceIds; + const instanceInfo = this._instanceInfo; + availableInstanceIds.sort(ascIdSort); + while (availableInstanceIds[availableInstanceIds.length - 1] === instanceInfo.length - 1) { + instanceInfo.pop(); + availableInstanceIds.pop(); + } + if (maxInstanceCount < instanceInfo.length) { + throw new Error(`BatchedMesh: Instance ids outside the range ${maxInstanceCount} are being used. Cannot shrink instance count.`); + } + const multiDrawCounts = new Int32Array(maxInstanceCount); + const multiDrawStarts = new Int32Array(maxInstanceCount); + copyArrayContents(this._multiDrawCounts, multiDrawCounts); + copyArrayContents(this._multiDrawStarts, multiDrawStarts); + this._multiDrawCounts = multiDrawCounts; + this._multiDrawStarts = multiDrawStarts; + this._maxInstanceCount = maxInstanceCount; + const indirectTexture = this._indirectTexture; + const matricesTexture = this._matricesTexture; + const colorsTexture = this._colorsTexture; + indirectTexture.dispose(); + this._initIndirectTexture(); + copyArrayContents(indirectTexture.image.data, this._indirectTexture.image.data); + matricesTexture.dispose(); + this._initMatricesTexture(); + copyArrayContents(matricesTexture.image.data, this._matricesTexture.image.data); + if (colorsTexture) { + colorsTexture.dispose(); + this._initColorsTexture(); + copyArrayContents(colorsTexture.image.data, this._colorsTexture.image.data); + } + } + /** + * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes. + * If the provided arguments shrink the geometry buffers but there is not enough unused space at the + * end of the geometry attributes then an error is thrown. + * + * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to. + * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to. + */ + setGeometrySize(maxVertexCount, maxIndexCount) { + const validRanges = [...this._geometryInfo].filter((info) => info.active); + const requiredVertexLength = Math.max(...validRanges.map((range) => range.vertexStart + range.reservedVertexCount)); + if (requiredVertexLength > maxVertexCount) { + throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${maxIndexCount}. Cannot shrink further.`); + } + if (this.geometry.index) { + const requiredIndexLength = Math.max(...validRanges.map((range) => range.indexStart + range.reservedIndexCount)); + if (requiredIndexLength > maxIndexCount) { + throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${maxIndexCount}. Cannot shrink further.`); + } + } + const oldGeometry = this.geometry; + oldGeometry.dispose(); + this._maxVertexCount = maxVertexCount; + this._maxIndexCount = maxIndexCount; + if (this._geometryInitialized) { + this._geometryInitialized = false; + this.geometry = new BufferGeometry(); + this._initializeGeometry(oldGeometry); + } + const geometry = this.geometry; + if (oldGeometry.index) { + copyArrayContents(oldGeometry.index.array, geometry.index.array); + } + for (const key in oldGeometry.attributes) { + copyArrayContents(oldGeometry.attributes[key].array, geometry.attributes[key].array); + } + } + raycast(raycaster, intersects2) { + const instanceInfo = this._instanceInfo; + const geometryInfoList = this._geometryInfo; + const matrixWorld = this.matrixWorld; + const batchGeometry = this.geometry; + _mesh.material = this.material; + _mesh.geometry.index = batchGeometry.index; + _mesh.geometry.attributes = batchGeometry.attributes; + if (_mesh.geometry.boundingBox === null) { + _mesh.geometry.boundingBox = new Box3(); + } + if (_mesh.geometry.boundingSphere === null) { + _mesh.geometry.boundingSphere = new Sphere(); + } + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (!instanceInfo[i].visible || !instanceInfo[i].active) { + continue; + } + const geometryId = instanceInfo[i].geometryIndex; + const geometryInfo = geometryInfoList[geometryId]; + _mesh.geometry.setDrawRange(geometryInfo.start, geometryInfo.count); + this.getMatrixAt(i, _mesh.matrixWorld).premultiply(matrixWorld); + this.getBoundingBoxAt(geometryId, _mesh.geometry.boundingBox); + this.getBoundingSphereAt(geometryId, _mesh.geometry.boundingSphere); + _mesh.raycast(raycaster, _batchIntersects); + for (let j = 0, l2 = _batchIntersects.length; j < l2; j++) { + const intersect2 = _batchIntersects[j]; + intersect2.object = this; + intersect2.batchId = i; + intersects2.push(intersect2); + } + _batchIntersects.length = 0; + } + _mesh.material = null; + _mesh.geometry.index = null; + _mesh.geometry.attributes = {}; + _mesh.geometry.setDrawRange(0, Infinity); + } + copy(source) { + super.copy(source); + this.geometry = source.geometry.clone(); + this.perObjectFrustumCulled = source.perObjectFrustumCulled; + this.sortObjects = source.sortObjects; + this.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null; + this.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null; + this._geometryInfo = source._geometryInfo.map((info) => ({ + ...info, + boundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null, + boundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null + })); + this._instanceInfo = source._instanceInfo.map((info) => ({ ...info })); + this._availableInstanceIds = source._availableInstanceIds.slice(); + this._availableGeometryIds = source._availableGeometryIds.slice(); + this._nextIndexStart = source._nextIndexStart; + this._nextVertexStart = source._nextVertexStart; + this._geometryCount = source._geometryCount; + this._maxInstanceCount = source._maxInstanceCount; + this._maxVertexCount = source._maxVertexCount; + this._maxIndexCount = source._maxIndexCount; + this._geometryInitialized = source._geometryInitialized; + this._multiDrawCounts = source._multiDrawCounts.slice(); + this._multiDrawStarts = source._multiDrawStarts.slice(); + this._indirectTexture = source._indirectTexture.clone(); + this._indirectTexture.image.data = this._indirectTexture.image.data.slice(); + this._matricesTexture = source._matricesTexture.clone(); + this._matricesTexture.image.data = this._matricesTexture.image.data.slice(); + if (this._colorsTexture !== null) { + this._colorsTexture = source._colorsTexture.clone(); + this._colorsTexture.image.data = this._colorsTexture.image.data.slice(); + } + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this._matricesTexture.dispose(); + this._matricesTexture = null; + this._indirectTexture.dispose(); + this._indirectTexture = null; + if (this._colorsTexture !== null) { + this._colorsTexture.dispose(); + this._colorsTexture = null; + } + } + onBeforeRender(renderer, scene, camera, geometry, material) { + if (!this._visibilityChanged && !this.perObjectFrustumCulled && !this.sortObjects) { + return; + } + const index = geometry.getIndex(); + const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT; + const instanceInfo = this._instanceInfo; + const multiDrawStarts = this._multiDrawStarts; + const multiDrawCounts = this._multiDrawCounts; + const geometryInfoList = this._geometryInfo; + const perObjectFrustumCulled = this.perObjectFrustumCulled; + const indirectTexture = this._indirectTexture; + const indirectArray = indirectTexture.image.data; + const frustum = camera.isArrayCamera ? _frustumArray : _frustum; + if (perObjectFrustumCulled && !camera.isArrayCamera) { + _matrix$1.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse).multiply(this.matrixWorld); + _frustum.setFromProjectionMatrix( + _matrix$1, + camera.coordinateSystem, + camera.reversedDepth + ); + } + let multiDrawCount = 0; + if (this.sortObjects) { + _matrix$1.copy(this.matrixWorld).invert(); + _vector$5.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(_matrix$1); + _forward$1.set(0, 0, -1).transformDirection(camera.matrixWorld).transformDirection(_matrix$1); + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].visible && instanceInfo[i].active) { + const geometryId = instanceInfo[i].geometryIndex; + this.getMatrixAt(i, _matrix$1); + this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); + let culled = false; + if (perObjectFrustumCulled) { + culled = !frustum.intersectsSphere(_sphere$2, camera); + } + if (!culled) { + const geometryInfo = geometryInfoList[geometryId]; + const z = _temp.subVectors(_sphere$2.center, _vector$5).dot(_forward$1); + _renderList.push(geometryInfo.start, geometryInfo.count, z, i); + } + } + } + const list = _renderList.list; + const customSort = this.customSort; + if (customSort === null) { + list.sort(material.transparent ? sortTransparent : sortOpaque); + } else { + customSort.call(this, list, camera); + } + for (let i = 0, l = list.length; i < l; i++) { + const item = list[i]; + multiDrawStarts[multiDrawCount] = item.start * bytesPerElement; + multiDrawCounts[multiDrawCount] = item.count; + indirectArray[multiDrawCount] = item.index; + multiDrawCount++; + } + _renderList.reset(); + } else { + for (let i = 0, l = instanceInfo.length; i < l; i++) { + if (instanceInfo[i].visible && instanceInfo[i].active) { + const geometryId = instanceInfo[i].geometryIndex; + let culled = false; + if (perObjectFrustumCulled) { + this.getMatrixAt(i, _matrix$1); + this.getBoundingSphereAt(geometryId, _sphere$2).applyMatrix4(_matrix$1); + culled = !frustum.intersectsSphere(_sphere$2, camera); + } + if (!culled) { + const geometryInfo = geometryInfoList[geometryId]; + multiDrawStarts[multiDrawCount] = geometryInfo.start * bytesPerElement; + multiDrawCounts[multiDrawCount] = geometryInfo.count; + indirectArray[multiDrawCount] = i; + multiDrawCount++; + } + } + } + } + indirectTexture.needsUpdate = true; + this._multiDrawCount = multiDrawCount; + this._visibilityChanged = false; + } + onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial) { + this.onBeforeRender(renderer, null, shadowCamera, geometry, depthMaterial); + } +}; +var LineBasicMaterial = class extends Material { + /** + * Constructs a new line basic material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isLineBasicMaterial = true; + this.type = "LineBasicMaterial"; + this.color = new Color(16777215); + this.map = null; + this.linewidth = 1; + this.linecap = "round"; + this.linejoin = "round"; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + this.fog = source.fog; + return this; + } +}; +var _vStart = new Vector3(); +var _vEnd = new Vector3(); +var _inverseMatrix$1 = new Matrix4(); +var _ray$1 = new Ray(); +var _sphere$1 = new Sphere(); +var _intersectPointOnRay = new Vector3(); +var _intersectPointOnSegment = new Vector3(); +var Line = class extends Object3D { + /** + * Constructs a new line. + * + * @param {BufferGeometry} [geometry] - The line geometry. + * @param {Material|Array} [material] - The line material. + */ + constructor(geometry = new BufferGeometry(), material = new LineBasicMaterial()) { + super(); + this.isLine = true; + this.type = "Line"; + this.geometry = geometry; + this.material = material; + this.morphTargetDictionary = void 0; + this.morphTargetInfluences = void 0; + this.updateMorphTargets(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.material = Array.isArray(source.material) ? source.material.slice() : source.material; + this.geometry = source.geometry; + return this; + } + /** + * Computes an array of distance values which are necessary for rendering dashed lines. + * For each vertex in the geometry, the method calculates the cumulative length from the + * current point to the very beginning of the line. + * + * @return {Line} A reference to this line. + */ + computeLineDistances() { + const geometry = this.geometry; + if (geometry.index === null) { + const positionAttribute = geometry.attributes.position; + const lineDistances = [0]; + for (let i = 1, l = positionAttribute.count; i < l; i++) { + _vStart.fromBufferAttribute(positionAttribute, i - 1); + _vEnd.fromBufferAttribute(positionAttribute, i); + lineDistances[i] = lineDistances[i - 1]; + lineDistances[i] += _vStart.distanceTo(_vEnd); + } + geometry.setAttribute("lineDistance", new Float32BufferAttribute(lineDistances, 1)); + } else { + warn("Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); + } + return this; + } + /** + * Computes intersection points between a casted ray and this line. + * + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - The target array that holds the intersection points. + */ + raycast(raycaster, intersects2) { + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Line.threshold; + const drawRange = geometry.drawRange; + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _sphere$1.copy(geometry.boundingSphere); + _sphere$1.applyMatrix4(matrixWorld); + _sphere$1.radius += threshold; + if (raycaster.ray.intersectsSphere(_sphere$1) === false) return; + _inverseMatrix$1.copy(matrixWorld).invert(); + _ray$1.copy(raycaster.ray).applyMatrix4(_inverseMatrix$1); + const localThreshold = threshold / ((this.scale.x + this.scale.y + this.scale.z) / 3); + const localThresholdSq = localThreshold * localThreshold; + const step = this.isLineSegments ? 2 : 1; + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + if (index !== null) { + const start = Math.max(0, drawRange.start); + const end = Math.min(index.count, drawRange.start + drawRange.count); + for (let i = start, l = end - 1; i < l; i += step) { + const a = index.getX(i); + const b = index.getX(i + 1); + const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, a, b, i); + if (intersect2) { + intersects2.push(intersect2); + } + } + if (this.isLineLoop) { + const a = index.getX(end - 1); + const b = index.getX(start); + const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, a, b, end - 1); + if (intersect2) { + intersects2.push(intersect2); + } + } + } else { + const start = Math.max(0, drawRange.start); + const end = Math.min(positionAttribute.count, drawRange.start + drawRange.count); + for (let i = start, l = end - 1; i < l; i += step) { + const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, i, i + 1, i); + if (intersect2) { + intersects2.push(intersect2); + } + } + if (this.isLineLoop) { + const intersect2 = checkIntersection(this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1); + if (intersect2) { + intersects2.push(intersect2); + } + } + } + } + /** + * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences} + * to make sure existing morph targets can influence this 3D object. + */ + updateMorphTargets() { + const geometry = this.geometry; + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys(morphAttributes); + if (keys.length > 0) { + const morphAttribute = morphAttributes[keys[0]]; + if (morphAttribute !== void 0) { + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + for (let m = 0, ml = morphAttribute.length; m < ml; m++) { + const name = morphAttribute[m].name || String(m); + this.morphTargetInfluences.push(0); + this.morphTargetDictionary[name] = m; + } + } + } + } +}; +function checkIntersection(object, raycaster, ray, thresholdSq, a, b, i) { + const positionAttribute = object.geometry.attributes.position; + _vStart.fromBufferAttribute(positionAttribute, a); + _vEnd.fromBufferAttribute(positionAttribute, b); + const distSq = ray.distanceSqToSegment(_vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment); + if (distSq > thresholdSq) return; + _intersectPointOnRay.applyMatrix4(object.matrixWorld); + const distance = raycaster.ray.origin.distanceTo(_intersectPointOnRay); + if (distance < raycaster.near || distance > raycaster.far) return; + return { + distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: _intersectPointOnSegment.clone().applyMatrix4(object.matrixWorld), + index: i, + face: null, + faceIndex: null, + barycoord: null, + object + }; +} +var _start = new Vector3(); +var _end = new Vector3(); +var LineSegments = class extends Line { + /** + * Constructs a new line segments. + * + * @param {BufferGeometry} [geometry] - The line geometry. + * @param {Material|Array} [material] - The line material. + */ + constructor(geometry, material) { + super(geometry, material); + this.isLineSegments = true; + this.type = "LineSegments"; + } + computeLineDistances() { + const geometry = this.geometry; + if (geometry.index === null) { + const positionAttribute = geometry.attributes.position; + const lineDistances = []; + for (let i = 0, l = positionAttribute.count; i < l; i += 2) { + _start.fromBufferAttribute(positionAttribute, i); + _end.fromBufferAttribute(positionAttribute, i + 1); + lineDistances[i] = i === 0 ? 0 : lineDistances[i - 1]; + lineDistances[i + 1] = lineDistances[i] + _start.distanceTo(_end); + } + geometry.setAttribute("lineDistance", new Float32BufferAttribute(lineDistances, 1)); + } else { + warn("LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); + } + return this; + } +}; +var LineLoop = class extends Line { + /** + * Constructs a new line loop. + * + * @param {BufferGeometry} [geometry] - The line geometry. + * @param {Material|Array} [material] - The line material. + */ + constructor(geometry, material) { + super(geometry, material); + this.isLineLoop = true; + this.type = "LineLoop"; + } +}; +var PointsMaterial = class extends Material { + /** + * Constructs a new points material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isPointsMaterial = true; + this.type = "PointsMaterial"; + this.color = new Color(16777215); + this.map = null; + this.alphaMap = null; + this.size = 1; + this.sizeAttenuation = true; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.alphaMap = source.alphaMap; + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + this.fog = source.fog; + return this; + } +}; +var _inverseMatrix = new Matrix4(); +var _ray = new Ray(); +var _sphere = new Sphere(); +var _position$2 = new Vector3(); +var Points = class extends Object3D { + /** + * Constructs a new point cloud. + * + * @param {BufferGeometry} [geometry] - The points geometry. + * @param {Material|Array} [material] - The points material. + */ + constructor(geometry = new BufferGeometry(), material = new PointsMaterial()) { + super(); + this.isPoints = true; + this.type = "Points"; + this.geometry = geometry; + this.material = material; + this.morphTargetDictionary = void 0; + this.morphTargetInfluences = void 0; + this.updateMorphTargets(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.material = Array.isArray(source.material) ? source.material.slice() : source.material; + this.geometry = source.geometry; + return this; + } + /** + * Computes intersection points between a casted ray and this point cloud. + * + * @param {Raycaster} raycaster - The raycaster. + * @param {Array} intersects - The target array that holds the intersection points. + */ + raycast(raycaster, intersects2) { + const geometry = this.geometry; + const matrixWorld = this.matrixWorld; + const threshold = raycaster.params.Points.threshold; + const drawRange = geometry.drawRange; + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _sphere.copy(geometry.boundingSphere); + _sphere.applyMatrix4(matrixWorld); + _sphere.radius += threshold; + if (raycaster.ray.intersectsSphere(_sphere) === false) return; + _inverseMatrix.copy(matrixWorld).invert(); + _ray.copy(raycaster.ray).applyMatrix4(_inverseMatrix); + const localThreshold = threshold / ((this.scale.x + this.scale.y + this.scale.z) / 3); + const localThresholdSq = localThreshold * localThreshold; + const index = geometry.index; + const attributes = geometry.attributes; + const positionAttribute = attributes.position; + if (index !== null) { + const start = Math.max(0, drawRange.start); + const end = Math.min(index.count, drawRange.start + drawRange.count); + for (let i = start, il = end; i < il; i++) { + const a = index.getX(i); + _position$2.fromBufferAttribute(positionAttribute, a); + testPoint(_position$2, a, localThresholdSq, matrixWorld, raycaster, intersects2, this); + } + } else { + const start = Math.max(0, drawRange.start); + const end = Math.min(positionAttribute.count, drawRange.start + drawRange.count); + for (let i = start, l = end; i < l; i++) { + _position$2.fromBufferAttribute(positionAttribute, i); + testPoint(_position$2, i, localThresholdSq, matrixWorld, raycaster, intersects2, this); + } + } + } + /** + * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences} + * to make sure existing morph targets can influence this 3D object. + */ + updateMorphTargets() { + const geometry = this.geometry; + const morphAttributes = geometry.morphAttributes; + const keys = Object.keys(morphAttributes); + if (keys.length > 0) { + const morphAttribute = morphAttributes[keys[0]]; + if (morphAttribute !== void 0) { + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + for (let m = 0, ml = morphAttribute.length; m < ml; m++) { + const name = morphAttribute[m].name || String(m); + this.morphTargetInfluences.push(0); + this.morphTargetDictionary[name] = m; + } + } + } + } +}; +function testPoint(point, index, localThresholdSq, matrixWorld, raycaster, intersects2, object) { + const rayPointDistanceSq = _ray.distanceSqToPoint(point); + if (rayPointDistanceSq < localThresholdSq) { + const intersectPoint = new Vector3(); + _ray.closestPointToPoint(point, intersectPoint); + intersectPoint.applyMatrix4(matrixWorld); + const distance = raycaster.ray.origin.distanceTo(intersectPoint); + if (distance < raycaster.near || distance > raycaster.far) return; + intersects2.push({ + distance, + distanceToRay: Math.sqrt(rayPointDistanceSq), + point: intersectPoint, + index, + face: null, + faceIndex: null, + barycoord: null, + object + }); + } +} +var VideoTexture = class extends Texture { + /** + * Constructs a new video texture. + * + * @param {HTMLVideoElement} video - The video element to use as a data source for the texture. + * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=LinearFilter] - The mag filter value. + * @param {number} [minFilter=LinearFilter] - The min filter value. + * @param {number} [format=RGBAFormat] - The texture format. + * @param {number} [type=UnsignedByteType] - The texture type. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + */ + constructor(video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy) { + super(video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); + this.isVideoTexture = true; + this.generateMipmaps = false; + this._requestVideoFrameCallbackId = 0; + const scope = this; + function updateVideo() { + scope.needsUpdate = true; + scope._requestVideoFrameCallbackId = video.requestVideoFrameCallback(updateVideo); + } + if ("requestVideoFrameCallback" in video) { + this._requestVideoFrameCallbackId = video.requestVideoFrameCallback(updateVideo); + } + } + clone() { + return new this.constructor(this.image).copy(this); + } + /** + * This method is called automatically by the renderer and sets {@link Texture#needsUpdate} + * to `true` every time a new frame is available. + * + * Only relevant if `requestVideoFrameCallback` is not supported in the browser. + */ + update() { + const video = this.image; + const hasVideoFrameCallback = "requestVideoFrameCallback" in video; + if (hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA) { + this.needsUpdate = true; + } + } + dispose() { + if (this._requestVideoFrameCallbackId !== 0) { + this.source.data.cancelVideoFrameCallback(this._requestVideoFrameCallbackId); + this._requestVideoFrameCallbackId = 0; + } + super.dispose(); + } +}; +var VideoFrameTexture = class extends VideoTexture { + /** + * Constructs a new video frame texture. + * + * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=LinearFilter] - The mag filter value. + * @param {number} [minFilter=LinearFilter] - The min filter value. + * @param {number} [format=RGBAFormat] - The texture format. + * @param {number} [type=UnsignedByteType] - The texture type. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + */ + constructor(mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) { + super({}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); + this.isVideoFrameTexture = true; + } + /** + * This method overwritten with an empty implementation since + * this type of texture is updated via `setFrame()`. + */ + update() { + } + clone() { + return new this.constructor().copy(this); + } + /** + * Sets the current frame of the video. This will automatically update the texture + * so the data can be used for rendering. + * + * @param {VideoFrame} frame - The video frame. + */ + setFrame(frame) { + this.image = frame; + this.needsUpdate = true; + } +}; +var FramebufferTexture = class extends Texture { + /** + * Constructs a new framebuffer texture. + * + * @param {number} [width] - The width of the texture. + * @param {number} [height] - The height of the texture. + */ + constructor(width, height) { + super({ width, height }); + this.isFramebufferTexture = true; + this.magFilter = NearestFilter; + this.minFilter = NearestFilter; + this.generateMipmaps = false; + this.needsUpdate = true; + } +}; +var CompressedTexture = class extends Texture { + /** + * Constructs a new compressed texture. + * + * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip) + * the data and dimensions. + * @param {number} width - The width of the texture. + * @param {number} height - The height of the texture. + * @param {number} [format=RGBAFormat] - The texture format. + * @param {number} [type=UnsignedByteType] - The texture type. + * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=LinearFilter] - The mag filter value. + * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + * @param {string} [colorSpace=NoColorSpace] - The color space. + */ + constructor(mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace) { + super(null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace); + this.isCompressedTexture = true; + this.image = { width, height }; + this.mipmaps = mipmaps; + this.flipY = false; + this.generateMipmaps = false; + } +}; +var CompressedArrayTexture = class extends CompressedTexture { + /** + * Constructs a new compressed array texture. + * + * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip) + * the data and dimensions. + * @param {number} width - The width of the texture. + * @param {number} height - The height of the texture. + * @param {number} depth - The depth of the texture. + * @param {number} [format=RGBAFormat] - The min filter value. + * @param {number} [type=UnsignedByteType] - The min filter value. + */ + constructor(mipmaps, width, height, depth, format, type) { + super(mipmaps, width, height, format, type); + this.isCompressedArrayTexture = true; + this.image.depth = depth; + this.wrapR = ClampToEdgeWrapping; + this.layerUpdates = /* @__PURE__ */ new Set(); + } + /** + * Describes that a specific layer of the texture needs to be updated. + * Normally when {@link Texture#needsUpdate} is set to `true`, the + * entire compressed texture array is sent to the GPU. Marking specific + * layers will only transmit subsets of all mipmaps associated with a + * specific depth in the array which is often much more performant. + * + * @param {number} layerIndex - The layer index that should be updated. + */ + addLayerUpdate(layerIndex) { + this.layerUpdates.add(layerIndex); + } + /** + * Resets the layer updates registry. + */ + clearLayerUpdates() { + this.layerUpdates.clear(); + } +}; +var CompressedCubeTexture = class extends CompressedTexture { + /** + * Constructs a new compressed texture. + * + * @param {Array} images - An array of compressed textures. + * @param {number} [format=RGBAFormat] - The texture format. + * @param {number} [type=UnsignedByteType] - The texture type. + */ + constructor(images, format, type) { + super(void 0, images[0].width, images[0].height, format, type, CubeReflectionMapping); + this.isCompressedCubeTexture = true; + this.isCubeTexture = true; + this.image = images; + } +}; +var CanvasTexture = class extends Texture { + /** + * Constructs a new texture. + * + * @param {HTMLCanvasElement} [canvas] - The HTML canvas element. + * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=LinearFilter] - The mag filter value. + * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value. + * @param {number} [format=RGBAFormat] - The texture format. + * @param {number} [type=UnsignedByteType] - The texture type. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + */ + constructor(canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) { + super(canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); + this.isCanvasTexture = true; + this.needsUpdate = true; + } +}; +var DepthTexture = class extends Texture { + /** + * Constructs a new depth texture. + * + * @param {number} width - The width of the texture. + * @param {number} height - The height of the texture. + * @param {number} [type=UnsignedIntType] - The texture type. + * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=LinearFilter] - The mag filter value. + * @param {number} [minFilter=LinearFilter] - The min filter value. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + * @param {number} [format=DepthFormat] - The texture format. + * @param {number} [depth=1] - The depth of the texture. + */ + constructor(width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1) { + if (format !== DepthFormat && format !== DepthStencilFormat) { + throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat"); + } + const image = { width, height, depth }; + super(image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy); + this.isDepthTexture = true; + this.flipY = false; + this.generateMipmaps = false; + this.compareFunction = null; + } + copy(source) { + super.copy(source); + this.source = new Source(Object.assign({}, source.image)); + this.compareFunction = source.compareFunction; + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + if (this.compareFunction !== null) data.compareFunction = this.compareFunction; + return data; + } +}; +var CubeDepthTexture = class extends DepthTexture { + /** + * Constructs a new cube depth texture. + * + * @param {number} size - The size (width and height) of each cube face. + * @param {number} [type=UnsignedIntType] - The texture type. + * @param {number} [mapping=CubeReflectionMapping] - The texture mapping. + * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value. + * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value. + * @param {number} [magFilter=NearestFilter] - The mag filter value. + * @param {number} [minFilter=NearestFilter] - The min filter value. + * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value. + * @param {number} [format=DepthFormat] - The texture format. + */ + constructor(size, type = UnsignedIntType, mapping = CubeReflectionMapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat) { + const image = { width: size, height: size, depth: 1 }; + const images = [image, image, image, image, image, image]; + super(size, size, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format); + this.image = images; + this.isCubeDepthTexture = true; + this.isCubeTexture = true; + } + /** + * Alias for {@link CubeDepthTexture#image}. + * + * @type {Array} + */ + get images() { + return this.image; + } + set images(value) { + this.image = value; + } +}; +var ExternalTexture = class extends Texture { + /** + * Creates a new raw texture. + * + * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture. + */ + constructor(sourceTexture = null) { + super(); + this.sourceTexture = sourceTexture; + this.isExternalTexture = true; + } + copy(source) { + super.copy(source); + this.sourceTexture = source.sourceTexture; + return this; + } +}; +var CapsuleGeometry = class _CapsuleGeometry extends BufferGeometry { + /** + * Constructs a new capsule geometry. + * + * @param {number} [radius=1] - Radius of the capsule. + * @param {number} [height=1] - Height of the middle section. + * @param {number} [capSegments=4] - Number of curve segments used to build each cap. + * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3. + * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1. + */ + constructor(radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1) { + super(); + this.type = "CapsuleGeometry"; + this.parameters = { + radius, + height, + capSegments, + radialSegments, + heightSegments + }; + height = Math.max(0, height); + capSegments = Math.max(1, Math.floor(capSegments)); + radialSegments = Math.max(3, Math.floor(radialSegments)); + heightSegments = Math.max(1, Math.floor(heightSegments)); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + const halfHeight = height / 2; + const capArcLength = Math.PI / 2 * radius; + const cylinderPartLength = height; + const totalArcLength = 2 * capArcLength + cylinderPartLength; + const numVerticalSegments = capSegments * 2 + heightSegments; + const verticesPerRow = radialSegments + 1; + const normal = new Vector3(); + const vertex2 = new Vector3(); + for (let iy = 0; iy <= numVerticalSegments; iy++) { + let currentArcLength = 0; + let profileY = 0; + let profileRadius = 0; + let normalYComponent = 0; + if (iy <= capSegments) { + const segmentProgress = iy / capSegments; + const angle = segmentProgress * Math.PI / 2; + profileY = -halfHeight - radius * Math.cos(angle); + profileRadius = radius * Math.sin(angle); + normalYComponent = -radius * Math.cos(angle); + currentArcLength = segmentProgress * capArcLength; + } else if (iy <= capSegments + heightSegments) { + const segmentProgress = (iy - capSegments) / heightSegments; + profileY = -halfHeight + segmentProgress * height; + profileRadius = radius; + normalYComponent = 0; + currentArcLength = capArcLength + segmentProgress * cylinderPartLength; + } else { + const segmentProgress = (iy - capSegments - heightSegments) / capSegments; + const angle = segmentProgress * Math.PI / 2; + profileY = halfHeight + radius * Math.sin(angle); + profileRadius = radius * Math.cos(angle); + normalYComponent = radius * Math.sin(angle); + currentArcLength = capArcLength + cylinderPartLength + segmentProgress * capArcLength; + } + const v = Math.max(0, Math.min(1, currentArcLength / totalArcLength)); + let uOffset = 0; + if (iy === 0) { + uOffset = 0.5 / radialSegments; + } else if (iy === numVerticalSegments) { + uOffset = -0.5 / radialSegments; + } + for (let ix = 0; ix <= radialSegments; ix++) { + const u = ix / radialSegments; + const theta = u * Math.PI * 2; + const sinTheta = Math.sin(theta); + const cosTheta = Math.cos(theta); + vertex2.x = -profileRadius * cosTheta; + vertex2.y = profileY; + vertex2.z = profileRadius * sinTheta; + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normal.set( + -profileRadius * cosTheta, + normalYComponent, + profileRadius * sinTheta + ); + normal.normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(u + uOffset, v); + } + if (iy > 0) { + const prevIndexRow = (iy - 1) * verticesPerRow; + for (let ix = 0; ix < radialSegments; ix++) { + const i1 = prevIndexRow + ix; + const i2 = prevIndexRow + ix + 1; + const i3 = iy * verticesPerRow + ix; + const i4 = iy * verticesPerRow + ix + 1; + indices.push(i1, i2, i3); + indices.push(i2, i4, i3); + } + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {CapsuleGeometry} A new instance. + */ + static fromJSON(data) { + return new _CapsuleGeometry(data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments); + } +}; +var CircleGeometry = class _CircleGeometry extends BufferGeometry { + /** + * Constructs a new circle geometry. + * + * @param {number} [radius=1] - Radius of the circle. + * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`. + * @param {number} [thetaStart=0] - Start angle for first segment in radians. + * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, + * of the circular sector in radians. The default value results in a complete circle. + */ + constructor(radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2) { + super(); + this.type = "CircleGeometry"; + this.parameters = { + radius, + segments, + thetaStart, + thetaLength + }; + segments = Math.max(3, segments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + const vertex2 = new Vector3(); + const uv = new Vector2(); + vertices.push(0, 0, 0); + normals.push(0, 0, 1); + uvs.push(0.5, 0.5); + for (let s = 0, i = 3; s <= segments; s++, i += 3) { + const segment = thetaStart + s / segments * thetaLength; + vertex2.x = radius * Math.cos(segment); + vertex2.y = radius * Math.sin(segment); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normals.push(0, 0, 1); + uv.x = (vertices[i] / radius + 1) / 2; + uv.y = (vertices[i + 1] / radius + 1) / 2; + uvs.push(uv.x, uv.y); + } + for (let i = 1; i <= segments; i++) { + indices.push(i, i + 1, 0); + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {CircleGeometry} A new instance. + */ + static fromJSON(data) { + return new _CircleGeometry(data.radius, data.segments, data.thetaStart, data.thetaLength); + } +}; +var CylinderGeometry = class _CylinderGeometry extends BufferGeometry { + /** + * Constructs a new cylinder geometry. + * + * @param {number} [radiusTop=1] - Radius of the cylinder at the top. + * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom. + * @param {number} [height=1] - Height of the cylinder. + * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder. + * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder. + * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped. + * @param {number} [thetaStart=0] - Start angle for first segment, in radians. + * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians. + * The default value results in a complete cylinder. + */ + constructor(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { + super(); + this.type = "CylinderGeometry"; + this.parameters = { + radiusTop, + radiusBottom, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + }; + const scope = this; + radialSegments = Math.floor(radialSegments); + heightSegments = Math.floor(heightSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + let index = 0; + const indexArray = []; + const halfHeight = height / 2; + let groupStart = 0; + generateTorso(); + if (openEnded === false) { + if (radiusTop > 0) generateCap(true); + if (radiusBottom > 0) generateCap(false); + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function generateTorso() { + const normal = new Vector3(); + const vertex2 = new Vector3(); + let groupCount = 0; + const slope = (radiusBottom - radiusTop) / height; + for (let y = 0; y <= heightSegments; y++) { + const indexRow = []; + const v = y / heightSegments; + const radius = v * (radiusBottom - radiusTop) + radiusTop; + for (let x = 0; x <= radialSegments; x++) { + const u = x / radialSegments; + const theta = u * thetaLength + thetaStart; + const sinTheta = Math.sin(theta); + const cosTheta = Math.cos(theta); + vertex2.x = radius * sinTheta; + vertex2.y = -v * height + halfHeight; + vertex2.z = radius * cosTheta; + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normal.set(sinTheta, slope, cosTheta).normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(u, 1 - v); + indexRow.push(index++); + } + indexArray.push(indexRow); + } + for (let x = 0; x < radialSegments; x++) { + for (let y = 0; y < heightSegments; y++) { + const a = indexArray[y][x]; + const b = indexArray[y + 1][x]; + const c = indexArray[y + 1][x + 1]; + const d = indexArray[y][x + 1]; + if (radiusTop > 0 || y !== 0) { + indices.push(a, b, d); + groupCount += 3; + } + if (radiusBottom > 0 || y !== heightSegments - 1) { + indices.push(b, c, d); + groupCount += 3; + } + } + } + scope.addGroup(groupStart, groupCount, 0); + groupStart += groupCount; + } + function generateCap(top) { + const centerIndexStart = index; + const uv = new Vector2(); + const vertex2 = new Vector3(); + let groupCount = 0; + const radius = top === true ? radiusTop : radiusBottom; + const sign2 = top === true ? 1 : -1; + for (let x = 1; x <= radialSegments; x++) { + vertices.push(0, halfHeight * sign2, 0); + normals.push(0, sign2, 0); + uvs.push(0.5, 0.5); + index++; + } + const centerIndexEnd = index; + for (let x = 0; x <= radialSegments; x++) { + const u = x / radialSegments; + const theta = u * thetaLength + thetaStart; + const cosTheta = Math.cos(theta); + const sinTheta = Math.sin(theta); + vertex2.x = radius * sinTheta; + vertex2.y = halfHeight * sign2; + vertex2.z = radius * cosTheta; + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normals.push(0, sign2, 0); + uv.x = cosTheta * 0.5 + 0.5; + uv.y = sinTheta * 0.5 * sign2 + 0.5; + uvs.push(uv.x, uv.y); + index++; + } + for (let x = 0; x < radialSegments; x++) { + const c = centerIndexStart + x; + const i = centerIndexEnd + x; + if (top === true) { + indices.push(i, i + 1, c); + } else { + indices.push(i + 1, i, c); + } + groupCount += 3; + } + scope.addGroup(groupStart, groupCount, top === true ? 1 : 2); + groupStart += groupCount; + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {CylinderGeometry} A new instance. + */ + static fromJSON(data) { + return new _CylinderGeometry(data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength); + } +}; +var ConeGeometry = class _ConeGeometry extends CylinderGeometry { + /** + * Constructs a new cone geometry. + * + * @param {number} [radius=1] - Radius of the cone base. + * @param {number} [height=1] - Height of the cone. + * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone. + * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone. + * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped. + * @param {number} [thetaStart=0] - Start angle for first segment, in radians. + * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians. + * The default value results in a complete cone. + */ + constructor(radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2) { + super(0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength); + this.type = "ConeGeometry"; + this.parameters = { + radius, + height, + radialSegments, + heightSegments, + openEnded, + thetaStart, + thetaLength + }; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {ConeGeometry} A new instance. + */ + static fromJSON(data) { + return new _ConeGeometry(data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength); + } +}; +var PolyhedronGeometry = class _PolyhedronGeometry extends BufferGeometry { + /** + * Constructs a new polyhedron geometry. + * + * @param {Array} [vertices] - A flat array of vertices describing the base shape. + * @param {Array} [indices] - A flat array of indices describing the base shape. + * @param {number} [radius=1] - The radius of the shape. + * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape. + */ + constructor(vertices = [], indices = [], radius = 1, detail = 0) { + super(); + this.type = "PolyhedronGeometry"; + this.parameters = { + vertices, + indices, + radius, + detail + }; + const vertexBuffer = []; + const uvBuffer = []; + subdivide(detail); + applyRadius(radius); + generateUVs(); + this.setAttribute("position", new Float32BufferAttribute(vertexBuffer, 3)); + this.setAttribute("normal", new Float32BufferAttribute(vertexBuffer.slice(), 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvBuffer, 2)); + if (detail === 0) { + this.computeVertexNormals(); + } else { + this.normalizeNormals(); + } + function subdivide(detail2) { + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + for (let i = 0; i < indices.length; i += 3) { + getVertexByIndex(indices[i + 0], a); + getVertexByIndex(indices[i + 1], b); + getVertexByIndex(indices[i + 2], c); + subdivideFace(a, b, c, detail2); + } + } + function subdivideFace(a, b, c, detail2) { + const cols = detail2 + 1; + const v = []; + for (let i = 0; i <= cols; i++) { + v[i] = []; + const aj = a.clone().lerp(c, i / cols); + const bj = b.clone().lerp(c, i / cols); + const rows = cols - i; + for (let j = 0; j <= rows; j++) { + if (j === 0 && i === cols) { + v[i][j] = aj; + } else { + v[i][j] = aj.clone().lerp(bj, j / rows); + } + } + } + for (let i = 0; i < cols; i++) { + for (let j = 0; j < 2 * (cols - i) - 1; j++) { + const k = Math.floor(j / 2); + if (j % 2 === 0) { + pushVertex(v[i][k + 1]); + pushVertex(v[i + 1][k]); + pushVertex(v[i][k]); + } else { + pushVertex(v[i][k + 1]); + pushVertex(v[i + 1][k + 1]); + pushVertex(v[i + 1][k]); + } + } + } + } + function applyRadius(radius2) { + const vertex2 = new Vector3(); + for (let i = 0; i < vertexBuffer.length; i += 3) { + vertex2.x = vertexBuffer[i + 0]; + vertex2.y = vertexBuffer[i + 1]; + vertex2.z = vertexBuffer[i + 2]; + vertex2.normalize().multiplyScalar(radius2); + vertexBuffer[i + 0] = vertex2.x; + vertexBuffer[i + 1] = vertex2.y; + vertexBuffer[i + 2] = vertex2.z; + } + } + function generateUVs() { + const vertex2 = new Vector3(); + for (let i = 0; i < vertexBuffer.length; i += 3) { + vertex2.x = vertexBuffer[i + 0]; + vertex2.y = vertexBuffer[i + 1]; + vertex2.z = vertexBuffer[i + 2]; + const u = azimuth(vertex2) / 2 / Math.PI + 0.5; + const v = inclination(vertex2) / Math.PI + 0.5; + uvBuffer.push(u, 1 - v); + } + correctUVs(); + correctSeam(); + } + function correctSeam() { + for (let i = 0; i < uvBuffer.length; i += 6) { + const x0 = uvBuffer[i + 0]; + const x1 = uvBuffer[i + 2]; + const x2 = uvBuffer[i + 4]; + const max = Math.max(x0, x1, x2); + const min = Math.min(x0, x1, x2); + if (max > 0.9 && min < 0.1) { + if (x0 < 0.2) uvBuffer[i + 0] += 1; + if (x1 < 0.2) uvBuffer[i + 2] += 1; + if (x2 < 0.2) uvBuffer[i + 4] += 1; + } + } + } + function pushVertex(vertex2) { + vertexBuffer.push(vertex2.x, vertex2.y, vertex2.z); + } + function getVertexByIndex(index, vertex2) { + const stride = index * 3; + vertex2.x = vertices[stride + 0]; + vertex2.y = vertices[stride + 1]; + vertex2.z = vertices[stride + 2]; + } + function correctUVs() { + const a = new Vector3(); + const b = new Vector3(); + const c = new Vector3(); + const centroid = new Vector3(); + const uvA = new Vector2(); + const uvB = new Vector2(); + const uvC = new Vector2(); + for (let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6) { + a.set(vertexBuffer[i + 0], vertexBuffer[i + 1], vertexBuffer[i + 2]); + b.set(vertexBuffer[i + 3], vertexBuffer[i + 4], vertexBuffer[i + 5]); + c.set(vertexBuffer[i + 6], vertexBuffer[i + 7], vertexBuffer[i + 8]); + uvA.set(uvBuffer[j + 0], uvBuffer[j + 1]); + uvB.set(uvBuffer[j + 2], uvBuffer[j + 3]); + uvC.set(uvBuffer[j + 4], uvBuffer[j + 5]); + centroid.copy(a).add(b).add(c).divideScalar(3); + const azi = azimuth(centroid); + correctUV(uvA, j + 0, a, azi); + correctUV(uvB, j + 2, b, azi); + correctUV(uvC, j + 4, c, azi); + } + } + function correctUV(uv, stride, vector, azimuth2) { + if (azimuth2 < 0 && uv.x === 1) { + uvBuffer[stride] = uv.x - 1; + } + if (vector.x === 0 && vector.z === 0) { + uvBuffer[stride] = azimuth2 / 2 / Math.PI + 0.5; + } + } + function azimuth(vector) { + return Math.atan2(vector.z, -vector.x); + } + function inclination(vector) { + return Math.atan2(-vector.y, Math.sqrt(vector.x * vector.x + vector.z * vector.z)); + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {PolyhedronGeometry} A new instance. + */ + static fromJSON(data) { + return new _PolyhedronGeometry(data.vertices, data.indices, data.radius, data.detail); + } +}; +var DodecahedronGeometry = class _DodecahedronGeometry extends PolyhedronGeometry { + /** + * Constructs a new dodecahedron geometry. + * + * @param {number} [radius=1] - Radius of the dodecahedron. + * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron. + */ + constructor(radius = 1, detail = 0) { + const t = (1 + Math.sqrt(5)) / 2; + const r = 1 / t; + const vertices = [ + // (±1, ±1, ±1) + -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, ±1/φ, ±φ) + 0, + -r, + -t, + 0, + -r, + t, + 0, + r, + -t, + 0, + r, + t, + // (±1/φ, ±φ, 0) + -r, + -t, + 0, + -r, + t, + 0, + r, + -t, + 0, + r, + t, + 0, + // (±φ, 0, ±1/φ) + -t, + 0, + -r, + t, + 0, + -r, + -t, + 0, + r, + t, + 0, + r + ]; + const indices = [ + 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 + ]; + super(vertices, indices, radius, detail); + this.type = "DodecahedronGeometry"; + this.parameters = { + radius, + detail + }; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {DodecahedronGeometry} A new instance. + */ + static fromJSON(data) { + return new _DodecahedronGeometry(data.radius, data.detail); + } +}; +var _v0 = new Vector3(); +var _v1$1 = new Vector3(); +var _normal = new Vector3(); +var _triangle = new Triangle(); +var EdgesGeometry = class extends BufferGeometry { + /** + * Constructs a new edges geometry. + * + * @param {?BufferGeometry} [geometry=null] - The geometry. + * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees) + * between the face normals of the adjoining faces exceeds this value. + */ + constructor(geometry = null, thresholdAngle = 1) { + super(); + this.type = "EdgesGeometry"; + this.parameters = { + geometry, + thresholdAngle + }; + if (geometry !== null) { + const precisionPoints = 4; + const precision = Math.pow(10, precisionPoints); + const thresholdDot = Math.cos(DEG2RAD * thresholdAngle); + const indexAttr = geometry.getIndex(); + const positionAttr = geometry.getAttribute("position"); + const indexCount = indexAttr ? indexAttr.count : positionAttr.count; + const indexArr = [0, 0, 0]; + const vertKeys = ["a", "b", "c"]; + const hashes = new Array(3); + const edgeData = {}; + const vertices = []; + for (let i = 0; i < indexCount; i += 3) { + if (indexAttr) { + indexArr[0] = indexAttr.getX(i); + indexArr[1] = indexAttr.getX(i + 1); + indexArr[2] = indexAttr.getX(i + 2); + } else { + indexArr[0] = i; + indexArr[1] = i + 1; + indexArr[2] = i + 2; + } + const { a, b, c } = _triangle; + a.fromBufferAttribute(positionAttr, indexArr[0]); + b.fromBufferAttribute(positionAttr, indexArr[1]); + c.fromBufferAttribute(positionAttr, indexArr[2]); + _triangle.getNormal(_normal); + hashes[0] = `${Math.round(a.x * precision)},${Math.round(a.y * precision)},${Math.round(a.z * precision)}`; + hashes[1] = `${Math.round(b.x * precision)},${Math.round(b.y * precision)},${Math.round(b.z * precision)}`; + hashes[2] = `${Math.round(c.x * precision)},${Math.round(c.y * precision)},${Math.round(c.z * precision)}`; + if (hashes[0] === hashes[1] || hashes[1] === hashes[2] || hashes[2] === hashes[0]) { + continue; + } + for (let j = 0; j < 3; j++) { + const jNext = (j + 1) % 3; + const vecHash0 = hashes[j]; + const vecHash1 = hashes[jNext]; + const v0 = _triangle[vertKeys[j]]; + const v1 = _triangle[vertKeys[jNext]]; + const hash = `${vecHash0}_${vecHash1}`; + const reverseHash = `${vecHash1}_${vecHash0}`; + if (reverseHash in edgeData && edgeData[reverseHash]) { + if (_normal.dot(edgeData[reverseHash].normal) <= thresholdDot) { + vertices.push(v0.x, v0.y, v0.z); + vertices.push(v1.x, v1.y, v1.z); + } + edgeData[reverseHash] = null; + } else if (!(hash in edgeData)) { + edgeData[hash] = { + index0: indexArr[j], + index1: indexArr[jNext], + normal: _normal.clone() + }; + } + } + } + for (const key in edgeData) { + if (edgeData[key]) { + const { index0, index1 } = edgeData[key]; + _v0.fromBufferAttribute(positionAttr, index0); + _v1$1.fromBufferAttribute(positionAttr, index1); + vertices.push(_v0.x, _v0.y, _v0.z); + vertices.push(_v1$1.x, _v1$1.y, _v1$1.z); + } + } + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } +}; +var Curve = class { + /** + * Constructs a new curve. + */ + constructor() { + this.type = "Curve"; + this.arcLengthDivisions = 200; + this.needsUpdate = false; + this.cacheArcLengths = null; + } + /** + * This method returns a vector in 2D or 3D space (depending on the curve definition) + * for the given interpolation factor. + * + * @abstract + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition. + */ + getPoint() { + warn("Curve: .getPoint() not implemented."); + } + /** + * This method returns a vector in 2D or 3D space (depending on the curve definition) + * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length + * of the curve which equidistant samples. + * + * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition. + */ + getPointAt(u, optionalTarget) { + const t = this.getUtoTmapping(u); + return this.getPoint(t, optionalTarget); + } + /** + * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing + * the curve shape. + * + * @param {number} [divisions=5] - The number of divisions. + * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`. + */ + getPoints(divisions = 5) { + const points = []; + for (let d = 0; d <= divisions; d++) { + points.push(this.getPoint(d / divisions)); + } + return points; + } + // Get sequence of points using getPointAt( u ) + /** + * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing + * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire + * curve. + * + * @param {number} [divisions=5] - The number of divisions. + * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`. + */ + getSpacedPoints(divisions = 5) { + const points = []; + for (let d = 0; d <= divisions; d++) { + points.push(this.getPointAt(d / divisions)); + } + return points; + } + /** + * Returns the total arc length of the curve. + * + * @return {number} The length of the curve. + */ + getLength() { + const lengths = this.getLengths(); + return lengths[lengths.length - 1]; + } + /** + * Returns an array of cumulative segment lengths of the curve. + * + * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions. + * @return {Array} An array holding the cumulative segment lengths. + */ + getLengths(divisions = this.arcLengthDivisions) { + if (this.cacheArcLengths && this.cacheArcLengths.length === divisions + 1 && !this.needsUpdate) { + return this.cacheArcLengths; + } + this.needsUpdate = false; + const cache = []; + let current, last = this.getPoint(0); + let sum = 0; + cache.push(0); + for (let p = 1; p <= divisions; p++) { + current = this.getPoint(p / divisions); + sum += current.distanceTo(last); + cache.push(sum); + last = current; + } + this.cacheArcLengths = cache; + return cache; + } + /** + * Update the cumulative segment distance cache. The method must be called + * every time curve parameters are changed. If an updated curve is part of a + * composed curve like {@link CurvePath}, this method must be called on the + * composed curve, too. + */ + updateArcLengths() { + this.needsUpdate = true; + this.getLengths(); + } + /** + * Given an interpolation factor in the range `[0,1]`, this method returns an updated + * interpolation factor in the same range that can be ued to sample equidistant points + * from a curve. + * + * @param {number} u - The interpolation factor. + * @param {?number} distance - An optional distance on the curve. + * @return {number} The updated interpolation factor. + */ + getUtoTmapping(u, distance = null) { + const arcLengths = this.getLengths(); + let i = 0; + const il = arcLengths.length; + let targetArcLength; + if (distance) { + targetArcLength = distance; + } else { + targetArcLength = u * arcLengths[il - 1]; + } + let low = 0, high = il - 1, comparison; + while (low <= high) { + i = Math.floor(low + (high - low) / 2); + comparison = arcLengths[i] - targetArcLength; + if (comparison < 0) { + low = i + 1; + } else if (comparison > 0) { + high = i - 1; + } else { + high = i; + break; + } + } + i = high; + if (arcLengths[i] === targetArcLength) { + return i / (il - 1); + } + const lengthBefore = arcLengths[i]; + const lengthAfter = arcLengths[i + 1]; + const segmentLength = lengthAfter - lengthBefore; + const segmentFraction = (targetArcLength - lengthBefore) / segmentLength; + const t = (i + segmentFraction) / (il - 1); + return t; + } + /** + * Returns a unit vector tangent for the given interpolation factor. + * If the derived curve does not implement its tangent derivation, + * two points a small delta apart will be used to find its gradient + * which seems to give a reasonable approximation. + * + * @param {number} t - The interpolation factor. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {(Vector2|Vector3)} The tangent vector. + */ + getTangent(t, optionalTarget) { + const delta = 1e-4; + let t1 = t - delta; + let t2 = t + delta; + if (t1 < 0) t1 = 0; + if (t2 > 1) t2 = 1; + const pt1 = this.getPoint(t1); + const pt2 = this.getPoint(t2); + const tangent = optionalTarget || (pt1.isVector2 ? new Vector2() : new Vector3()); + tangent.copy(pt2).sub(pt1).normalize(); + return tangent; + } + /** + * Same as {@link Curve#getTangent} but with equidistant samples. + * + * @param {number} u - The interpolation factor. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {(Vector2|Vector3)} The tangent vector. + * @see {@link Curve#getPointAt} + */ + getTangentAt(u, optionalTarget) { + const t = this.getUtoTmapping(u); + return this.getTangent(t, optionalTarget); + } + /** + * Generates the Frenet Frames. Requires a curve definition in 3D space. Used + * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}. + * + * @param {number} segments - The number of segments. + * @param {boolean} [closed=false] - Whether the curve is closed or not. + * @return {{tangents: Array, normals: Array, binormals: Array}} The Frenet Frames. + */ + computeFrenetFrames(segments, closed = false) { + const normal = new Vector3(); + const tangents = []; + const normals = []; + const binormals = []; + const vec = new Vector3(); + const mat = new Matrix4(); + for (let i = 0; i <= segments; i++) { + const u = i / segments; + tangents[i] = this.getTangentAt(u, new Vector3()); + } + normals[0] = new Vector3(); + binormals[0] = new Vector3(); + let min = Number.MAX_VALUE; + const tx = Math.abs(tangents[0].x); + const ty = Math.abs(tangents[0].y); + const tz = Math.abs(tangents[0].z); + if (tx <= min) { + min = tx; + normal.set(1, 0, 0); + } + if (ty <= min) { + min = ty; + normal.set(0, 1, 0); + } + if (tz <= min) { + normal.set(0, 0, 1); + } + vec.crossVectors(tangents[0], normal).normalize(); + normals[0].crossVectors(tangents[0], vec); + binormals[0].crossVectors(tangents[0], normals[0]); + for (let i = 1; i <= segments; i++) { + normals[i] = normals[i - 1].clone(); + binormals[i] = binormals[i - 1].clone(); + vec.crossVectors(tangents[i - 1], tangents[i]); + if (vec.length() > Number.EPSILON) { + vec.normalize(); + const theta = Math.acos(clamp(tangents[i - 1].dot(tangents[i]), -1, 1)); + normals[i].applyMatrix4(mat.makeRotationAxis(vec, theta)); + } + binormals[i].crossVectors(tangents[i], normals[i]); + } + if (closed === true) { + let theta = Math.acos(clamp(normals[0].dot(normals[segments]), -1, 1)); + theta /= segments; + if (tangents[0].dot(vec.crossVectors(normals[0], normals[segments])) > 0) { + theta = -theta; + } + for (let i = 1; i <= segments; i++) { + normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i], theta * i)); + binormals[i].crossVectors(tangents[i], normals[i]); + } + } + return { + tangents, + normals, + binormals + }; + } + /** + * Returns a new curve with copied values from this instance. + * + * @return {Curve} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Copies the values of the given curve to this instance. + * + * @param {Curve} source - The curve to copy. + * @return {Curve} A reference to this curve. + */ + copy(source) { + this.arcLengthDivisions = source.arcLengthDivisions; + return this; + } + /** + * Serializes the curve into JSON. + * + * @return {Object} A JSON object representing the serialized curve. + * @see {@link ObjectLoader#parse} + */ + toJSON() { + const data = { + metadata: { + version: 4.7, + type: "Curve", + generator: "Curve.toJSON" + } + }; + data.arcLengthDivisions = this.arcLengthDivisions; + data.type = this.type; + return data; + } + /** + * Deserializes the curve from the given JSON. + * + * @param {Object} json - The JSON holding the serialized curve. + * @return {Curve} A reference to this curve. + */ + fromJSON(json) { + this.arcLengthDivisions = json.arcLengthDivisions; + return this; + } +}; +var EllipseCurve = class extends Curve { + /** + * Constructs a new ellipse curve. + * + * @param {number} [aX=0] - The X center of the ellipse. + * @param {number} [aY=0] - The Y center of the ellipse. + * @param {number} [xRadius=1] - The radius of the ellipse in the x direction. + * @param {number} [yRadius=1] - The radius of the ellipse in the y direction. + * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis. + * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis. + * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not. + * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis. + */ + constructor(aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0) { + super(); + this.isEllipseCurve = true; + this.type = "EllipseCurve"; + this.aX = aX; + this.aY = aY; + this.xRadius = xRadius; + this.yRadius = yRadius; + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + this.aClockwise = aClockwise; + this.aRotation = aRotation; + } + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the curve. + */ + getPoint(t, optionalTarget = new Vector2()) { + const point = optionalTarget; + const twoPi = Math.PI * 2; + let deltaAngle = this.aEndAngle - this.aStartAngle; + const samePoints = Math.abs(deltaAngle) < Number.EPSILON; + while (deltaAngle < 0) deltaAngle += twoPi; + while (deltaAngle > twoPi) deltaAngle -= twoPi; + if (deltaAngle < Number.EPSILON) { + if (samePoints) { + deltaAngle = 0; + } else { + deltaAngle = twoPi; + } + } + if (this.aClockwise === true && !samePoints) { + if (deltaAngle === twoPi) { + deltaAngle = -twoPi; + } else { + deltaAngle = deltaAngle - twoPi; + } + } + const angle = this.aStartAngle + t * deltaAngle; + let x = this.aX + this.xRadius * Math.cos(angle); + let y = this.aY + this.yRadius * Math.sin(angle); + if (this.aRotation !== 0) { + const cos = Math.cos(this.aRotation); + const sin = Math.sin(this.aRotation); + const tx = x - this.aX; + const ty = y - this.aY; + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + } + return point.set(x, y); + } + copy(source) { + super.copy(source); + this.aX = source.aX; + this.aY = source.aY; + this.xRadius = source.xRadius; + this.yRadius = source.yRadius; + this.aStartAngle = source.aStartAngle; + this.aEndAngle = source.aEndAngle; + this.aClockwise = source.aClockwise; + this.aRotation = source.aRotation; + return this; + } + toJSON() { + const data = super.toJSON(); + data.aX = this.aX; + data.aY = this.aY; + data.xRadius = this.xRadius; + data.yRadius = this.yRadius; + data.aStartAngle = this.aStartAngle; + data.aEndAngle = this.aEndAngle; + data.aClockwise = this.aClockwise; + data.aRotation = this.aRotation; + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.aX = json.aX; + this.aY = json.aY; + this.xRadius = json.xRadius; + this.yRadius = json.yRadius; + this.aStartAngle = json.aStartAngle; + this.aEndAngle = json.aEndAngle; + this.aClockwise = json.aClockwise; + this.aRotation = json.aRotation; + return this; + } +}; +var ArcCurve = class extends EllipseCurve { + /** + * Constructs a new arc curve. + * + * @param {number} [aX=0] - The X center of the ellipse. + * @param {number} [aY=0] - The Y center of the ellipse. + * @param {number} [aRadius=1] - The radius of the ellipse in the x direction. + * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis. + * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis. + * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not. + */ + constructor(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + super(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise); + this.isArcCurve = true; + this.type = "ArcCurve"; + } +}; +function CubicPoly() { + let c0 = 0, c1 = 0, c2 = 0, c3 = 0; + function init(x0, x1, t0, t1) { + c0 = x0; + c1 = t0; + c2 = -3 * x0 + 3 * x1 - 2 * t0 - t1; + c3 = 2 * x0 - 2 * x1 + t0 + t1; + } + return { + initCatmullRom: function(x0, x1, x2, x3, tension) { + init(x1, x2, tension * (x2 - x0), tension * (x3 - x1)); + }, + initNonuniformCatmullRom: function(x0, x1, x2, x3, dt0, dt1, dt2) { + let t1 = (x1 - x0) / dt0 - (x2 - x0) / (dt0 + dt1) + (x2 - x1) / dt1; + let t2 = (x2 - x1) / dt1 - (x3 - x1) / (dt1 + dt2) + (x3 - x2) / dt2; + t1 *= dt1; + t2 *= dt1; + init(x1, x2, t1, t2); + }, + calc: function(t) { + const t2 = t * t; + const t3 = t2 * t; + return c0 + c1 * t + c2 * t2 + c3 * t3; + } + }; +} +var tmp = new Vector3(); +var px = new CubicPoly(); +var py = new CubicPoly(); +var pz = new CubicPoly(); +var CatmullRomCurve3 = class extends Curve { + /** + * Constructs a new Catmull-Rom curve. + * + * @param {Array} [points] - An array of 3D points defining the curve. + * @param {boolean} [closed=false] - Whether the curve is closed or not. + * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type. + * @param {number} [tension=0.5] - Tension of the curve. + */ + constructor(points = [], closed = false, curveType = "centripetal", tension = 0.5) { + super(); + this.isCatmullRomCurve3 = true; + this.type = "CatmullRomCurve3"; + this.points = points; + this.closed = closed; + this.curveType = curveType; + this.tension = tension; + } + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector3} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector3} The position on the curve. + */ + getPoint(t, optionalTarget = new Vector3()) { + const point = optionalTarget; + const points = this.points; + const l = points.length; + const p = (l - (this.closed ? 0 : 1)) * t; + let intPoint = Math.floor(p); + let weight = p - intPoint; + if (this.closed) { + intPoint += intPoint > 0 ? 0 : (Math.floor(Math.abs(intPoint) / l) + 1) * l; + } else if (weight === 0 && intPoint === l - 1) { + intPoint = l - 2; + weight = 1; + } + let p0, p3; + if (this.closed || intPoint > 0) { + p0 = points[(intPoint - 1) % l]; + } else { + tmp.subVectors(points[0], points[1]).add(points[0]); + p0 = tmp; + } + const p1 = points[intPoint % l]; + const p2 = points[(intPoint + 1) % l]; + if (this.closed || intPoint + 2 < l) { + p3 = points[(intPoint + 2) % l]; + } else { + tmp.subVectors(points[l - 1], points[l - 2]).add(points[l - 1]); + p3 = tmp; + } + if (this.curveType === "centripetal" || this.curveType === "chordal") { + const pow = this.curveType === "chordal" ? 0.5 : 0.25; + let dt0 = Math.pow(p0.distanceToSquared(p1), pow); + let dt1 = Math.pow(p1.distanceToSquared(p2), pow); + let dt2 = Math.pow(p2.distanceToSquared(p3), pow); + if (dt1 < 1e-4) dt1 = 1; + if (dt0 < 1e-4) dt0 = dt1; + if (dt2 < 1e-4) dt2 = dt1; + px.initNonuniformCatmullRom(p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2); + py.initNonuniformCatmullRom(p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2); + pz.initNonuniformCatmullRom(p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2); + } else if (this.curveType === "catmullrom") { + px.initCatmullRom(p0.x, p1.x, p2.x, p3.x, this.tension); + py.initCatmullRom(p0.y, p1.y, p2.y, p3.y, this.tension); + pz.initCatmullRom(p0.z, p1.z, p2.z, p3.z, this.tension); + } + point.set( + px.calc(weight), + py.calc(weight), + pz.calc(weight) + ); + return point; + } + copy(source) { + super.copy(source); + this.points = []; + for (let i = 0, l = source.points.length; i < l; i++) { + const point = source.points[i]; + this.points.push(point.clone()); + } + this.closed = source.closed; + this.curveType = source.curveType; + this.tension = source.tension; + return this; + } + toJSON() { + const data = super.toJSON(); + data.points = []; + for (let i = 0, l = this.points.length; i < l; i++) { + const point = this.points[i]; + data.points.push(point.toArray()); + } + data.closed = this.closed; + data.curveType = this.curveType; + data.tension = this.tension; + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.points = []; + for (let i = 0, l = json.points.length; i < l; i++) { + const point = json.points[i]; + this.points.push(new Vector3().fromArray(point)); + } + this.closed = json.closed; + this.curveType = json.curveType; + this.tension = json.tension; + return this; + } +}; +function CatmullRom(t, p0, p1, p2, p3) { + const v0 = (p2 - p0) * 0.5; + const v1 = (p3 - p1) * 0.5; + const t2 = t * t; + const t3 = t * t2; + return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1; +} +function QuadraticBezierP0(t, p) { + const k = 1 - t; + return k * k * p; +} +function QuadraticBezierP1(t, p) { + return 2 * (1 - t) * t * p; +} +function QuadraticBezierP2(t, p) { + return t * t * p; +} +function QuadraticBezier(t, p0, p1, p2) { + return QuadraticBezierP0(t, p0) + QuadraticBezierP1(t, p1) + QuadraticBezierP2(t, p2); +} +function CubicBezierP0(t, p) { + const k = 1 - t; + return k * k * k * p; +} +function CubicBezierP1(t, p) { + const k = 1 - t; + return 3 * k * k * t * p; +} +function CubicBezierP2(t, p) { + return 3 * (1 - t) * t * t * p; +} +function CubicBezierP3(t, p) { + return t * t * t * p; +} +function CubicBezier(t, p0, p1, p2, p3) { + return CubicBezierP0(t, p0) + CubicBezierP1(t, p1) + CubicBezierP2(t, p2) + CubicBezierP3(t, p3); +} +var CubicBezierCurve = class extends Curve { + /** + * Constructs a new Cubic Bezier curve. + * + * @param {Vector2} [v0] - The start point. + * @param {Vector2} [v1] - The first control point. + * @param {Vector2} [v2] - The second control point. + * @param {Vector2} [v3] - The end point. + */ + constructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2()) { + super(); + this.isCubicBezierCurve = true; + this.type = "CubicBezierCurve"; + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + } + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the curve. + */ + getPoint(t, optionalTarget = new Vector2()) { + const point = optionalTarget; + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + point.set( + CubicBezier(t, v0.x, v1.x, v2.x, v3.x), + CubicBezier(t, v0.y, v1.y, v2.y, v3.y) + ); + return point; + } + copy(source) { + super.copy(source); + this.v0.copy(source.v0); + this.v1.copy(source.v1); + this.v2.copy(source.v2); + this.v3.copy(source.v3); + return this; + } + toJSON() { + const data = super.toJSON(); + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.v0.fromArray(json.v0); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + this.v3.fromArray(json.v3); + return this; + } +}; +var CubicBezierCurve3 = class extends Curve { + /** + * Constructs a new Cubic Bezier curve. + * + * @param {Vector3} [v0] - The start point. + * @param {Vector3} [v1] - The first control point. + * @param {Vector3} [v2] - The second control point. + * @param {Vector3} [v3] - The end point. + */ + constructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3()) { + super(); + this.isCubicBezierCurve3 = true; + this.type = "CubicBezierCurve3"; + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + } + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector3} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector3} The position on the curve. + */ + getPoint(t, optionalTarget = new Vector3()) { + const point = optionalTarget; + const v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; + point.set( + CubicBezier(t, v0.x, v1.x, v2.x, v3.x), + CubicBezier(t, v0.y, v1.y, v2.y, v3.y), + CubicBezier(t, v0.z, v1.z, v2.z, v3.z) + ); + return point; + } + copy(source) { + super.copy(source); + this.v0.copy(source.v0); + this.v1.copy(source.v1); + this.v2.copy(source.v2); + this.v3.copy(source.v3); + return this; + } + toJSON() { + const data = super.toJSON(); + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + data.v3 = this.v3.toArray(); + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.v0.fromArray(json.v0); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + this.v3.fromArray(json.v3); + return this; + } +}; +var LineCurve = class extends Curve { + /** + * Constructs a new line curve. + * + * @param {Vector2} [v1] - The start point. + * @param {Vector2} [v2] - The end point. + */ + constructor(v1 = new Vector2(), v2 = new Vector2()) { + super(); + this.isLineCurve = true; + this.type = "LineCurve"; + this.v1 = v1; + this.v2 = v2; + } + /** + * Returns a point on the line. + * + * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the line. + */ + getPoint(t, optionalTarget = new Vector2()) { + const point = optionalTarget; + if (t === 1) { + point.copy(this.v2); + } else { + point.copy(this.v2).sub(this.v1); + point.multiplyScalar(t).add(this.v1); + } + return point; + } + // Line curve is linear, so we can overwrite default getPointAt + getPointAt(u, optionalTarget) { + return this.getPoint(u, optionalTarget); + } + getTangent(t, optionalTarget = new Vector2()) { + return optionalTarget.subVectors(this.v2, this.v1).normalize(); + } + getTangentAt(u, optionalTarget) { + return this.getTangent(u, optionalTarget); + } + copy(source) { + super.copy(source); + this.v1.copy(source.v1); + this.v2.copy(source.v2); + return this; + } + toJSON() { + const data = super.toJSON(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + return this; + } +}; +var LineCurve3 = class extends Curve { + /** + * Constructs a new line curve. + * + * @param {Vector3} [v1] - The start point. + * @param {Vector3} [v2] - The end point. + */ + constructor(v1 = new Vector3(), v2 = new Vector3()) { + super(); + this.isLineCurve3 = true; + this.type = "LineCurve3"; + this.v1 = v1; + this.v2 = v2; + } + /** + * Returns a point on the line. + * + * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`. + * @param {Vector3} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector3} The position on the line. + */ + getPoint(t, optionalTarget = new Vector3()) { + const point = optionalTarget; + if (t === 1) { + point.copy(this.v2); + } else { + point.copy(this.v2).sub(this.v1); + point.multiplyScalar(t).add(this.v1); + } + return point; + } + // Line curve is linear, so we can overwrite default getPointAt + getPointAt(u, optionalTarget) { + return this.getPoint(u, optionalTarget); + } + getTangent(t, optionalTarget = new Vector3()) { + return optionalTarget.subVectors(this.v2, this.v1).normalize(); + } + getTangentAt(u, optionalTarget) { + return this.getTangent(u, optionalTarget); + } + copy(source) { + super.copy(source); + this.v1.copy(source.v1); + this.v2.copy(source.v2); + return this; + } + toJSON() { + const data = super.toJSON(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + return this; + } +}; +var QuadraticBezierCurve = class extends Curve { + /** + * Constructs a new Quadratic Bezier curve. + * + * @param {Vector2} [v0] - The start point. + * @param {Vector2} [v1] - The control point. + * @param {Vector2} [v2] - The end point. + */ + constructor(v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2()) { + super(); + this.isQuadraticBezierCurve = true; + this.type = "QuadraticBezierCurve"; + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + } + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the curve. + */ + getPoint(t, optionalTarget = new Vector2()) { + const point = optionalTarget; + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + point.set( + QuadraticBezier(t, v0.x, v1.x, v2.x), + QuadraticBezier(t, v0.y, v1.y, v2.y) + ); + return point; + } + copy(source) { + super.copy(source); + this.v0.copy(source.v0); + this.v1.copy(source.v1); + this.v2.copy(source.v2); + return this; + } + toJSON() { + const data = super.toJSON(); + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.v0.fromArray(json.v0); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + return this; + } +}; +var QuadraticBezierCurve3 = class extends Curve { + /** + * Constructs a new Quadratic Bezier curve. + * + * @param {Vector3} [v0] - The start point. + * @param {Vector3} [v1] - The control point. + * @param {Vector3} [v2] - The end point. + */ + constructor(v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3()) { + super(); + this.isQuadraticBezierCurve3 = true; + this.type = "QuadraticBezierCurve3"; + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + } + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector3} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector3} The position on the curve. + */ + getPoint(t, optionalTarget = new Vector3()) { + const point = optionalTarget; + const v0 = this.v0, v1 = this.v1, v2 = this.v2; + point.set( + QuadraticBezier(t, v0.x, v1.x, v2.x), + QuadraticBezier(t, v0.y, v1.y, v2.y), + QuadraticBezier(t, v0.z, v1.z, v2.z) + ); + return point; + } + copy(source) { + super.copy(source); + this.v0.copy(source.v0); + this.v1.copy(source.v1); + this.v2.copy(source.v2); + return this; + } + toJSON() { + const data = super.toJSON(); + data.v0 = this.v0.toArray(); + data.v1 = this.v1.toArray(); + data.v2 = this.v2.toArray(); + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.v0.fromArray(json.v0); + this.v1.fromArray(json.v1); + this.v2.fromArray(json.v2); + return this; + } +}; +var SplineCurve = class extends Curve { + /** + * Constructs a new 2D spline curve. + * + * @param {Array} [points] - An array of 2D points defining the curve. + */ + constructor(points = []) { + super(); + this.isSplineCurve = true; + this.type = "SplineCurve"; + this.points = points; + } + /** + * Returns a point on the curve. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {Vector2} [optionalTarget] - The optional target vector the result is written to. + * @return {Vector2} The position on the curve. + */ + getPoint(t, optionalTarget = new Vector2()) { + const point = optionalTarget; + const points = this.points; + const p = (points.length - 1) * t; + const intPoint = Math.floor(p); + const weight = p - intPoint; + const p0 = points[intPoint === 0 ? intPoint : intPoint - 1]; + const p1 = points[intPoint]; + const p2 = points[intPoint > points.length - 2 ? points.length - 1 : intPoint + 1]; + const p3 = points[intPoint > points.length - 3 ? points.length - 1 : intPoint + 2]; + point.set( + CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), + CatmullRom(weight, p0.y, p1.y, p2.y, p3.y) + ); + return point; + } + copy(source) { + super.copy(source); + this.points = []; + for (let i = 0, l = source.points.length; i < l; i++) { + const point = source.points[i]; + this.points.push(point.clone()); + } + return this; + } + toJSON() { + const data = super.toJSON(); + data.points = []; + for (let i = 0, l = this.points.length; i < l; i++) { + const point = this.points[i]; + data.points.push(point.toArray()); + } + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.points = []; + for (let i = 0, l = json.points.length; i < l; i++) { + const point = json.points[i]; + this.points.push(new Vector2().fromArray(point)); + } + return this; + } +}; +var Curves = Object.freeze({ + __proto__: null, + ArcCurve, + CatmullRomCurve3, + CubicBezierCurve, + CubicBezierCurve3, + EllipseCurve, + LineCurve, + LineCurve3, + QuadraticBezierCurve, + QuadraticBezierCurve3, + SplineCurve +}); +var CurvePath = class extends Curve { + /** + * Constructs a new curve path. + */ + constructor() { + super(); + this.type = "CurvePath"; + this.curves = []; + this.autoClose = false; + } + /** + * Adds a curve to this curve path. + * + * @param {Curve} curve - The curve to add. + */ + add(curve) { + this.curves.push(curve); + } + /** + * Adds a line curve to close the path. + * + * @return {CurvePath} A reference to this curve path. + */ + closePath() { + const startPoint = this.curves[0].getPoint(0); + const endPoint = this.curves[this.curves.length - 1].getPoint(1); + if (!startPoint.equals(endPoint)) { + const lineType = startPoint.isVector2 === true ? "LineCurve" : "LineCurve3"; + this.curves.push(new Curves[lineType](endPoint, startPoint)); + } + return this; + } + /** + * This method returns a vector in 2D or 3D space (depending on the curve definitions) + * for the given interpolation factor. + * + * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`. + * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to. + * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition. + */ + getPoint(t, optionalTarget) { + const d = t * this.getLength(); + const curveLengths = this.getCurveLengths(); + let i = 0; + while (i < curveLengths.length) { + if (curveLengths[i] >= d) { + const diff = curveLengths[i] - d; + const curve = this.curves[i]; + const segmentLength = curve.getLength(); + const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + return curve.getPointAt(u, optionalTarget); + } + i++; + } + return null; + } + getLength() { + const lens = this.getCurveLengths(); + return lens[lens.length - 1]; + } + updateArcLengths() { + this.needsUpdate = true; + this.cacheLengths = null; + this.getCurveLengths(); + } + /** + * Returns list of cumulative curve lengths of the defined curves. + * + * @return {Array} The curve lengths. + */ + getCurveLengths() { + if (this.cacheLengths && this.cacheLengths.length === this.curves.length) { + return this.cacheLengths; + } + const lengths = []; + let sums = 0; + for (let i = 0, l = this.curves.length; i < l; i++) { + sums += this.curves[i].getLength(); + lengths.push(sums); + } + this.cacheLengths = lengths; + return lengths; + } + getSpacedPoints(divisions = 40) { + const points = []; + for (let i = 0; i <= divisions; i++) { + points.push(this.getPoint(i / divisions)); + } + if (this.autoClose) { + points.push(points[0]); + } + return points; + } + getPoints(divisions = 12) { + const points = []; + let last; + for (let i = 0, curves = this.curves; i < curves.length; i++) { + const curve = curves[i]; + const resolution = curve.isEllipseCurve ? divisions * 2 : curve.isLineCurve || curve.isLineCurve3 ? 1 : curve.isSplineCurve ? divisions * curve.points.length : divisions; + const pts = curve.getPoints(resolution); + for (let j = 0; j < pts.length; j++) { + const point = pts[j]; + if (last && last.equals(point)) continue; + points.push(point); + last = point; + } + } + if (this.autoClose && points.length > 1 && !points[points.length - 1].equals(points[0])) { + points.push(points[0]); + } + return points; + } + copy(source) { + super.copy(source); + this.curves = []; + for (let i = 0, l = source.curves.length; i < l; i++) { + const curve = source.curves[i]; + this.curves.push(curve.clone()); + } + this.autoClose = source.autoClose; + return this; + } + toJSON() { + const data = super.toJSON(); + data.autoClose = this.autoClose; + data.curves = []; + for (let i = 0, l = this.curves.length; i < l; i++) { + const curve = this.curves[i]; + data.curves.push(curve.toJSON()); + } + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.autoClose = json.autoClose; + this.curves = []; + for (let i = 0, l = json.curves.length; i < l; i++) { + const curve = json.curves[i]; + this.curves.push(new Curves[curve.type]().fromJSON(curve)); + } + return this; + } +}; +var Path = class extends CurvePath { + /** + * Constructs a new path. + * + * @param {Array} [points] - An array of 2D points defining the path. + */ + constructor(points) { + super(); + this.type = "Path"; + this.currentPoint = new Vector2(); + if (points) { + this.setFromPoints(points); + } + } + /** + * Creates a path from the given list of points. The points are added + * to the path as instances of {@link LineCurve}. + * + * @param {Array} points - An array of 2D points. + * @return {Path} A reference to this path. + */ + setFromPoints(points) { + this.moveTo(points[0].x, points[0].y); + for (let i = 1, l = points.length; i < l; i++) { + this.lineTo(points[i].x, points[i].y); + } + return this; + } + /** + * Moves {@link Path#currentPoint} to the given point. + * + * @param {number} x - The x coordinate. + * @param {number} y - The y coordinate. + * @return {Path} A reference to this path. + */ + moveTo(x, y) { + this.currentPoint.set(x, y); + return this; + } + /** + * Adds an instance of {@link LineCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} x - The x coordinate of the end point. + * @param {number} y - The y coordinate of the end point. + * @return {Path} A reference to this path. + */ + lineTo(x, y) { + const curve = new LineCurve(this.currentPoint.clone(), new Vector2(x, y)); + this.curves.push(curve); + this.currentPoint.set(x, y); + return this; + } + /** + * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} aCPx - The x coordinate of the control point. + * @param {number} aCPy - The y coordinate of the control point. + * @param {number} aX - The x coordinate of the end point. + * @param {number} aY - The y coordinate of the end point. + * @return {Path} A reference to this path. + */ + quadraticCurveTo(aCPx, aCPy, aX, aY) { + const curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2(aCPx, aCPy), + new Vector2(aX, aY) + ); + this.curves.push(curve); + this.currentPoint.set(aX, aY); + return this; + } + /** + * Adds an instance of {@link CubicBezierCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} aCP1x - The x coordinate of the first control point. + * @param {number} aCP1y - The y coordinate of the first control point. + * @param {number} aCP2x - The x coordinate of the second control point. + * @param {number} aCP2y - The y coordinate of the second control point. + * @param {number} aX - The x coordinate of the end point. + * @param {number} aY - The y coordinate of the end point. + * @return {Path} A reference to this path. + */ + bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { + const curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2(aCP1x, aCP1y), + new Vector2(aCP2x, aCP2y), + new Vector2(aX, aY) + ); + this.curves.push(curve); + this.currentPoint.set(aX, aY); + return this; + } + /** + * Adds an instance of {@link SplineCurve} to the path by connecting + * the current point with the given list of points. + * + * @param {Array} pts - An array of points in 2D space. + * @return {Path} A reference to this path. + */ + splineThru(pts) { + const npts = [this.currentPoint.clone()].concat(pts); + const curve = new SplineCurve(npts); + this.curves.push(curve); + this.currentPoint.copy(pts[pts.length - 1]); + return this; + } + /** + * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative + * to the current point. + * + * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve. + * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve. + * @param {number} [aRadius=1] - The radius of the arc. + * @param {number} [aStartAngle=0] - The start angle in radians. + * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians. + * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not. + * @return {Path} A reference to this path. + */ + arc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + this.absarc( + aX + x0, + aY + y0, + aRadius, + aStartAngle, + aEndAngle, + aClockwise + ); + return this; + } + /** + * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path. + * + * @param {number} [aX=0] - The x coordinate of the center of the arc. + * @param {number} [aY=0] - The y coordinate of the center of the arc. + * @param {number} [aRadius=1] - The radius of the arc. + * @param {number} [aStartAngle=0] - The start angle in radians. + * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians. + * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not. + * @return {Path} A reference to this path. + */ + absarc(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { + this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise); + return this; + } + /** + * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative + * to the current point + * + * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve. + * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve. + * @param {number} [xRadius=1] - The radius of the ellipse in the x axis. + * @param {number} [yRadius=1] - The radius of the ellipse in the y axis. + * @param {number} [aStartAngle=0] - The start angle in radians. + * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians. + * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not. + * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis. + * @return {Path} A reference to this path. + */ + ellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { + const x0 = this.currentPoint.x; + const y0 = this.currentPoint.y; + this.absellipse(aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation); + return this; + } + /** + * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path. + * + * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse. + * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse. + * @param {number} [xRadius=1] - The radius of the ellipse in the x axis. + * @param {number} [yRadius=1] - The radius of the ellipse in the y axis. + * @param {number} [aStartAngle=0] - The start angle in radians. + * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians. + * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not. + * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis. + * @return {Path} A reference to this path. + */ + absellipse(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation) { + const curve = new EllipseCurve(aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation); + if (this.curves.length > 0) { + const firstPoint = curve.getPoint(0); + if (!firstPoint.equals(this.currentPoint)) { + this.lineTo(firstPoint.x, firstPoint.y); + } + } + this.curves.push(curve); + const lastPoint = curve.getPoint(1); + this.currentPoint.copy(lastPoint); + return this; + } + copy(source) { + super.copy(source); + this.currentPoint.copy(source.currentPoint); + return this; + } + toJSON() { + const data = super.toJSON(); + data.currentPoint = this.currentPoint.toArray(); + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.currentPoint.fromArray(json.currentPoint); + return this; + } +}; +var Shape = class extends Path { + /** + * Constructs a new shape. + * + * @param {Array} [points] - An array of 2D points defining the shape. + */ + constructor(points) { + super(points); + this.uuid = generateUUID(); + this.type = "Shape"; + this.holes = []; + } + /** + * Returns an array representing each contour of the holes + * as a list of 2D points. + * + * @param {number} divisions - The fineness of the result. + * @return {Array>} The holes as a series of 2D points. + */ + getPointsHoles(divisions) { + const holesPts = []; + for (let i = 0, l = this.holes.length; i < l; i++) { + holesPts[i] = this.holes[i].getPoints(divisions); + } + return holesPts; + } + // get points of shape and holes (keypoints based on segments parameter) + /** + * Returns an object that holds contour data for the shape and its holes as + * arrays of 2D points. + * + * @param {number} divisions - The fineness of the result. + * @return {{shape:Array,holes:Array>}} An object with contour data. + */ + extractPoints(divisions) { + return { + shape: this.getPoints(divisions), + holes: this.getPointsHoles(divisions) + }; + } + copy(source) { + super.copy(source); + this.holes = []; + for (let i = 0, l = source.holes.length; i < l; i++) { + const hole = source.holes[i]; + this.holes.push(hole.clone()); + } + return this; + } + toJSON() { + const data = super.toJSON(); + data.uuid = this.uuid; + data.holes = []; + for (let i = 0, l = this.holes.length; i < l; i++) { + const hole = this.holes[i]; + data.holes.push(hole.toJSON()); + } + return data; + } + fromJSON(json) { + super.fromJSON(json); + this.uuid = json.uuid; + this.holes = []; + for (let i = 0, l = json.holes.length; i < l; i++) { + const hole = json.holes[i]; + this.holes.push(new Path().fromJSON(hole)); + } + return this; + } +}; +function earcut(data, holeIndices, dim = 2) { + const hasHoles = holeIndices && holeIndices.length; + const outerLen = hasHoles ? holeIndices[0] * dim : data.length; + let outerNode = linkedList(data, 0, outerLen, dim, true); + const triangles = []; + if (!outerNode || outerNode.next === outerNode.prev) return triangles; + let minX, minY, invSize; + if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + if (data.length > 80 * dim) { + minX = data[0]; + minY = data[1]; + let maxX = minX; + let maxY = minY; + for (let i = dim; i < outerLen; i += dim) { + const x = data[i]; + const y = data[i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + invSize = Math.max(maxX - minX, maxY - minY); + invSize = invSize !== 0 ? 32767 / invSize : 0; + } + earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0); + return triangles; +} +function linkedList(data, start, end, dim, clockwise) { + let last; + if (clockwise === signedArea(data, start, end, dim) > 0) { + for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last); + } else { + for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last); + } + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; + } + return last; +} +function filterPoints(start, end) { + if (!start) return start; + if (!end) end = start; + let p = start, again; + do { + again = false; + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) break; + again = true; + } else { + p = p.next; + } + } while (again || p !== end); + return end; +} +function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { + if (!ear) return; + if (!pass && invSize) indexCurve(ear, minX, minY, invSize); + let stop = ear; + while (ear.prev !== ear.next) { + const prev = ear.prev; + const next = ear.next; + if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { + triangles.push(prev.i, ear.i, next.i); + removeNode(ear); + ear = next.next; + stop = next.next; + continue; + } + ear = next; + if (ear === stop) { + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); + } else if (pass === 1) { + ear = cureLocalIntersections(filterPoints(ear), triangles); + earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, invSize); + } + break; + } + } +} +function isEar(ear) { + const a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) return false; + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + const x0 = Math.min(ax, bx, cx), y0 = Math.min(ay, by, cy), x1 = Math.max(ax, bx, cx), y1 = Math.max(ay, by, cy); + let p = c.next; + while (p !== a) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.next; + } + return true; +} +function isEarHashed(ear, minX, minY, invSize) { + const a = ear.prev, b = ear, c = ear.next; + if (area(a, b, c) >= 0) return false; + const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y; + const x0 = Math.min(ax, bx, cx), y0 = Math.min(ay, by, cy), x1 = Math.max(ax, bx, cx), y1 = Math.max(ay, by, cy); + const minZ = zOrder(x0, y0, minX, minY, invSize), maxZ = zOrder(x1, y1, minX, minY, invSize); + let p = ear.prevZ, n = ear.nextZ; + while (p && p.z >= minZ && n && n.z <= maxZ) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; + } + while (p && p.z >= minZ) { + if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + } + while (n && n.z <= maxZ) { + if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; + n = n.nextZ; + } + return true; +} +function cureLocalIntersections(start, triangles) { + let p = start; + do { + const a = p.prev, b = p.next.next; + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + triangles.push(a.i, p.i, b.i); + removeNode(p); + removeNode(p.next); + p = start = b; + } + p = p.next; + } while (p !== start); + return filterPoints(p); +} +function splitEarcut(start, triangles, dim, minX, minY, invSize) { + let a = start; + do { + let b = a.next.next; + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + let c = splitPolygon(a, b); + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); + earcutLinked(a, triangles, dim, minX, minY, invSize, 0); + earcutLinked(c, triangles, dim, minX, minY, invSize, 0); + return; + } + b = b.next; + } + a = a.next; + } while (a !== start); +} +function eliminateHoles(data, holeIndices, outerNode, dim) { + const queue = []; + for (let i = 0, len = holeIndices.length; i < len; i++) { + const start = holeIndices[i] * dim; + const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + const list = linkedList(data, start, end, dim, false); + if (list === list.next) list.steiner = true; + queue.push(getLeftmost(list)); + } + queue.sort(compareXYSlope); + for (let i = 0; i < queue.length; i++) { + outerNode = eliminateHole(queue[i], outerNode); + } + return outerNode; +} +function compareXYSlope(a, b) { + let result = a.x - b.x; + if (result === 0) { + result = a.y - b.y; + if (result === 0) { + const aSlope = (a.next.y - a.y) / (a.next.x - a.x); + const bSlope = (b.next.y - b.y) / (b.next.x - b.x); + result = aSlope - bSlope; + } + } + return result; +} +function eliminateHole(hole, outerNode) { + const bridge = findHoleBridge(hole, outerNode); + if (!bridge) { + return outerNode; + } + const bridgeReverse = splitPolygon(bridge, hole); + filterPoints(bridgeReverse, bridgeReverse.next); + return filterPoints(bridge, bridge.next); +} +function findHoleBridge(hole, outerNode) { + let p = outerNode; + const hx = hole.x; + const hy = hole.y; + let qx = -Infinity; + let m; + if (equals(hole, p)) return p; + do { + if (equals(hole, p.next)) return p.next; + else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { + const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + m = p.x < p.next.x ? p : p.next; + if (x === hx) return m; + } + } + p = p.next; + } while (p !== outerNode); + if (!m) return null; + const stop = m; + const mx = m.x; + const my = m.y; + let tanMin = Infinity; + p = m; + do { + if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { + const tan = Math.abs(hy - p.y) / (hx - p.x); + if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) { + m = p; + tanMin = tan; + } + } + p = p.next; + } while (p !== stop); + return m; +} +function sectorContainsSector(m, p) { + return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; +} +function indexCurve(start, minX, minY, invSize) { + let p = start; + do { + if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + } while (p !== start); + p.prevZ.nextZ = null; + p.prevZ = null; + sortLinked(p); +} +function sortLinked(list) { + let numMerges; + let inSize = 1; + do { + let p = list; + let e; + list = null; + let tail = null; + numMerges = 0; + while (p) { + numMerges++; + let q = p; + let pSize = 0; + for (let i = 0; i < inSize; i++) { + pSize++; + q = q.nextZ; + if (!q) break; + } + let qSize = inSize; + while (pSize > 0 || qSize > 0 && q) { + if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } + if (tail) tail.nextZ = e; + else list = e; + e.prevZ = tail; + tail = e; + } + p = q; + } + tail.nextZ = null; + inSize *= 2; + } while (numMerges > 1); + return list; +} +function zOrder(x, y, minX, minY, invSize) { + x = (x - minX) * invSize | 0; + y = (y - minY) * invSize | 0; + x = (x | x << 8) & 16711935; + x = (x | x << 4) & 252645135; + x = (x | x << 2) & 858993459; + x = (x | x << 1) & 1431655765; + y = (y | y << 8) & 16711935; + y = (y | y << 4) & 252645135; + y = (y | y << 2) & 858993459; + y = (y | y << 1) & 1431655765; + return x | y << 1; +} +function getLeftmost(start) { + let p = start, leftmost = start; + do { + if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p; + p = p.next; + } while (p !== start); + return leftmost; +} +function pointInTriangle(ax, ay, bx, by, cx, cy, px2, py2) { + return (cx - px2) * (ay - py2) >= (ax - px2) * (cy - py2) && (ax - px2) * (by - py2) >= (bx - px2) * (ay - py2) && (bx - px2) * (cy - py2) >= (cx - px2) * (by - py2); +} +function pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px2, py2) { + return !(ax === px2 && ay === py2) && pointInTriangle(ax, ay, bx, by, cx, cy, px2, py2); +} +function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges + (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible + (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors + equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); +} +function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); +} +function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; +} +function intersects(p1, q1, p2, q2) { + const o1 = sign(area(p1, q1, p2)); + const o2 = sign(area(p1, q1, q2)); + const o3 = sign(area(p2, q2, p1)); + const o4 = sign(area(p2, q2, q1)); + if (o1 !== o2 && o3 !== o4) return true; + if (o1 === 0 && onSegment(p1, p2, q1)) return true; + if (o2 === 0 && onSegment(p1, q2, q1)) return true; + if (o3 === 0 && onSegment(p2, p1, q2)) return true; + if (o4 === 0 && onSegment(p2, q1, q2)) return true; + return false; +} +function onSegment(p, q, r) { + return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); +} +function sign(num) { + return num > 0 ? 1 : num < 0 ? -1 : 0; +} +function intersectsPolygon(a, b) { + let p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true; + p = p.next; + } while (p !== a); + return false; +} +function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; +} +function middleInside(a, b) { + let p = a; + let inside = false; + const px2 = (a.x + b.x) / 2; + const py2 = (a.y + b.y) / 2; + do { + if (p.y > py2 !== p.next.y > py2 && p.next.y !== p.y && px2 < (p.next.x - p.x) * (py2 - p.y) / (p.next.y - p.y) + p.x) + inside = !inside; + p = p.next; + } while (p !== a); + return inside; +} +function splitPolygon(a, b) { + const a2 = createNode(a.i, a.x, a.y), b2 = createNode(b.i, b.x, b.y), an = a.next, bp = b.prev; + a.next = b; + b.prev = a; + a2.next = an; + an.prev = a2; + b2.next = a2; + a2.prev = b2; + bp.next = b2; + b2.prev = bp; + return b2; +} +function insertNode(i, x, y, last) { + const p = createNode(i, x, y); + if (!last) { + p.prev = p; + p.next = p; + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + } + return p; +} +function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; + if (p.prevZ) p.prevZ.nextZ = p.nextZ; + if (p.nextZ) p.nextZ.prevZ = p.prevZ; +} +function createNode(i, x, y) { + return { + i, + // vertex index in coordinates array + x, + y, + // vertex coordinates + prev: null, + // previous and next vertex nodes in a polygon ring + next: null, + z: 0, + // z-order curve value + prevZ: null, + // previous and next nodes in z-order + nextZ: null, + steiner: false + // indicates whether this is a steiner point + }; +} +function signedArea(data, start, end, dim) { + let sum = 0; + for (let i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; + } + return sum; +} +var Earcut = class { + /** + * Triangulates the given shape definition by returning an array of triangles. + * + * @param {Array} data - An array with 2D points. + * @param {Array} holeIndices - An array with indices defining holes. + * @param {number} [dim=2] - The number of coordinates per vertex in the input array. + * @return {Array} An array representing the triangulated faces. Each face is defined by three consecutive numbers + * representing vertex indices. + */ + static triangulate(data, holeIndices, dim = 2) { + return earcut(data, holeIndices, dim); + } +}; +var ShapeUtils = class _ShapeUtils { + /** + * Calculate area of a ( 2D ) contour polygon. + * + * @param {Array} contour - An array of 2D points. + * @return {number} The area. + */ + static area(contour) { + const n = contour.length; + let a = 0; + for (let p = n - 1, q = 0; q < n; p = q++) { + a += contour[p].x * contour[q].y - contour[q].x * contour[p].y; + } + return a * 0.5; + } + /** + * Returns `true` if the given contour uses a clockwise winding order. + * + * @param {Array} pts - An array of 2D points defining a polygon. + * @return {boolean} Whether the given contour uses a clockwise winding order or not. + */ + static isClockWise(pts) { + return _ShapeUtils.area(pts) < 0; + } + /** + * Triangulates the given shape definition. + * + * @param {Array} contour - An array of 2D points defining the contour. + * @param {Array>} holes - An array that holds arrays of 2D points defining the holes. + * @return {Array>} An array that holds for each face definition an array with three indices. + */ + static triangulateShape(contour, holes) { + const vertices = []; + const holeIndices = []; + const faces = []; + removeDupEndPts(contour); + addContour(vertices, contour); + let holeIndex = contour.length; + holes.forEach(removeDupEndPts); + for (let i = 0; i < holes.length; i++) { + holeIndices.push(holeIndex); + holeIndex += holes[i].length; + addContour(vertices, holes[i]); + } + const triangles = Earcut.triangulate(vertices, holeIndices); + for (let i = 0; i < triangles.length; i += 3) { + faces.push(triangles.slice(i, i + 3)); + } + return faces; + } +}; +function removeDupEndPts(points) { + const l = points.length; + if (l > 2 && points[l - 1].equals(points[0])) { + points.pop(); + } +} +function addContour(vertices, contour) { + for (let i = 0; i < contour.length; i++) { + vertices.push(contour[i].x); + vertices.push(contour[i].y); + } +} +var ExtrudeGeometry = class _ExtrudeGeometry extends BufferGeometry { + /** + * Constructs a new extrude geometry. + * + * @param {Shape|Array} [shapes] - A shape or an array of shapes. + * @param {ExtrudeGeometry~Options} [options] - The extrude settings. + */ + constructor(shapes = new Shape([new Vector2(0.5, 0.5), new Vector2(-0.5, 0.5), new Vector2(-0.5, -0.5), new Vector2(0.5, -0.5)]), options = {}) { + super(); + this.type = "ExtrudeGeometry"; + this.parameters = { + shapes, + options + }; + shapes = Array.isArray(shapes) ? shapes : [shapes]; + const scope = this; + const verticesArray = []; + const uvArray = []; + for (let i = 0, l = shapes.length; i < l; i++) { + const shape = shapes[i]; + addShape(shape); + } + this.setAttribute("position", new Float32BufferAttribute(verticesArray, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvArray, 2)); + this.computeVertexNormals(); + function addShape(shape) { + const placeholder = []; + const curveSegments = options.curveSegments !== void 0 ? options.curveSegments : 12; + const steps = options.steps !== void 0 ? options.steps : 1; + const depth = options.depth !== void 0 ? options.depth : 1; + let bevelEnabled = options.bevelEnabled !== void 0 ? options.bevelEnabled : true; + let bevelThickness = options.bevelThickness !== void 0 ? options.bevelThickness : 0.2; + let bevelSize = options.bevelSize !== void 0 ? options.bevelSize : bevelThickness - 0.1; + let bevelOffset = options.bevelOffset !== void 0 ? options.bevelOffset : 0; + let bevelSegments = options.bevelSegments !== void 0 ? options.bevelSegments : 3; + const extrudePath = options.extrudePath; + const uvgen = options.UVGenerator !== void 0 ? options.UVGenerator : WorldUVGenerator; + let extrudePts, extrudeByPath = false; + let splineTube, binormal, normal, position2; + if (extrudePath) { + extrudePts = extrudePath.getSpacedPoints(steps); + extrudeByPath = true; + bevelEnabled = false; + const isClosed = extrudePath.isCatmullRomCurve3 ? extrudePath.closed : false; + splineTube = extrudePath.computeFrenetFrames(steps, isClosed); + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + } + if (!bevelEnabled) { + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + bevelOffset = 0; + } + const shapePoints = shape.extractPoints(curveSegments); + let vertices = shapePoints.shape; + const holes = shapePoints.holes; + const reverse = !ShapeUtils.isClockWise(vertices); + if (reverse) { + vertices = vertices.reverse(); + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + if (ShapeUtils.isClockWise(ahole)) { + holes[h] = ahole.reverse(); + } + } + } + function mergeOverlappingPoints(points) { + const THRESHOLD = 1e-10; + const THRESHOLD_SQ = THRESHOLD * THRESHOLD; + let prevPos = points[0]; + for (let i = 1; i <= points.length; i++) { + const currentIndex = i % points.length; + const currentPos = points[currentIndex]; + const dx = currentPos.x - prevPos.x; + const dy = currentPos.y - prevPos.y; + const distSq = dx * dx + dy * dy; + const scalingFactorSqrt = Math.max( + Math.abs(currentPos.x), + Math.abs(currentPos.y), + Math.abs(prevPos.x), + Math.abs(prevPos.y) + ); + const thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt; + if (distSq <= thresholdSqScaled) { + points.splice(currentIndex, 1); + i--; + continue; + } + prevPos = currentPos; + } + } + mergeOverlappingPoints(vertices); + holes.forEach(mergeOverlappingPoints); + const numHoles = holes.length; + const contour = vertices; + for (let h = 0; h < numHoles; h++) { + const ahole = holes[h]; + vertices = vertices.concat(ahole); + } + function scalePt2(pt, vec, size) { + if (!vec) error("ExtrudeGeometry: vec does not exist"); + return pt.clone().addScaledVector(vec, size); + } + const vlen = vertices.length; + function getBevelVec(inPt, inPrev, inNext) { + let v_trans_x, v_trans_y, shrink_by; + const v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; + const v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; + const v_prev_lensq = v_prev_x * v_prev_x + v_prev_y * v_prev_y; + const collinear0 = v_prev_x * v_next_y - v_prev_y * v_next_x; + if (Math.abs(collinear0) > Number.EPSILON) { + const v_prev_len = Math.sqrt(v_prev_lensq); + const v_next_len = Math.sqrt(v_next_x * v_next_x + v_next_y * v_next_y); + const ptPrevShift_x = inPrev.x - v_prev_y / v_prev_len; + const ptPrevShift_y = inPrev.y + v_prev_x / v_prev_len; + const ptNextShift_x = inNext.x - v_next_y / v_next_len; + const ptNextShift_y = inNext.y + v_next_x / v_next_len; + const sf = ((ptNextShift_x - ptPrevShift_x) * v_next_y - (ptNextShift_y - ptPrevShift_y) * v_next_x) / (v_prev_x * v_next_y - v_prev_y * v_next_x); + v_trans_x = ptPrevShift_x + v_prev_x * sf - inPt.x; + v_trans_y = ptPrevShift_y + v_prev_y * sf - inPt.y; + const v_trans_lensq = v_trans_x * v_trans_x + v_trans_y * v_trans_y; + if (v_trans_lensq <= 2) { + return new Vector2(v_trans_x, v_trans_y); + } else { + shrink_by = Math.sqrt(v_trans_lensq / 2); + } + } else { + let direction_eq = false; + if (v_prev_x > Number.EPSILON) { + if (v_next_x > Number.EPSILON) { + direction_eq = true; + } + } else { + if (v_prev_x < -Number.EPSILON) { + if (v_next_x < -Number.EPSILON) { + direction_eq = true; + } + } else { + if (Math.sign(v_prev_y) === Math.sign(v_next_y)) { + direction_eq = true; + } + } + } + if (direction_eq) { + v_trans_x = -v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt(v_prev_lensq); + } else { + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt(v_prev_lensq / 2); + } + } + return new Vector2(v_trans_x / shrink_by, v_trans_y / shrink_by); + } + const contourMovements = []; + for (let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) { + if (j === il) j = 0; + if (k === il) k = 0; + contourMovements[i] = getBevelVec(contour[i], contour[j], contour[k]); + } + const holesMovements = []; + let oneHoleMovements, verticesMovements = contourMovements.concat(); + for (let h = 0, hl = numHoles; h < hl; h++) { + const ahole = holes[h]; + oneHoleMovements = []; + for (let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) { + if (j === il) j = 0; + if (k === il) k = 0; + oneHoleMovements[i] = getBevelVec(ahole[i], ahole[j], ahole[k]); + } + holesMovements.push(oneHoleMovements); + verticesMovements = verticesMovements.concat(oneHoleMovements); + } + let faces; + if (bevelSegments === 0) { + faces = ShapeUtils.triangulateShape(contour, holes); + } else { + const contractedContourVertices = []; + const expandedHoleVertices = []; + for (let b = 0; b < bevelSegments; b++) { + const t = b / bevelSegments; + const z = bevelThickness * Math.cos(t * Math.PI / 2); + const bs2 = bevelSize * Math.sin(t * Math.PI / 2) + bevelOffset; + for (let i = 0, il = contour.length; i < il; i++) { + const vert = scalePt2(contour[i], contourMovements[i], bs2); + v(vert.x, vert.y, -z); + if (t === 0) contractedContourVertices.push(vert); + } + for (let h = 0, hl = numHoles; h < hl; h++) { + const ahole = holes[h]; + oneHoleMovements = holesMovements[h]; + const oneHoleVertices = []; + for (let i = 0, il = ahole.length; i < il; i++) { + const vert = scalePt2(ahole[i], oneHoleMovements[i], bs2); + v(vert.x, vert.y, -z); + if (t === 0) oneHoleVertices.push(vert); + } + if (t === 0) expandedHoleVertices.push(oneHoleVertices); + } + } + faces = ShapeUtils.triangulateShape(contractedContourVertices, expandedHoleVertices); + } + const flen = faces.length; + const bs = bevelSize + bevelOffset; + for (let i = 0; i < vlen; i++) { + const vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i]; + if (!extrudeByPath) { + v(vert.x, vert.y, 0); + } else { + normal.copy(splineTube.normals[0]).multiplyScalar(vert.x); + binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y); + position2.copy(extrudePts[0]).add(normal).add(binormal); + v(position2.x, position2.y, position2.z); + } + } + for (let s = 1; s <= steps; s++) { + for (let i = 0; i < vlen; i++) { + const vert = bevelEnabled ? scalePt2(vertices[i], verticesMovements[i], bs) : vertices[i]; + if (!extrudeByPath) { + v(vert.x, vert.y, depth / steps * s); + } else { + normal.copy(splineTube.normals[s]).multiplyScalar(vert.x); + binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y); + position2.copy(extrudePts[s]).add(normal).add(binormal); + v(position2.x, position2.y, position2.z); + } + } + } + for (let b = bevelSegments - 1; b >= 0; b--) { + const t = b / bevelSegments; + const z = bevelThickness * Math.cos(t * Math.PI / 2); + const bs2 = bevelSize * Math.sin(t * Math.PI / 2) + bevelOffset; + for (let i = 0, il = contour.length; i < il; i++) { + const vert = scalePt2(contour[i], contourMovements[i], bs2); + v(vert.x, vert.y, depth + z); + } + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + oneHoleMovements = holesMovements[h]; + for (let i = 0, il = ahole.length; i < il; i++) { + const vert = scalePt2(ahole[i], oneHoleMovements[i], bs2); + if (!extrudeByPath) { + v(vert.x, vert.y, depth + z); + } else { + v(vert.x, vert.y + extrudePts[steps - 1].y, extrudePts[steps - 1].x + z); + } + } + } + } + buildLidFaces(); + buildSideFaces(); + function buildLidFaces() { + const start = verticesArray.length / 3; + if (bevelEnabled) { + let layer = 0; + let offset = vlen * layer; + for (let i = 0; i < flen; i++) { + const face = faces[i]; + f3(face[2] + offset, face[1] + offset, face[0] + offset); + } + layer = steps + bevelSegments * 2; + offset = vlen * layer; + for (let i = 0; i < flen; i++) { + const face = faces[i]; + f3(face[0] + offset, face[1] + offset, face[2] + offset); + } + } else { + for (let i = 0; i < flen; i++) { + const face = faces[i]; + f3(face[2], face[1], face[0]); + } + for (let i = 0; i < flen; i++) { + const face = faces[i]; + f3(face[0] + vlen * steps, face[1] + vlen * steps, face[2] + vlen * steps); + } + } + scope.addGroup(start, verticesArray.length / 3 - start, 0); + } + function buildSideFaces() { + const start = verticesArray.length / 3; + let layeroffset = 0; + sidewalls(contour, layeroffset); + layeroffset += contour.length; + for (let h = 0, hl = holes.length; h < hl; h++) { + const ahole = holes[h]; + sidewalls(ahole, layeroffset); + layeroffset += ahole.length; + } + scope.addGroup(start, verticesArray.length / 3 - start, 1); + } + function sidewalls(contour2, layeroffset) { + let i = contour2.length; + while (--i >= 0) { + const j = i; + let k = i - 1; + if (k < 0) k = contour2.length - 1; + for (let s = 0, sl = steps + bevelSegments * 2; s < sl; s++) { + const slen1 = vlen * s; + const slen2 = vlen * (s + 1); + const a = layeroffset + j + slen1, b = layeroffset + k + slen1, c = layeroffset + k + slen2, d = layeroffset + j + slen2; + f4(a, b, c, d); + } + } + } + function v(x, y, z) { + placeholder.push(x); + placeholder.push(y); + placeholder.push(z); + } + function f3(a, b, c) { + addVertex(a); + addVertex(b); + addVertex(c); + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateTopUV(scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1); + addUV(uvs[0]); + addUV(uvs[1]); + addUV(uvs[2]); + } + function f4(a, b, c, d) { + addVertex(a); + addVertex(b); + addVertex(d); + addVertex(b); + addVertex(c); + addVertex(d); + const nextIndex = verticesArray.length / 3; + const uvs = uvgen.generateSideWallUV(scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1); + addUV(uvs[0]); + addUV(uvs[1]); + addUV(uvs[3]); + addUV(uvs[1]); + addUV(uvs[2]); + addUV(uvs[3]); + } + function addVertex(index) { + verticesArray.push(placeholder[index * 3 + 0]); + verticesArray.push(placeholder[index * 3 + 1]); + verticesArray.push(placeholder[index * 3 + 2]); + } + function addUV(vector2) { + uvArray.push(vector2.x); + uvArray.push(vector2.y); + } + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + toJSON() { + const data = super.toJSON(); + const shapes = this.parameters.shapes; + const options = this.parameters.options; + return toJSON$1(shapes, options, data); + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @param {Array} shapes - An array of shapes. + * @return {ExtrudeGeometry} A new instance. + */ + static fromJSON(data, shapes) { + const geometryShapes = []; + for (let j = 0, jl = data.shapes.length; j < jl; j++) { + const shape = shapes[data.shapes[j]]; + geometryShapes.push(shape); + } + const extrudePath = data.options.extrudePath; + if (extrudePath !== void 0) { + data.options.extrudePath = new Curves[extrudePath.type]().fromJSON(extrudePath); + } + return new _ExtrudeGeometry(geometryShapes, data.options); + } +}; +var WorldUVGenerator = { + generateTopUV: function(geometry, vertices, indexA, indexB, indexC) { + const a_x = vertices[indexA * 3]; + const a_y = vertices[indexA * 3 + 1]; + const b_x = vertices[indexB * 3]; + const b_y = vertices[indexB * 3 + 1]; + const c_x = vertices[indexC * 3]; + const c_y = vertices[indexC * 3 + 1]; + return [ + new Vector2(a_x, a_y), + new Vector2(b_x, b_y), + new Vector2(c_x, c_y) + ]; + }, + generateSideWallUV: function(geometry, vertices, indexA, indexB, indexC, indexD) { + const a_x = vertices[indexA * 3]; + const a_y = vertices[indexA * 3 + 1]; + const a_z = vertices[indexA * 3 + 2]; + const b_x = vertices[indexB * 3]; + const b_y = vertices[indexB * 3 + 1]; + const b_z = vertices[indexB * 3 + 2]; + const c_x = vertices[indexC * 3]; + const c_y = vertices[indexC * 3 + 1]; + const c_z = vertices[indexC * 3 + 2]; + const d_x = vertices[indexD * 3]; + const d_y = vertices[indexD * 3 + 1]; + const d_z = vertices[indexD * 3 + 2]; + if (Math.abs(a_y - b_y) < Math.abs(a_x - b_x)) { + return [ + new Vector2(a_x, 1 - a_z), + new Vector2(b_x, 1 - b_z), + new Vector2(c_x, 1 - c_z), + new Vector2(d_x, 1 - d_z) + ]; + } else { + return [ + new Vector2(a_y, 1 - a_z), + new Vector2(b_y, 1 - b_z), + new Vector2(c_y, 1 - c_z), + new Vector2(d_y, 1 - d_z) + ]; + } + } +}; +function toJSON$1(shapes, options, data) { + data.shapes = []; + if (Array.isArray(shapes)) { + for (let i = 0, l = shapes.length; i < l; i++) { + const shape = shapes[i]; + data.shapes.push(shape.uuid); + } + } else { + data.shapes.push(shapes.uuid); + } + data.options = Object.assign({}, options); + if (options.extrudePath !== void 0) data.options.extrudePath = options.extrudePath.toJSON(); + return data; +} +var IcosahedronGeometry = class _IcosahedronGeometry extends PolyhedronGeometry { + /** + * Constructs a new icosahedron geometry. + * + * @param {number} [radius=1] - Radius of the icosahedron. + * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron. + */ + constructor(radius = 1, detail = 0) { + const t = (1 + Math.sqrt(5)) / 2; + const vertices = [ + -1, + t, + 0, + 1, + t, + 0, + -1, + -t, + 0, + 1, + -t, + 0, + 0, + -1, + t, + 0, + 1, + t, + 0, + -1, + -t, + 0, + 1, + -t, + t, + 0, + -1, + t, + 0, + 1, + -t, + 0, + -1, + -t, + 0, + 1 + ]; + const indices = [ + 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 + ]; + super(vertices, indices, radius, detail); + this.type = "IcosahedronGeometry"; + this.parameters = { + radius, + detail + }; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {IcosahedronGeometry} A new instance. + */ + static fromJSON(data) { + return new _IcosahedronGeometry(data.radius, data.detail); + } +}; +var LatheGeometry = class _LatheGeometry extends BufferGeometry { + /** + * Constructs a new lathe geometry. + * + * @param {Array} [points] - An array of points in 2D space. The x-coordinate of each point + * must be greater than zero. + * @param {number} [segments=12] - The number of circumference segments to generate. + * @param {number} [phiStart=0] - The starting angle in radians. + * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a + * closed lathe, less than 2PI is a portion. + */ + constructor(points = [new Vector2(0, -0.5), new Vector2(0.5, 0), new Vector2(0, 0.5)], segments = 12, phiStart = 0, phiLength = Math.PI * 2) { + super(); + this.type = "LatheGeometry"; + this.parameters = { + points, + segments, + phiStart, + phiLength + }; + segments = Math.floor(segments); + phiLength = clamp(phiLength, 0, Math.PI * 2); + const indices = []; + const vertices = []; + const uvs = []; + const initNormals = []; + const normals = []; + const inverseSegments = 1 / segments; + const vertex2 = new Vector3(); + const uv = new Vector2(); + const normal = new Vector3(); + const curNormal = new Vector3(); + const prevNormal = new Vector3(); + let dx = 0; + let dy = 0; + for (let j = 0; j <= points.length - 1; j++) { + switch (j) { + case 0: + dx = points[j + 1].x - points[j].x; + dy = points[j + 1].y - points[j].y; + normal.x = dy * 1; + normal.y = -dx; + normal.z = dy * 0; + prevNormal.copy(normal); + normal.normalize(); + initNormals.push(normal.x, normal.y, normal.z); + break; + case points.length - 1: + initNormals.push(prevNormal.x, prevNormal.y, prevNormal.z); + break; + default: + dx = points[j + 1].x - points[j].x; + dy = points[j + 1].y - points[j].y; + normal.x = dy * 1; + normal.y = -dx; + normal.z = dy * 0; + curNormal.copy(normal); + normal.x += prevNormal.x; + normal.y += prevNormal.y; + normal.z += prevNormal.z; + normal.normalize(); + initNormals.push(normal.x, normal.y, normal.z); + prevNormal.copy(curNormal); + } + } + for (let i = 0; i <= segments; i++) { + const phi = phiStart + i * inverseSegments * phiLength; + const sin = Math.sin(phi); + const cos = Math.cos(phi); + for (let j = 0; j <= points.length - 1; j++) { + vertex2.x = points[j].x * sin; + vertex2.y = points[j].y; + vertex2.z = points[j].x * cos; + vertices.push(vertex2.x, vertex2.y, vertex2.z); + uv.x = i / segments; + uv.y = j / (points.length - 1); + uvs.push(uv.x, uv.y); + const x = initNormals[3 * j + 0] * sin; + const y = initNormals[3 * j + 1]; + const z = initNormals[3 * j + 0] * cos; + normals.push(x, y, z); + } + } + for (let i = 0; i < segments; i++) { + for (let j = 0; j < points.length - 1; j++) { + const base = j + i * points.length; + const a = base; + const b = base + points.length; + const c = base + points.length + 1; + const d = base + 1; + indices.push(a, b, d); + indices.push(c, d, b); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {LatheGeometry} A new instance. + */ + static fromJSON(data) { + return new _LatheGeometry(data.points, data.segments, data.phiStart, data.phiLength); + } +}; +var OctahedronGeometry = class _OctahedronGeometry extends PolyhedronGeometry { + /** + * Constructs a new octahedron geometry. + * + * @param {number} [radius=1] - Radius of the octahedron. + * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron. + */ + constructor(radius = 1, detail = 0) { + const vertices = [ + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 1, + 0, + 0, + -1 + ]; + const indices = [ + 0, + 2, + 4, + 0, + 4, + 3, + 0, + 3, + 5, + 0, + 5, + 2, + 1, + 2, + 5, + 1, + 5, + 3, + 1, + 3, + 4, + 1, + 4, + 2 + ]; + super(vertices, indices, radius, detail); + this.type = "OctahedronGeometry"; + this.parameters = { + radius, + detail + }; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {OctahedronGeometry} A new instance. + */ + static fromJSON(data) { + return new _OctahedronGeometry(data.radius, data.detail); + } +}; +var PlaneGeometry = class _PlaneGeometry extends BufferGeometry { + /** + * Constructs a new plane geometry. + * + * @param {number} [width=1] - The width along the X axis. + * @param {number} [height=1] - The height along the Y axis + * @param {number} [widthSegments=1] - The number of segments along the X axis. + * @param {number} [heightSegments=1] - The number of segments along the Y axis. + */ + constructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) { + super(); + this.type = "PlaneGeometry"; + this.parameters = { + width, + height, + widthSegments, + heightSegments + }; + const width_half = width / 2; + const height_half = height / 2; + const gridX = Math.floor(widthSegments); + const gridY = Math.floor(heightSegments); + const gridX1 = gridX + 1; + const gridY1 = gridY + 1; + const segment_width = width / gridX; + const segment_height = height / gridY; + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + for (let iy = 0; iy < gridY1; iy++) { + const y = iy * segment_height - height_half; + for (let ix = 0; ix < gridX1; ix++) { + const x = ix * segment_width - width_half; + vertices.push(x, -y, 0); + normals.push(0, 0, 1); + uvs.push(ix / gridX); + uvs.push(1 - iy / gridY); + } + } + for (let iy = 0; iy < gridY; iy++) { + for (let ix = 0; ix < gridX; ix++) { + const a = ix + gridX1 * iy; + const b = ix + gridX1 * (iy + 1); + const c = ix + 1 + gridX1 * (iy + 1); + const d = ix + 1 + gridX1 * iy; + indices.push(a, b, d); + indices.push(b, c, d); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {PlaneGeometry} A new instance. + */ + static fromJSON(data) { + return new _PlaneGeometry(data.width, data.height, data.widthSegments, data.heightSegments); + } +}; +var RingGeometry = class _RingGeometry extends BufferGeometry { + /** + * Constructs a new ring geometry. + * + * @param {number} [innerRadius=0.5] - The inner radius of the ring. + * @param {number} [outerRadius=1] - The outer radius of the ring. + * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`. + * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`. + * @param {number} [thetaStart=0] - Starting angle in radians. + * @param {number} [thetaLength=Math.PI*2] - Central angle in radians. + */ + constructor(innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2) { + super(); + this.type = "RingGeometry"; + this.parameters = { + innerRadius, + outerRadius, + thetaSegments, + phiSegments, + thetaStart, + thetaLength + }; + thetaSegments = Math.max(3, thetaSegments); + phiSegments = Math.max(1, phiSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + let radius = innerRadius; + const radiusStep = (outerRadius - innerRadius) / phiSegments; + const vertex2 = new Vector3(); + const uv = new Vector2(); + for (let j = 0; j <= phiSegments; j++) { + for (let i = 0; i <= thetaSegments; i++) { + const segment = thetaStart + i / thetaSegments * thetaLength; + vertex2.x = radius * Math.cos(segment); + vertex2.y = radius * Math.sin(segment); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normals.push(0, 0, 1); + uv.x = (vertex2.x / outerRadius + 1) / 2; + uv.y = (vertex2.y / outerRadius + 1) / 2; + uvs.push(uv.x, uv.y); + } + radius += radiusStep; + } + for (let j = 0; j < phiSegments; j++) { + const thetaSegmentLevel = j * (thetaSegments + 1); + for (let i = 0; i < thetaSegments; i++) { + const segment = i + thetaSegmentLevel; + const a = segment; + const b = segment + thetaSegments + 1; + const c = segment + thetaSegments + 2; + const d = segment + 1; + indices.push(a, b, d); + indices.push(b, c, d); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {RingGeometry} A new instance. + */ + static fromJSON(data) { + return new _RingGeometry(data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength); + } +}; +var ShapeGeometry = class _ShapeGeometry extends BufferGeometry { + /** + * Constructs a new shape geometry. + * + * @param {Shape|Array} [shapes] - A shape or an array of shapes. + * @param {number} [curveSegments=12] - Number of segments per shape. + */ + constructor(shapes = new Shape([new Vector2(0, 0.5), new Vector2(-0.5, -0.5), new Vector2(0.5, -0.5)]), curveSegments = 12) { + super(); + this.type = "ShapeGeometry"; + this.parameters = { + shapes, + curveSegments + }; + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + let groupStart = 0; + let groupCount = 0; + if (Array.isArray(shapes) === false) { + addShape(shapes); + } else { + for (let i = 0; i < shapes.length; i++) { + addShape(shapes[i]); + this.addGroup(groupStart, groupCount, i); + groupStart += groupCount; + groupCount = 0; + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function addShape(shape) { + const indexOffset = vertices.length / 3; + const points = shape.extractPoints(curveSegments); + let shapeVertices = points.shape; + const shapeHoles = points.holes; + if (ShapeUtils.isClockWise(shapeVertices) === false) { + shapeVertices = shapeVertices.reverse(); + } + for (let i = 0, l = shapeHoles.length; i < l; i++) { + const shapeHole = shapeHoles[i]; + if (ShapeUtils.isClockWise(shapeHole) === true) { + shapeHoles[i] = shapeHole.reverse(); + } + } + const faces = ShapeUtils.triangulateShape(shapeVertices, shapeHoles); + for (let i = 0, l = shapeHoles.length; i < l; i++) { + const shapeHole = shapeHoles[i]; + shapeVertices = shapeVertices.concat(shapeHole); + } + for (let i = 0, l = shapeVertices.length; i < l; i++) { + const vertex2 = shapeVertices[i]; + vertices.push(vertex2.x, vertex2.y, 0); + normals.push(0, 0, 1); + uvs.push(vertex2.x, vertex2.y); + } + for (let i = 0, l = faces.length; i < l; i++) { + const face = faces[i]; + const a = face[0] + indexOffset; + const b = face[1] + indexOffset; + const c = face[2] + indexOffset; + indices.push(a, b, c); + groupCount += 3; + } + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + toJSON() { + const data = super.toJSON(); + const shapes = this.parameters.shapes; + return toJSON(shapes, data); + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @param {Array} shapes - An array of shapes. + * @return {ShapeGeometry} A new instance. + */ + static fromJSON(data, shapes) { + const geometryShapes = []; + for (let j = 0, jl = data.shapes.length; j < jl; j++) { + const shape = shapes[data.shapes[j]]; + geometryShapes.push(shape); + } + return new _ShapeGeometry(geometryShapes, data.curveSegments); + } +}; +function toJSON(shapes, data) { + data.shapes = []; + if (Array.isArray(shapes)) { + for (let i = 0, l = shapes.length; i < l; i++) { + const shape = shapes[i]; + data.shapes.push(shape.uuid); + } + } else { + data.shapes.push(shapes.uuid); + } + return data; +} +var SphereGeometry = class _SphereGeometry extends BufferGeometry { + /** + * Constructs a new sphere geometry. + * + * @param {number} [radius=1] - The sphere radius. + * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`. + * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`. + * @param {number} [phiStart=0] - The horizontal starting angle in radians. + * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size. + * @param {number} [thetaStart=0] - The vertical starting angle in radians. + * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size. + */ + constructor(radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI) { + super(); + this.type = "SphereGeometry"; + this.parameters = { + radius, + widthSegments, + heightSegments, + phiStart, + phiLength, + thetaStart, + thetaLength + }; + widthSegments = Math.max(3, Math.floor(widthSegments)); + heightSegments = Math.max(2, Math.floor(heightSegments)); + const thetaEnd = Math.min(thetaStart + thetaLength, Math.PI); + let index = 0; + const grid = []; + const vertex2 = new Vector3(); + const normal = new Vector3(); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + for (let iy = 0; iy <= heightSegments; iy++) { + const verticesRow = []; + const v = iy / heightSegments; + let uOffset = 0; + if (iy === 0 && thetaStart === 0) { + uOffset = 0.5 / widthSegments; + } else if (iy === heightSegments && thetaEnd === Math.PI) { + uOffset = -0.5 / widthSegments; + } + for (let ix = 0; ix <= widthSegments; ix++) { + const u = ix / widthSegments; + vertex2.x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); + vertex2.y = radius * Math.cos(thetaStart + v * thetaLength); + vertex2.z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normal.copy(vertex2).normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(u + uOffset, 1 - v); + verticesRow.push(index++); + } + grid.push(verticesRow); + } + for (let iy = 0; iy < heightSegments; iy++) { + for (let ix = 0; ix < widthSegments; ix++) { + const a = grid[iy][ix + 1]; + const b = grid[iy][ix]; + const c = grid[iy + 1][ix]; + const d = grid[iy + 1][ix + 1]; + if (iy !== 0 || thetaStart > 0) indices.push(a, b, d); + if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {SphereGeometry} A new instance. + */ + static fromJSON(data) { + return new _SphereGeometry(data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength); + } +}; +var TetrahedronGeometry = class _TetrahedronGeometry extends PolyhedronGeometry { + /** + * Constructs a new tetrahedron geometry. + * + * @param {number} [radius=1] - Radius of the tetrahedron. + * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron. + */ + constructor(radius = 1, detail = 0) { + const vertices = [ + 1, + 1, + 1, + -1, + -1, + 1, + -1, + 1, + -1, + 1, + -1, + -1 + ]; + const indices = [ + 2, + 1, + 0, + 0, + 3, + 2, + 1, + 3, + 0, + 2, + 3, + 1 + ]; + super(vertices, indices, radius, detail); + this.type = "TetrahedronGeometry"; + this.parameters = { + radius, + detail + }; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {TetrahedronGeometry} A new instance. + */ + static fromJSON(data) { + return new _TetrahedronGeometry(data.radius, data.detail); + } +}; +var TorusGeometry = class _TorusGeometry extends BufferGeometry { + /** + * Constructs a new torus geometry. + * + * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube. + * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`. + * @param {number} [radialSegments=12] - The number of radial segments. + * @param {number} [tubularSegments=48] - The number of tubular segments. + * @param {number} [arc=Math.PI*2] - Central angle in radians. + */ + constructor(radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2) { + super(); + this.type = "TorusGeometry"; + this.parameters = { + radius, + tube, + radialSegments, + tubularSegments, + arc + }; + radialSegments = Math.floor(radialSegments); + tubularSegments = Math.floor(tubularSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + const center = new Vector3(); + const vertex2 = new Vector3(); + const normal = new Vector3(); + for (let j = 0; j <= radialSegments; j++) { + for (let i = 0; i <= tubularSegments; i++) { + const u = i / tubularSegments * arc; + const v = j / radialSegments * Math.PI * 2; + vertex2.x = (radius + tube * Math.cos(v)) * Math.cos(u); + vertex2.y = (radius + tube * Math.cos(v)) * Math.sin(u); + vertex2.z = tube * Math.sin(v); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + center.x = radius * Math.cos(u); + center.y = radius * Math.sin(u); + normal.subVectors(vertex2, center).normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(i / tubularSegments); + uvs.push(j / radialSegments); + } + } + for (let j = 1; j <= radialSegments; j++) { + for (let i = 1; i <= tubularSegments; i++) { + const a = (tubularSegments + 1) * j + i - 1; + const b = (tubularSegments + 1) * (j - 1) + i - 1; + const c = (tubularSegments + 1) * (j - 1) + i; + const d = (tubularSegments + 1) * j + i; + indices.push(a, b, d); + indices.push(b, c, d); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {TorusGeometry} A new instance. + */ + static fromJSON(data) { + return new _TorusGeometry(data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc); + } +}; +var TorusKnotGeometry = class _TorusKnotGeometry extends BufferGeometry { + /** + * Constructs a new torus knot geometry. + * + * @param {number} [radius=1] - Radius of the torus knot. + * @param {number} [tube=0.4] - Radius of the tube. + * @param {number} [tubularSegments=64] - The number of tubular segments. + * @param {number} [radialSegments=8] - The number of radial segments. + * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry. + * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus. + */ + constructor(radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3) { + super(); + this.type = "TorusKnotGeometry"; + this.parameters = { + radius, + tube, + tubularSegments, + radialSegments, + p, + q + }; + tubularSegments = Math.floor(tubularSegments); + radialSegments = Math.floor(radialSegments); + const indices = []; + const vertices = []; + const normals = []; + const uvs = []; + const vertex2 = new Vector3(); + const normal = new Vector3(); + const P1 = new Vector3(); + const P2 = new Vector3(); + const B = new Vector3(); + const T = new Vector3(); + const N = new Vector3(); + for (let i = 0; i <= tubularSegments; ++i) { + const u = i / tubularSegments * p * Math.PI * 2; + calculatePositionOnCurve(u, p, q, radius, P1); + calculatePositionOnCurve(u + 0.01, p, q, radius, P2); + T.subVectors(P2, P1); + N.addVectors(P2, P1); + B.crossVectors(T, N); + N.crossVectors(B, T); + B.normalize(); + N.normalize(); + for (let j = 0; j <= radialSegments; ++j) { + const v = j / radialSegments * Math.PI * 2; + const cx = -tube * Math.cos(v); + const cy = tube * Math.sin(v); + vertex2.x = P1.x + (cx * N.x + cy * B.x); + vertex2.y = P1.y + (cx * N.y + cy * B.y); + vertex2.z = P1.z + (cx * N.z + cy * B.z); + vertices.push(vertex2.x, vertex2.y, vertex2.z); + normal.subVectors(vertex2, P1).normalize(); + normals.push(normal.x, normal.y, normal.z); + uvs.push(i / tubularSegments); + uvs.push(j / radialSegments); + } + } + for (let j = 1; j <= tubularSegments; j++) { + for (let i = 1; i <= radialSegments; i++) { + const a = (radialSegments + 1) * (j - 1) + (i - 1); + const b = (radialSegments + 1) * j + (i - 1); + const c = (radialSegments + 1) * j + i; + const d = (radialSegments + 1) * (j - 1) + i; + indices.push(a, b, d); + indices.push(b, c, d); + } + } + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function calculatePositionOnCurve(u, p2, q2, radius2, position) { + const cu = Math.cos(u); + const su = Math.sin(u); + const quOverP = q2 / p2 * u; + const cs = Math.cos(quOverP); + position.x = radius2 * (2 + cs) * 0.5 * cu; + position.y = radius2 * (2 + cs) * su * 0.5; + position.z = radius2 * Math.sin(quOverP) * 0.5; + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {TorusKnotGeometry} A new instance. + */ + static fromJSON(data) { + return new _TorusKnotGeometry(data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q); + } +}; +var TubeGeometry = class _TubeGeometry extends BufferGeometry { + /** + * Constructs a new tube geometry. + * + * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube. + * @param {number} [tubularSegments=64] - The number of segments that make up the tube. + * @param {number} [radius=1] -The radius of the tube. + * @param {number} [radialSegments=8] - The number of segments that make up the cross-section. + * @param {boolean} [closed=false] - Whether the tube is closed or not. + */ + constructor(path = new QuadraticBezierCurve3(new Vector3(-1, -1, 0), new Vector3(-1, 1, 0), new Vector3(1, 1, 0)), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false) { + super(); + this.type = "TubeGeometry"; + this.parameters = { + path, + tubularSegments, + radius, + radialSegments, + closed + }; + const frames = path.computeFrenetFrames(tubularSegments, closed); + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + const vertex2 = new Vector3(); + const normal = new Vector3(); + const uv = new Vector2(); + let P = new Vector3(); + const vertices = []; + const normals = []; + const uvs = []; + const indices = []; + generateBufferData(); + this.setIndex(indices); + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + this.setAttribute("normal", new Float32BufferAttribute(normals, 3)); + this.setAttribute("uv", new Float32BufferAttribute(uvs, 2)); + function generateBufferData() { + for (let i = 0; i < tubularSegments; i++) { + generateSegment(i); + } + generateSegment(closed === false ? tubularSegments : 0); + generateUVs(); + generateIndices(); + } + function generateSegment(i) { + P = path.getPointAt(i / tubularSegments, P); + const N = frames.normals[i]; + const B = frames.binormals[i]; + for (let j = 0; j <= radialSegments; j++) { + const v = j / radialSegments * Math.PI * 2; + const sin = Math.sin(v); + const cos = -Math.cos(v); + normal.x = cos * N.x + sin * B.x; + normal.y = cos * N.y + sin * B.y; + normal.z = cos * N.z + sin * B.z; + normal.normalize(); + normals.push(normal.x, normal.y, normal.z); + vertex2.x = P.x + radius * normal.x; + vertex2.y = P.y + radius * normal.y; + vertex2.z = P.z + radius * normal.z; + vertices.push(vertex2.x, vertex2.y, vertex2.z); + } + } + function generateIndices() { + for (let j = 1; j <= tubularSegments; j++) { + for (let i = 1; i <= radialSegments; i++) { + const a = (radialSegments + 1) * (j - 1) + (i - 1); + const b = (radialSegments + 1) * j + (i - 1); + const c = (radialSegments + 1) * j + i; + const d = (radialSegments + 1) * (j - 1) + i; + indices.push(a, b, d); + indices.push(b, c, d); + } + } + } + function generateUVs() { + for (let i = 0; i <= tubularSegments; i++) { + for (let j = 0; j <= radialSegments; j++) { + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + uvs.push(uv.x, uv.y); + } + } + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } + toJSON() { + const data = super.toJSON(); + data.path = this.parameters.path.toJSON(); + return data; + } + /** + * Factory method for creating an instance of this class from the given + * JSON object. + * + * @param {Object} data - A JSON object representing the serialized geometry. + * @return {TubeGeometry} A new instance. + */ + static fromJSON(data) { + return new _TubeGeometry( + new Curves[data.path.type]().fromJSON(data.path), + data.tubularSegments, + data.radius, + data.radialSegments, + data.closed + ); + } +}; +var WireframeGeometry = class extends BufferGeometry { + /** + * Constructs a new wireframe geometry. + * + * @param {?BufferGeometry} [geometry=null] - The geometry. + */ + constructor(geometry = null) { + super(); + this.type = "WireframeGeometry"; + this.parameters = { + geometry + }; + if (geometry !== null) { + const vertices = []; + const edges = /* @__PURE__ */ new Set(); + const start = new Vector3(); + const end = new Vector3(); + if (geometry.index !== null) { + const position = geometry.attributes.position; + const indices = geometry.index; + let groups = geometry.groups; + if (groups.length === 0) { + groups = [{ start: 0, count: indices.count, materialIndex: 0 }]; + } + for (let o = 0, ol = groups.length; o < ol; ++o) { + const group = groups[o]; + const groupStart = group.start; + const groupCount = group.count; + for (let i = groupStart, l = groupStart + groupCount; i < l; i += 3) { + for (let j = 0; j < 3; j++) { + const index1 = indices.getX(i + j); + const index2 = indices.getX(i + (j + 1) % 3); + start.fromBufferAttribute(position, index1); + end.fromBufferAttribute(position, index2); + if (isUniqueEdge(start, end, edges) === true) { + vertices.push(start.x, start.y, start.z); + vertices.push(end.x, end.y, end.z); + } + } + } + } + } else { + const position = geometry.attributes.position; + for (let i = 0, l = position.count / 3; i < l; i++) { + for (let j = 0; j < 3; j++) { + const index1 = 3 * i + j; + const index2 = 3 * i + (j + 1) % 3; + start.fromBufferAttribute(position, index1); + end.fromBufferAttribute(position, index2); + if (isUniqueEdge(start, end, edges) === true) { + vertices.push(start.x, start.y, start.z); + vertices.push(end.x, end.y, end.z); + } + } + } + } + this.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + } + } + copy(source) { + super.copy(source); + this.parameters = Object.assign({}, source.parameters); + return this; + } +}; +function isUniqueEdge(start, end, edges) { + const hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`; + const hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; + if (edges.has(hash1) === true || edges.has(hash2) === true) { + return false; + } else { + edges.add(hash1); + edges.add(hash2); + return true; + } +} +var Geometries = Object.freeze({ + __proto__: null, + BoxGeometry, + CapsuleGeometry, + CircleGeometry, + ConeGeometry, + CylinderGeometry, + DodecahedronGeometry, + EdgesGeometry, + ExtrudeGeometry, + IcosahedronGeometry, + LatheGeometry, + OctahedronGeometry, + PlaneGeometry, + PolyhedronGeometry, + RingGeometry, + ShapeGeometry, + SphereGeometry, + TetrahedronGeometry, + TorusGeometry, + TorusKnotGeometry, + TubeGeometry, + WireframeGeometry +}); +var ShadowMaterial = class extends Material { + /** + * Constructs a new shadow material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isShadowMaterial = true; + this.type = "ShadowMaterial"; + this.color = new Color(0); + this.transparent = true; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.fog = source.fog; + return this; + } +}; +var RawShaderMaterial = class extends ShaderMaterial { + /** + * Constructs a new raw shader material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(parameters); + this.isRawShaderMaterial = true; + this.type = "RawShaderMaterial"; + } +}; +var MeshStandardMaterial = class extends Material { + /** + * Constructs a new mesh standard material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshStandardMaterial = true; + this.type = "MeshStandardMaterial"; + this.defines = { "STANDARD": "" }; + this.color = new Color(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 Color(0); + this.emissiveIntensity = 1; + this.emissiveMap = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.roughnessMap = null; + this.metalnessMap = null; + this.alphaMap = null; + this.envMap = null; + this.envMapRotation = new Euler(); + this.envMapIntensity = 1; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.flatShading = false; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.defines = { "STANDARD": "" }; + this.color.copy(source.color); + this.roughness = source.roughness; + this.metalness = source.metalness; + this.map = source.map; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.emissive.copy(source.emissive); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.roughnessMap = source.roughnessMap; + this.metalnessMap = source.metalnessMap; + this.alphaMap = source.alphaMap; + this.envMap = source.envMap; + this.envMapRotation.copy(source.envMapRotation); + this.envMapIntensity = source.envMapIntensity; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.flatShading = source.flatShading; + this.fog = source.fog; + return this; + } +}; +var MeshPhysicalMaterial = class extends MeshStandardMaterial { + /** + * Constructs a new mesh physical material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshPhysicalMaterial = true; + this.defines = { + "STANDARD": "", + "PHYSICAL": "" + }; + this.type = "MeshPhysicalMaterial"; + this.anisotropyRotation = 0; + this.anisotropyMap = null; + this.clearcoatMap = null; + this.clearcoatRoughness = 0; + this.clearcoatRoughnessMap = null; + this.clearcoatNormalScale = new Vector2(1, 1); + this.clearcoatNormalMap = null; + this.ior = 1.5; + Object.defineProperty(this, "reflectivity", { + get: function() { + return clamp(2.5 * (this.ior - 1) / (this.ior + 1), 0, 1); + }, + set: function(reflectivity) { + this.ior = (1 + 0.4 * reflectivity) / (1 - 0.4 * reflectivity); + } + }); + this.iridescenceMap = null; + this.iridescenceIOR = 1.3; + this.iridescenceThicknessRange = [100, 400]; + this.iridescenceThicknessMap = null; + this.sheenColor = new Color(0); + this.sheenColorMap = null; + this.sheenRoughness = 1; + this.sheenRoughnessMap = null; + this.transmissionMap = null; + this.thickness = 0; + this.thicknessMap = null; + this.attenuationDistance = Infinity; + this.attenuationColor = new Color(1, 1, 1); + this.specularIntensity = 1; + this.specularIntensityMap = null; + this.specularColor = new Color(1, 1, 1); + this.specularColorMap = null; + this._anisotropy = 0; + this._clearcoat = 0; + this._dispersion = 0; + this._iridescence = 0; + this._sheen = 0; + this._transmission = 0; + this.setValues(parameters); + } + /** + * The anisotropy strength, from `0.0` to `1.0`. + * + * @type {number} + * @default 0 + */ + get anisotropy() { + return this._anisotropy; + } + set anisotropy(value) { + if (this._anisotropy > 0 !== value > 0) { + this.version++; + } + this._anisotropy = value; + } + /** + * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use + * clear coat related properties to enable multilayer materials that have a + * thin translucent layer over the base layer. + * + * @type {number} + * @default 0 + */ + get clearcoat() { + return this._clearcoat; + } + set clearcoat(value) { + if (this._clearcoat > 0 !== value > 0) { + this.version++; + } + this._clearcoat = value; + } + /** + * The intensity of the iridescence layer, simulating RGB color shift based on the angle between + * the surface and the viewer, from `0.0` to `1.0`. + * + * @type {number} + * @default 0 + */ + get iridescence() { + return this._iridescence; + } + set iridescence(value) { + if (this._iridescence > 0 !== value > 0) { + this.version++; + } + this._iridescence = value; + } + /** + * Defines the strength of the angular separation of colors (chromatic aberration) transmitting + * through a relatively clear volume. Any value zero or larger is valid, the typical range of + * realistic values is `[0, 1]`. This property can be only be used with transmissive objects. + * + * @type {number} + * @default 0 + */ + get dispersion() { + return this._dispersion; + } + set dispersion(value) { + if (this._dispersion > 0 !== value > 0) { + this.version++; + } + this._dispersion = value; + } + /** + * The intensity of the sheen layer, from `0.0` to `1.0`. + * + * @type {number} + * @default 0 + */ + get sheen() { + return this._sheen; + } + set sheen(value) { + if (this._sheen > 0 !== value > 0) { + this.version++; + } + this._sheen = value; + } + /** + * Degree of transmission (or optical transparency), from `0.0` to `1.0`. + * + * Thin, transparent or semitransparent, plastic or glass materials remain + * largely reflective even if they are fully transmissive. The transmission + * property can be used to model these materials. + * + * When transmission is non-zero, `opacity` should be set to `1`. + * + * @type {number} + * @default 0 + */ + get transmission() { + return this._transmission; + } + set transmission(value) { + if (this._transmission > 0 !== value > 0) { + this.version++; + } + this._transmission = value; + } + copy(source) { + super.copy(source); + this.defines = { + "STANDARD": "", + "PHYSICAL": "" + }; + this.anisotropy = source.anisotropy; + this.anisotropyRotation = source.anisotropyRotation; + this.anisotropyMap = source.anisotropyMap; + this.clearcoat = source.clearcoat; + this.clearcoatMap = source.clearcoatMap; + this.clearcoatRoughness = source.clearcoatRoughness; + this.clearcoatRoughnessMap = source.clearcoatRoughnessMap; + this.clearcoatNormalMap = source.clearcoatNormalMap; + this.clearcoatNormalScale.copy(source.clearcoatNormalScale); + this.dispersion = source.dispersion; + this.ior = source.ior; + this.iridescence = source.iridescence; + this.iridescenceMap = source.iridescenceMap; + this.iridescenceIOR = source.iridescenceIOR; + this.iridescenceThicknessRange = [...source.iridescenceThicknessRange]; + this.iridescenceThicknessMap = source.iridescenceThicknessMap; + this.sheen = source.sheen; + this.sheenColor.copy(source.sheenColor); + this.sheenColorMap = source.sheenColorMap; + this.sheenRoughness = source.sheenRoughness; + this.sheenRoughnessMap = source.sheenRoughnessMap; + this.transmission = source.transmission; + this.transmissionMap = source.transmissionMap; + this.thickness = source.thickness; + this.thicknessMap = source.thicknessMap; + this.attenuationDistance = source.attenuationDistance; + this.attenuationColor.copy(source.attenuationColor); + this.specularIntensity = source.specularIntensity; + this.specularIntensityMap = source.specularIntensityMap; + this.specularColor.copy(source.specularColor); + this.specularColorMap = source.specularColorMap; + return this; + } +}; +var MeshPhongMaterial = class extends Material { + /** + * Constructs a new mesh phong material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshPhongMaterial = true; + this.type = "MeshPhongMaterial"; + this.color = new Color(16777215); + this.specular = new Color(1118481); + this.shininess = 30; + this.map = null; + this.lightMap = null; + this.lightMapIntensity = 1; + this.aoMap = null; + this.aoMapIntensity = 1; + this.emissive = new Color(0); + this.emissiveIntensity = 1; + this.emissiveMap = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.specularMap = null; + this.alphaMap = null; + this.envMap = null; + this.envMapRotation = new Euler(); + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.flatShading = false; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.specular.copy(source.specular); + this.shininess = source.shininess; + this.map = source.map; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.emissive.copy(source.emissive); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.specularMap = source.specularMap; + this.alphaMap = source.alphaMap; + this.envMap = source.envMap; + this.envMapRotation.copy(source.envMapRotation); + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.flatShading = source.flatShading; + this.fog = source.fog; + return this; + } +}; +var MeshToonMaterial = class extends Material { + /** + * Constructs a new mesh toon material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshToonMaterial = true; + this.defines = { "TOON": "" }; + this.type = "MeshToonMaterial"; + this.color = new Color(16777215); + this.map = null; + this.gradientMap = null; + this.lightMap = null; + this.lightMapIntensity = 1; + this.aoMap = null; + this.aoMapIntensity = 1; + this.emissive = new Color(0); + this.emissiveIntensity = 1; + this.emissiveMap = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.alphaMap = null; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.gradientMap = source.gradientMap; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.emissive.copy(source.emissive); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.alphaMap = source.alphaMap; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.fog = source.fog; + return this; + } +}; +var MeshNormalMaterial = class extends Material { + /** + * Constructs a new mesh normal material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshNormalMaterial = true; + this.type = "MeshNormalMaterial"; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.flatShading = false; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.flatShading = source.flatShading; + return this; + } +}; +var MeshLambertMaterial = class extends Material { + /** + * Constructs a new mesh lambert material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshLambertMaterial = true; + this.type = "MeshLambertMaterial"; + this.color = new Color(16777215); + this.map = null; + this.lightMap = null; + this.lightMapIntensity = 1; + this.aoMap = null; + this.aoMapIntensity = 1; + this.emissive = new Color(0); + this.emissiveIntensity = 1; + this.emissiveMap = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.specularMap = null; + this.alphaMap = null; + this.envMap = null; + this.envMapRotation = new Euler(); + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = "round"; + this.wireframeLinejoin = "round"; + this.flatShading = false; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.color.copy(source.color); + this.map = source.map; + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + this.emissive.copy(source.emissive); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.specularMap = source.specularMap; + this.alphaMap = source.alphaMap; + this.envMap = source.envMap; + this.envMapRotation.copy(source.envMapRotation); + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + this.flatShading = source.flatShading; + this.fog = source.fog; + return this; + } +}; +var MeshDepthMaterial = class extends Material { + /** + * Constructs a new mesh depth material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshDepthMaterial = true; + this.type = "MeshDepthMaterial"; + this.depthPacking = BasicDepthPacking; + this.map = null; + this.alphaMap = null; + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.depthPacking = source.depthPacking; + this.map = source.map; + this.alphaMap = source.alphaMap; + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + return this; + } +}; +var MeshDistanceMaterial = class extends Material { + /** + * Constructs a new mesh distance material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshDistanceMaterial = true; + this.type = "MeshDistanceMaterial"; + this.map = null; + this.alphaMap = null; + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.map = source.map; + this.alphaMap = source.alphaMap; + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + return this; + } +}; +var MeshMatcapMaterial = class extends Material { + /** + * Constructs a new mesh matcap material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isMeshMatcapMaterial = true; + this.defines = { "MATCAP": "" }; + this.type = "MeshMatcapMaterial"; + this.color = new Color(16777215); + this.matcap = null; + this.map = null; + this.bumpMap = null; + this.bumpScale = 1; + this.normalMap = null; + this.normalMapType = TangentSpaceNormalMap; + this.normalScale = new Vector2(1, 1); + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + this.alphaMap = null; + this.wireframe = false; + this.wireframeLinewidth = 1; + this.flatShading = false; + this.fog = true; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.defines = { "MATCAP": "" }; + this.color.copy(source.color); + this.matcap = source.matcap; + this.map = source.map; + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + this.normalMap = source.normalMap; + this.normalMapType = source.normalMapType; + this.normalScale.copy(source.normalScale); + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + this.alphaMap = source.alphaMap; + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.flatShading = source.flatShading; + this.fog = source.fog; + return this; + } +}; +var LineDashedMaterial = class extends LineBasicMaterial { + /** + * Constructs a new line dashed material. + * + * @param {Object} [parameters] - An object with one or more properties + * defining the material's appearance. Any property of the material + * (including any property from inherited materials) can be passed + * in here. Color values can be passed any type of value accepted + * by {@link Color#set}. + */ + constructor(parameters) { + super(); + this.isLineDashedMaterial = true; + this.type = "LineDashedMaterial"; + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + this.setValues(parameters); + } + copy(source) { + super.copy(source); + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + return this; + } +}; +function convertArray(array, type) { + if (!array || array.constructor === type) return array; + if (typeof type.BYTES_PER_ELEMENT === "number") { + return new type(array); + } + return Array.prototype.slice.call(array); +} +function getKeyframeOrder(times) { + function compareTime(i, j) { + return times[i] - times[j]; + } + const n = times.length; + const result = new Array(n); + for (let i = 0; i !== n; ++i) result[i] = i; + result.sort(compareTime); + return result; +} +function sortedArray(values, stride, order) { + const nValues = values.length; + const result = new values.constructor(nValues); + for (let i = 0, dstOffset = 0; dstOffset !== nValues; ++i) { + const srcOffset = order[i] * stride; + for (let j = 0; j !== stride; ++j) { + result[dstOffset++] = values[srcOffset + j]; + } + } + return result; +} +function flattenJSON(jsonKeys, times, values, valuePropertyName) { + let i = 1, key = jsonKeys[0]; + while (key !== void 0 && key[valuePropertyName] === void 0) { + key = jsonKeys[i++]; + } + if (key === void 0) return; + let value = key[valuePropertyName]; + if (value === void 0) return; + if (Array.isArray(value)) { + do { + value = key[valuePropertyName]; + if (value !== void 0) { + times.push(key.time); + values.push(...value); + } + key = jsonKeys[i++]; + } while (key !== void 0); + } else if (value.toArray !== void 0) { + do { + value = key[valuePropertyName]; + if (value !== void 0) { + times.push(key.time); + value.toArray(values, values.length); + } + key = jsonKeys[i++]; + } while (key !== void 0); + } else { + do { + value = key[valuePropertyName]; + if (value !== void 0) { + times.push(key.time); + values.push(value); + } + key = jsonKeys[i++]; + } while (key !== void 0); + } +} +function subclip(sourceClip, name, startFrame, endFrame, fps = 30) { + const clip = sourceClip.clone(); + clip.name = name; + const tracks = []; + for (let i = 0; i < clip.tracks.length; ++i) { + const track = clip.tracks[i]; + const valueSize = track.getValueSize(); + const times = []; + const values = []; + for (let j = 0; j < track.times.length; ++j) { + const frame = track.times[j] * fps; + if (frame < startFrame || frame >= endFrame) continue; + times.push(track.times[j]); + for (let k = 0; k < valueSize; ++k) { + values.push(track.values[j * valueSize + k]); + } + } + if (times.length === 0) continue; + track.times = convertArray(times, track.times.constructor); + track.values = convertArray(values, track.values.constructor); + tracks.push(track); + } + clip.tracks = tracks; + let minStartTime = Infinity; + for (let i = 0; i < clip.tracks.length; ++i) { + if (minStartTime > clip.tracks[i].times[0]) { + minStartTime = clip.tracks[i].times[0]; + } + } + for (let i = 0; i < clip.tracks.length; ++i) { + clip.tracks[i].shift(-1 * minStartTime); + } + clip.resetDuration(); + return clip; +} +function makeClipAdditive(targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30) { + if (fps <= 0) fps = 30; + const numTracks = referenceClip.tracks.length; + const referenceTime = referenceFrame / fps; + for (let i = 0; i < numTracks; ++i) { + const referenceTrack = referenceClip.tracks[i]; + const referenceTrackType = referenceTrack.ValueTypeName; + if (referenceTrackType === "bool" || referenceTrackType === "string") continue; + const targetTrack = targetClip.tracks.find(function(track) { + return track.name === referenceTrack.name && track.ValueTypeName === referenceTrackType; + }); + if (targetTrack === void 0) continue; + let referenceOffset = 0; + const referenceValueSize = referenceTrack.getValueSize(); + if (referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) { + referenceOffset = referenceValueSize / 3; + } + let targetOffset = 0; + const targetValueSize = targetTrack.getValueSize(); + if (targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) { + targetOffset = targetValueSize / 3; + } + const lastIndex = referenceTrack.times.length - 1; + let referenceValue; + if (referenceTime <= referenceTrack.times[0]) { + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + referenceValue = referenceTrack.values.slice(startIndex, endIndex); + } else if (referenceTime >= referenceTrack.times[lastIndex]) { + const startIndex = lastIndex * referenceValueSize + referenceOffset; + const endIndex = startIndex + referenceValueSize - referenceOffset; + referenceValue = referenceTrack.values.slice(startIndex, endIndex); + } else { + const interpolant = referenceTrack.createInterpolant(); + const startIndex = referenceOffset; + const endIndex = referenceValueSize - referenceOffset; + interpolant.evaluate(referenceTime); + referenceValue = interpolant.resultBuffer.slice(startIndex, endIndex); + } + if (referenceTrackType === "quaternion") { + const referenceQuat = new Quaternion().fromArray(referenceValue).normalize().conjugate(); + referenceQuat.toArray(referenceValue); + } + const numTimes = targetTrack.times.length; + for (let j = 0; j < numTimes; ++j) { + const valueStart = j * targetValueSize + targetOffset; + if (referenceTrackType === "quaternion") { + Quaternion.multiplyQuaternionsFlat( + targetTrack.values, + valueStart, + referenceValue, + 0, + targetTrack.values, + valueStart + ); + } else { + const valueEnd = targetValueSize - targetOffset * 2; + for (let k = 0; k < valueEnd; ++k) { + targetTrack.values[valueStart + k] -= referenceValue[k]; + } + } + } + } + targetClip.blendMode = AdditiveAnimationBlendMode; + return targetClip; +} +var AnimationUtils = class { + /** + * Converts an array to a specific type + * + * @static + * @param {TypedArray|Array} array - The array to convert. + * @param {TypedArray.constructor} type - The constructor of a type array. + * @return {TypedArray} The converted array + */ + static convertArray(array, type) { + return convertArray(array, type); + } + /** + * Returns `true` if the given object is a typed array. + * + * @static + * @param {any} object - The object to check. + * @return {boolean} Whether the given object is a typed array. + */ + static isTypedArray(object) { + return isTypedArray(object); + } + /** + * Returns an array by which times and values can be sorted. + * + * @static + * @param {Array} times - The keyframe time values. + * @return {Array} The array. + */ + static getKeyframeOrder(times) { + return getKeyframeOrder(times); + } + /** + * Sorts the given array by the previously computed order via `getKeyframeOrder()`. + * + * @static + * @param {Array} values - The values to sort. + * @param {number} stride - The stride. + * @param {Array} order - The sort order. + * @return {Array} The sorted values. + */ + static sortedArray(values, stride, order) { + return sortedArray(values, stride, order); + } + /** + * Used for parsing AOS keyframe formats. + * + * @static + * @param {Array} jsonKeys - A list of JSON keyframes. + * @param {Array} times - This array will be filled with keyframe times by this method. + * @param {Array} values - This array will be filled with keyframe values by this method. + * @param {string} valuePropertyName - The name of the property to use. + */ + static flattenJSON(jsonKeys, times, values, valuePropertyName) { + flattenJSON(jsonKeys, times, values, valuePropertyName); + } + /** + * Creates a new clip, containing only the segment of the original clip between the given frames. + * + * @static + * @param {AnimationClip} sourceClip - The values to sort. + * @param {string} name - The name of the clip. + * @param {number} startFrame - The start frame. + * @param {number} endFrame - The end frame. + * @param {number} [fps=30] - The FPS. + * @return {AnimationClip} The new sub clip. + */ + static subclip(sourceClip, name, startFrame, endFrame, fps = 30) { + return subclip(sourceClip, name, startFrame, endFrame, fps); + } + /** + * Converts the keyframes of the given animation clip to an additive format. + * + * @static + * @param {AnimationClip} targetClip - The clip to make additive. + * @param {number} [referenceFrame=0] - The reference frame. + * @param {AnimationClip} [referenceClip=targetClip] - The reference clip. + * @param {number} [fps=30] - The FPS. + * @return {AnimationClip} The updated clip which is now additive. + */ + static makeClipAdditive(targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30) { + return makeClipAdditive(targetClip, referenceFrame, referenceClip, fps); + } +}; +var Interpolant = class { + /** + * Constructs a new interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + this.resultBuffer = resultBuffer !== void 0 ? resultBuffer : new sampleValues.constructor(sampleSize); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + this.settings = null; + this.DefaultSettings_ = {}; + } + /** + * Evaluate the interpolant at position `t`. + * + * @param {number} t - The interpolation factor. + * @return {TypedArray} The result buffer. + */ + evaluate(t) { + const pp = this.parameterPositions; + let i1 = this._cachedIndex, t1 = pp[i1], t0 = pp[i1 - 1]; + validate_interval: { + seek: { + let right; + linear_scan: { + forward_scan: if (!(t < t1)) { + for (let giveUpAt = i1 + 2; ; ) { + if (t1 === void 0) { + if (t < t0) break forward_scan; + i1 = pp.length; + this._cachedIndex = i1; + return this.copySampleValue_(i1 - 1); + } + if (i1 === giveUpAt) break; + t0 = t1; + t1 = pp[++i1]; + if (t < t1) { + break seek; + } + } + right = pp.length; + break linear_scan; + } + if (!(t >= t0)) { + const t1global = pp[1]; + if (t < t1global) { + i1 = 2; + t0 = t1global; + } + for (let giveUpAt = i1 - 2; ; ) { + if (t0 === void 0) { + this._cachedIndex = 0; + return this.copySampleValue_(0); + } + if (i1 === giveUpAt) break; + t1 = t0; + t0 = pp[--i1 - 1]; + if (t >= t0) { + break seek; + } + } + right = i1; + i1 = 0; + break linear_scan; + } + break validate_interval; + } + while (i1 < right) { + const mid = i1 + right >>> 1; + if (t < pp[mid]) { + right = mid; + } else { + i1 = mid + 1; + } + } + t1 = pp[i1]; + t0 = pp[i1 - 1]; + if (t0 === void 0) { + this._cachedIndex = 0; + return this.copySampleValue_(0); + } + if (t1 === void 0) { + i1 = pp.length; + this._cachedIndex = i1; + return this.copySampleValue_(i1 - 1); + } + } + this._cachedIndex = i1; + this.intervalChanged_(i1, t0, t1); + } + return this.interpolate_(i1, t0, t, t1); + } + /** + * Returns the interpolation settings. + * + * @return {Object} The interpolation settings. + */ + getSettings_() { + return this.settings || this.DefaultSettings_; + } + /** + * Copies a sample value to the result buffer. + * + * @param {number} index - An index into the sample value buffer. + * @return {TypedArray} The result buffer. + */ + copySampleValue_(index) { + const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset = index * stride; + for (let i = 0; i !== stride; ++i) { + result[i] = values[offset + i]; + } + return result; + } + /** + * Copies a sample value to the result buffer. + * + * @abstract + * @param {number} i1 - An index into the sample value buffer. + * @param {number} t0 - The previous interpolation factor. + * @param {number} t - The current interpolation factor. + * @param {number} t1 - The next interpolation factor. + * @return {TypedArray} The result buffer. + */ + interpolate_() { + throw new Error("call to abstract method"); + } + /** + * Optional method that is executed when the interval has changed. + * + * @param {number} i1 - An index into the sample value buffer. + * @param {number} t0 - The previous interpolation factor. + * @param {number} t - The current interpolation factor. + */ + intervalChanged_() { + } +}; +var CubicInterpolant = class extends Interpolant { + /** + * Constructs a new cubic interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + this.DefaultSettings_ = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + } + intervalChanged_(i1, t0, t1) { + const pp = this.parameterPositions; + let iPrev = i1 - 2, iNext = i1 + 1, tPrev = pp[iPrev], tNext = pp[iNext]; + if (tPrev === void 0) { + switch (this.getSettings_().endingStart) { + case ZeroSlopeEnding: + iPrev = i1; + tPrev = 2 * t0 - t1; + break; + case WrapAroundEnding: + iPrev = pp.length - 2; + tPrev = t0 + pp[iPrev] - pp[iPrev + 1]; + break; + default: + iPrev = i1; + tPrev = t1; + } + } + if (tNext === void 0) { + switch (this.getSettings_().endingEnd) { + case ZeroSlopeEnding: + iNext = i1; + tNext = 2 * t1 - t0; + break; + case WrapAroundEnding: + iNext = 1; + tNext = t1 + pp[1] - pp[0]; + break; + default: + iNext = i1 - 1; + tNext = t0; + } + } + const halfDt = (t1 - t0) * 0.5, stride = this.valueSize; + this._weightPrev = halfDt / (t0 - tPrev); + this._weightNext = halfDt / (tNext - t1); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + } + interpolate_(i1, t0, t, t1) { + const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, o1 = i1 * stride, o0 = o1 - stride, oP = this._offsetPrev, oN = this._offsetNext, wP = this._weightPrev, wN = this._weightNext, p = (t - t0) / (t1 - t0), pp = p * p, ppp = pp * p; + const sP = -wP * ppp + 2 * wP * pp - wP * p; + const s0 = (1 + wP) * ppp + (-1.5 - 2 * wP) * pp + (-0.5 + wP) * p + 1; + const s1 = (-1 - wN) * ppp + (1.5 + wN) * pp + 0.5 * p; + const sN = wN * ppp - wN * pp; + for (let i = 0; i !== stride; ++i) { + result[i] = sP * values[oP + i] + s0 * values[o0 + i] + s1 * values[o1 + i] + sN * values[oN + i]; + } + return result; + } +}; +var LinearInterpolant = class extends Interpolant { + /** + * Constructs a new linear interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); + } + interpolate_(i1, t0, t, t1) { + const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset1 = i1 * stride, offset0 = offset1 - stride, weight1 = (t - t0) / (t1 - t0), weight0 = 1 - weight1; + for (let i = 0; i !== stride; ++i) { + result[i] = values[offset0 + i] * weight0 + values[offset1 + i] * weight1; + } + return result; + } +}; +var DiscreteInterpolant = class extends Interpolant { + /** + * Constructs a new discrete interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); + } + interpolate_(i1) { + return this.copySampleValue_(i1 - 1); + } +}; +var KeyframeTrack = class { + /** + * Constructs a new keyframe track. + * + * @param {string} name - The keyframe track's name. + * @param {Array} times - A list of keyframe times. + * @param {Array} values - A list of keyframe values. + * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type. + */ + constructor(name, times, values, interpolation) { + if (name === void 0) throw new Error("THREE.KeyframeTrack: track name is undefined"); + if (times === void 0 || times.length === 0) throw new Error("THREE.KeyframeTrack: no keyframes in track named " + name); + this.name = name; + this.times = convertArray(times, this.TimeBufferType); + this.values = convertArray(values, this.ValueBufferType); + this.setInterpolation(interpolation || this.DefaultInterpolation); + } + /** + * Converts the keyframe track to JSON. + * + * @static + * @param {KeyframeTrack} track - The keyframe track to serialize. + * @return {Object} The serialized keyframe track as JSON. + */ + static toJSON(track) { + const trackType = track.constructor; + let json; + if (trackType.toJSON !== this.toJSON) { + json = trackType.toJSON(track); + } else { + json = { + "name": track.name, + "times": convertArray(track.times, Array), + "values": convertArray(track.values, Array) + }; + const interpolation = track.getInterpolation(); + if (interpolation !== track.DefaultInterpolation) { + json.interpolation = interpolation; + } + } + json.type = track.ValueTypeName; + return json; + } + /** + * Factory method for creating a new discrete interpolant. + * + * @static + * @param {TypedArray} [result] - The result buffer. + * @return {DiscreteInterpolant} The new interpolant. + */ + InterpolantFactoryMethodDiscrete(result) { + return new DiscreteInterpolant(this.times, this.values, this.getValueSize(), result); + } + /** + * Factory method for creating a new linear interpolant. + * + * @static + * @param {TypedArray} [result] - The result buffer. + * @return {LinearInterpolant} The new interpolant. + */ + InterpolantFactoryMethodLinear(result) { + return new LinearInterpolant(this.times, this.values, this.getValueSize(), result); + } + /** + * Factory method for creating a new smooth interpolant. + * + * @static + * @param {TypedArray} [result] - The result buffer. + * @return {CubicInterpolant} The new interpolant. + */ + InterpolantFactoryMethodSmooth(result) { + return new CubicInterpolant(this.times, this.values, this.getValueSize(), result); + } + /** + * Defines the interpolation factor method for this keyframe track. + * + * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type. + * @return {KeyframeTrack} A reference to this keyframe track. + */ + setInterpolation(interpolation) { + let factoryMethod; + switch (interpolation) { + case InterpolateDiscrete: + factoryMethod = this.InterpolantFactoryMethodDiscrete; + break; + case InterpolateLinear: + factoryMethod = this.InterpolantFactoryMethodLinear; + break; + case InterpolateSmooth: + factoryMethod = this.InterpolantFactoryMethodSmooth; + break; + } + if (factoryMethod === void 0) { + const message = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name; + if (this.createInterpolant === void 0) { + if (interpolation !== this.DefaultInterpolation) { + this.setInterpolation(this.DefaultInterpolation); + } else { + throw new Error(message); + } + } + warn("KeyframeTrack:", message); + return this; + } + this.createInterpolant = factoryMethod; + return this; + } + /** + * Returns the current interpolation type. + * + * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type. + */ + getInterpolation() { + switch (this.createInterpolant) { + case this.InterpolantFactoryMethodDiscrete: + return InterpolateDiscrete; + case this.InterpolantFactoryMethodLinear: + return InterpolateLinear; + case this.InterpolantFactoryMethodSmooth: + return InterpolateSmooth; + } + } + /** + * Returns the value size. + * + * @return {number} The value size. + */ + getValueSize() { + return this.values.length / this.times.length; + } + /** + * Moves all keyframes either forward or backward in time. + * + * @param {number} timeOffset - The offset to move the time values. + * @return {KeyframeTrack} A reference to this keyframe track. + */ + shift(timeOffset) { + if (timeOffset !== 0) { + const times = this.times; + for (let i = 0, n = times.length; i !== n; ++i) { + times[i] += timeOffset; + } + } + return this; + } + /** + * Scale all keyframe times by a factor (useful for frame - seconds conversions). + * + * @param {number} timeScale - The time scale. + * @return {KeyframeTrack} A reference to this keyframe track. + */ + scale(timeScale) { + if (timeScale !== 1) { + const times = this.times; + for (let i = 0, n = times.length; i !== n; ++i) { + times[i] *= timeScale; + } + } + return this; + } + /** + * Removes keyframes before and after animation without changing any values within the defined time range. + * + * Note: The method does not shift around keys to the start of the track time, because for interpolated + * keys this will change their values + * + * @param {number} startTime - The start time. + * @param {number} endTime - The end time. + * @return {KeyframeTrack} A reference to this keyframe track. + */ + trim(startTime, endTime) { + const times = this.times, nKeys = times.length; + let from = 0, to = nKeys - 1; + while (from !== nKeys && times[from] < startTime) { + ++from; + } + while (to !== -1 && times[to] > endTime) { + --to; + } + ++to; + if (from !== 0 || to !== nKeys) { + if (from >= to) { + to = Math.max(to, 1); + from = to - 1; + } + const stride = this.getValueSize(); + this.times = times.slice(from, to); + this.values = this.values.slice(from * stride, to * stride); + } + return this; + } + /** + * Performs minimal validation on the keyframe track. Returns `true` if the values + * are valid. + * + * @return {boolean} Whether the keyframes are valid or not. + */ + validate() { + let valid = true; + const valueSize = this.getValueSize(); + if (valueSize - Math.floor(valueSize) !== 0) { + error("KeyframeTrack: Invalid value size in track.", this); + valid = false; + } + const times = this.times, values = this.values, nKeys = times.length; + if (nKeys === 0) { + error("KeyframeTrack: Track is empty.", this); + valid = false; + } + let prevTime = null; + for (let i = 0; i !== nKeys; i++) { + const currTime = times[i]; + if (typeof currTime === "number" && isNaN(currTime)) { + error("KeyframeTrack: Time is not a valid number.", this, i, currTime); + valid = false; + break; + } + if (prevTime !== null && prevTime > currTime) { + error("KeyframeTrack: Out of order keys.", this, i, currTime, prevTime); + valid = false; + break; + } + prevTime = currTime; + } + if (values !== void 0) { + if (isTypedArray(values)) { + for (let i = 0, n = values.length; i !== n; ++i) { + const value = values[i]; + if (isNaN(value)) { + error("KeyframeTrack: Value is not a valid number.", this, i, value); + valid = false; + break; + } + } + } + } + return valid; + } + /** + * Optimizes this keyframe track by removing equivalent sequential keys (which are + * common in morph target sequences). + * + * @return {AnimationClip} A reference to this animation clip. + */ + optimize() { + const times = this.times.slice(), values = this.values.slice(), stride = this.getValueSize(), smoothInterpolation = this.getInterpolation() === InterpolateSmooth, lastIndex = times.length - 1; + let writeIndex = 1; + for (let i = 1; i < lastIndex; ++i) { + let keep = false; + const time = times[i]; + const timeNext = times[i + 1]; + if (time !== timeNext && (i !== 1 || time !== times[0])) { + if (!smoothInterpolation) { + const offset = i * stride, offsetP = offset - stride, offsetN = offset + stride; + for (let j = 0; j !== stride; ++j) { + const value = values[offset + j]; + if (value !== values[offsetP + j] || value !== values[offsetN + j]) { + keep = true; + break; + } + } + } else { + keep = true; + } + } + if (keep) { + if (i !== writeIndex) { + times[writeIndex] = times[i]; + const readOffset = i * stride, writeOffset = writeIndex * stride; + for (let j = 0; j !== stride; ++j) { + values[writeOffset + j] = values[readOffset + j]; + } + } + ++writeIndex; + } + } + if (lastIndex > 0) { + times[writeIndex] = times[lastIndex]; + for (let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++j) { + values[writeOffset + j] = values[readOffset + j]; + } + ++writeIndex; + } + if (writeIndex !== times.length) { + this.times = times.slice(0, writeIndex); + this.values = values.slice(0, writeIndex * stride); + } else { + this.times = times; + this.values = values; + } + return this; + } + /** + * Returns a new keyframe track with copied values from this instance. + * + * @return {KeyframeTrack} A clone of this instance. + */ + clone() { + const times = this.times.slice(); + const values = this.values.slice(); + const TypedKeyframeTrack = this.constructor; + const track = new TypedKeyframeTrack(this.name, times, values); + track.createInterpolant = this.createInterpolant; + return track; + } +}; +KeyframeTrack.prototype.ValueTypeName = ""; +KeyframeTrack.prototype.TimeBufferType = Float32Array; +KeyframeTrack.prototype.ValueBufferType = Float32Array; +KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; +var BooleanKeyframeTrack = class extends KeyframeTrack { + /** + * Constructs a new boolean keyframe track. + * + * This keyframe track type has no `interpolation` parameter because the + * interpolation is always discrete. + * + * @param {string} name - The keyframe track's name. + * @param {Array} times - A list of keyframe times. + * @param {Array} values - A list of keyframe values. + */ + constructor(name, times, values) { + super(name, times, values); + } +}; +BooleanKeyframeTrack.prototype.ValueTypeName = "bool"; +BooleanKeyframeTrack.prototype.ValueBufferType = Array; +BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = void 0; +BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; +var ColorKeyframeTrack = class extends KeyframeTrack { + /** + * Constructs a new color keyframe track. + * + * @param {string} name - The keyframe track's name. + * @param {Array} times - A list of keyframe times. + * @param {Array} values - A list of keyframe values. + * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type. + */ + constructor(name, times, values, interpolation) { + super(name, times, values, interpolation); + } +}; +ColorKeyframeTrack.prototype.ValueTypeName = "color"; +var NumberKeyframeTrack = class extends KeyframeTrack { + /** + * Constructs a new number keyframe track. + * + * @param {string} name - The keyframe track's name. + * @param {Array} times - A list of keyframe times. + * @param {Array} values - A list of keyframe values. + * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type. + */ + constructor(name, times, values, interpolation) { + super(name, times, values, interpolation); + } +}; +NumberKeyframeTrack.prototype.ValueTypeName = "number"; +var QuaternionLinearInterpolant = class extends Interpolant { + /** + * Constructs a new SLERP interpolant. + * + * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors. + * @param {TypedArray} sampleValues - The sample values. + * @param {number} sampleSize - The sample size + * @param {TypedArray} [resultBuffer] - The result buffer. + */ + constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) { + super(parameterPositions, sampleValues, sampleSize, resultBuffer); + } + interpolate_(i1, t0, t, t1) { + const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, alpha = (t - t0) / (t1 - t0); + let offset = i1 * stride; + for (let end = offset + stride; offset !== end; offset += 4) { + Quaternion.slerpFlat(result, 0, values, offset - stride, values, offset, alpha); + } + return result; + } +}; +var QuaternionKeyframeTrack = class extends KeyframeTrack { + /** + * Constructs a new Quaternion keyframe track. + * + * @param {string} name - The keyframe track's name. + * @param {Array} times - A list of keyframe times. + * @param {Array} values - A list of keyframe values. + * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type. + */ + constructor(name, times, values, interpolation) { + super(name, times, values, interpolation); + } + /** + * Overwritten so the method returns Quaternion based interpolant. + * + * @static + * @param {TypedArray} [result] - The result buffer. + * @return {QuaternionLinearInterpolant} The new interpolant. + */ + InterpolantFactoryMethodLinear(result) { + return new QuaternionLinearInterpolant(this.times, this.values, this.getValueSize(), result); + } +}; +QuaternionKeyframeTrack.prototype.ValueTypeName = "quaternion"; +QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; +var StringKeyframeTrack = class extends KeyframeTrack { + /** + * Constructs a new string keyframe track. + * + * This keyframe track type has no `interpolation` parameter because the + * interpolation is always discrete. + * + * @param {string} name - The keyframe track's name. + * @param {Array} times - A list of keyframe times. + * @param {Array} values - A list of keyframe values. + */ + constructor(name, times, values) { + super(name, times, values); + } +}; +StringKeyframeTrack.prototype.ValueTypeName = "string"; +StringKeyframeTrack.prototype.ValueBufferType = Array; +StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; +StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = void 0; +StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = void 0; +var VectorKeyframeTrack = class extends KeyframeTrack { + /** + * Constructs a new vector keyframe track. + * + * @param {string} name - The keyframe track's name. + * @param {Array} times - A list of keyframe times. + * @param {Array} values - A list of keyframe values. + * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type. + */ + constructor(name, times, values, interpolation) { + super(name, times, values, interpolation); + } +}; +VectorKeyframeTrack.prototype.ValueTypeName = "vector"; +var AnimationClip = class { + /** + * Constructs a new animation clip. + * + * Note: Instead of instantiating an AnimationClip directly with the constructor, you can + * use the static interface of this class for creating clips. In most cases though, animation clips + * will automatically be created by loaders when importing animated 3D assets. + * + * @param {string} [name=''] - The clip's name. + * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed, + * the duration will be calculated from the passed keyframes. + * @param {Array} tracks - An array of keyframe tracks. + * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation + * is blended/combined when two or more animations are simultaneously played. + */ + constructor(name = "", duration = -1, tracks = [], blendMode = NormalAnimationBlendMode) { + this.name = name; + this.tracks = tracks; + this.duration = duration; + this.blendMode = blendMode; + this.uuid = generateUUID(); + this.userData = {}; + if (this.duration < 0) { + this.resetDuration(); + } + } + /** + * Factory method for creating an animation clip from the given JSON. + * + * @static + * @param {Object} json - The serialized animation clip. + * @return {AnimationClip} The new animation clip. + */ + static parse(json) { + const tracks = [], jsonTracks = json.tracks, frameTime = 1 / (json.fps || 1); + for (let i = 0, n = jsonTracks.length; i !== n; ++i) { + tracks.push(parseKeyframeTrack(jsonTracks[i]).scale(frameTime)); + } + const clip = new this(json.name, json.duration, tracks, json.blendMode); + clip.uuid = json.uuid; + clip.userData = JSON.parse(json.userData || "{}"); + return clip; + } + /** + * Serializes the given animation clip into JSON. + * + * @static + * @param {AnimationClip} clip - The animation clip to serialize. + * @return {Object} The JSON object. + */ + static toJSON(clip) { + const tracks = [], clipTracks = clip.tracks; + const json = { + "name": clip.name, + "duration": clip.duration, + "tracks": tracks, + "uuid": clip.uuid, + "blendMode": clip.blendMode, + "userData": JSON.stringify(clip.userData) + }; + for (let i = 0, n = clipTracks.length; i !== n; ++i) { + tracks.push(KeyframeTrack.toJSON(clipTracks[i])); + } + return json; + } + /** + * Returns a new animation clip from the passed morph targets array of a + * geometry, taking a name and the number of frames per second. + * + * Note: The fps parameter is required, but the animation speed can be + * overridden via {@link AnimationAction#setDuration}. + * + * @static + * @param {string} name - The name of the animation clip. + * @param {Array} morphTargetSequence - A sequence of morph targets. + * @param {number} fps - The Frames-Per-Second value. + * @param {boolean} noLoop - Whether the clip should be no loop or not. + * @return {AnimationClip} The new animation clip. + */ + static CreateFromMorphTargetSequence(name, morphTargetSequence, fps, noLoop) { + const numMorphTargets = morphTargetSequence.length; + const tracks = []; + for (let i = 0; i < numMorphTargets; i++) { + let times = []; + let values = []; + times.push( + (i + numMorphTargets - 1) % numMorphTargets, + i, + (i + 1) % numMorphTargets + ); + values.push(0, 1, 0); + const order = getKeyframeOrder(times); + times = sortedArray(times, 1, order); + values = sortedArray(values, 1, order); + if (!noLoop && times[0] === 0) { + times.push(numMorphTargets); + values.push(values[0]); + } + tracks.push( + new NumberKeyframeTrack( + ".morphTargetInfluences[" + morphTargetSequence[i].name + "]", + times, + values + ).scale(1 / fps) + ); + } + return new this(name, -1, tracks); + } + /** + * Searches for an animation clip by name, taking as its first parameter + * either an array of clips, or a mesh or geometry that contains an + * array named "animations" property. + * + * @static + * @param {(Array|Object3D)} objectOrClipArray - The array or object to search through. + * @param {string} name - The name to search for. + * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found. + */ + static findByName(objectOrClipArray, name) { + let clipArray = objectOrClipArray; + if (!Array.isArray(objectOrClipArray)) { + const o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + } + for (let i = 0; i < clipArray.length; i++) { + if (clipArray[i].name === name) { + return clipArray[i]; + } + } + return null; + } + /** + * Returns an array of new AnimationClips created from the morph target + * sequences of a geometry, trying to sort morph target names into + * animation-group-based patterns like "Walk_001, Walk_002, Run_001, Run_002...". + * + * See {@link MD2Loader#parse} as an example for how the method should be used. + * + * @static + * @param {Array} morphTargets - A sequence of morph targets. + * @param {number} fps - The Frames-Per-Second value. + * @param {boolean} noLoop - Whether the clip should be no loop or not. + * @return {Array} An array of new animation clips. + */ + static CreateClipsFromMorphTargetSequences(morphTargets, fps, noLoop) { + const animationToMorphTargets = {}; + const pattern = /^([\w-]*?)([\d]+)$/; + for (let i = 0, il = morphTargets.length; i < il; i++) { + const morphTarget = morphTargets[i]; + const parts = morphTarget.name.match(pattern); + if (parts && parts.length > 1) { + const name = parts[1]; + let animationMorphTargets = animationToMorphTargets[name]; + if (!animationMorphTargets) { + animationToMorphTargets[name] = animationMorphTargets = []; + } + animationMorphTargets.push(morphTarget); + } + } + const clips = []; + for (const name in animationToMorphTargets) { + clips.push(this.CreateFromMorphTargetSequence(name, animationToMorphTargets[name], fps, noLoop)); + } + return clips; + } + /** + * Parses the `animation.hierarchy` format and returns a new animation clip. + * + * @static + * @deprecated since r175. + * @param {Object} animation - A serialized animation clip as JSON. + * @param {Array} bones - An array of bones. + * @return {?AnimationClip} The new animation clip. + */ + static parseAnimation(animation, bones) { + warn("AnimationClip: parseAnimation() is deprecated and will be removed with r185"); + if (!animation) { + error("AnimationClip: No animation in JSONLoader data."); + return null; + } + const addNonemptyTrack = function(trackType, trackName, animationKeys, propertyName, destTracks) { + if (animationKeys.length !== 0) { + const times = []; + const values = []; + flattenJSON(animationKeys, times, values, propertyName); + if (times.length !== 0) { + destTracks.push(new trackType(trackName, times, values)); + } + } + }; + const tracks = []; + const clipName = animation.name || "default"; + const fps = animation.fps || 30; + const blendMode = animation.blendMode; + let duration = animation.length || -1; + const hierarchyTracks = animation.hierarchy || []; + for (let h = 0; h < hierarchyTracks.length; h++) { + const animationKeys = hierarchyTracks[h].keys; + if (!animationKeys || animationKeys.length === 0) continue; + if (animationKeys[0].morphTargets) { + const morphTargetNames = {}; + let k; + for (k = 0; k < animationKeys.length; k++) { + if (animationKeys[k].morphTargets) { + for (let m = 0; m < animationKeys[k].morphTargets.length; m++) { + morphTargetNames[animationKeys[k].morphTargets[m]] = -1; + } + } + } + for (const morphTargetName in morphTargetNames) { + const times = []; + const values = []; + for (let m = 0; m !== animationKeys[k].morphTargets.length; ++m) { + const animationKey = animationKeys[k]; + times.push(animationKey.time); + values.push(animationKey.morphTarget === morphTargetName ? 1 : 0); + } + tracks.push(new NumberKeyframeTrack(".morphTargetInfluence[" + morphTargetName + "]", times, values)); + } + duration = morphTargetNames.length * fps; + } else { + const boneName = ".bones[" + bones[h].name + "]"; + addNonemptyTrack( + VectorKeyframeTrack, + boneName + ".position", + animationKeys, + "pos", + tracks + ); + addNonemptyTrack( + QuaternionKeyframeTrack, + boneName + ".quaternion", + animationKeys, + "rot", + tracks + ); + addNonemptyTrack( + VectorKeyframeTrack, + boneName + ".scale", + animationKeys, + "scl", + tracks + ); + } + } + if (tracks.length === 0) { + return null; + } + const clip = new this(clipName, duration, tracks, blendMode); + return clip; + } + /** + * Sets the duration of this clip to the duration of its longest keyframe track. + * + * @return {AnimationClip} A reference to this animation clip. + */ + resetDuration() { + const tracks = this.tracks; + let duration = 0; + for (let i = 0, n = tracks.length; i !== n; ++i) { + const track = this.tracks[i]; + duration = Math.max(duration, track.times[track.times.length - 1]); + } + this.duration = duration; + return this; + } + /** + * Trims all tracks to the clip's duration. + * + * @return {AnimationClip} A reference to this animation clip. + */ + trim() { + for (let i = 0; i < this.tracks.length; i++) { + this.tracks[i].trim(0, this.duration); + } + return this; + } + /** + * Performs minimal validation on each track in the clip. Returns `true` if all + * tracks are valid. + * + * @return {boolean} Whether the clip's keyframes are valid or not. + */ + validate() { + let valid = true; + for (let i = 0; i < this.tracks.length; i++) { + valid = valid && this.tracks[i].validate(); + } + return valid; + } + /** + * Optimizes each track by removing equivalent sequential keys (which are + * common in morph target sequences). + * + * @return {AnimationClip} A reference to this animation clip. + */ + optimize() { + for (let i = 0; i < this.tracks.length; i++) { + this.tracks[i].optimize(); + } + return this; + } + /** + * Returns a new animation clip with copied values from this instance. + * + * @return {AnimationClip} A clone of this instance. + */ + clone() { + const tracks = []; + for (let i = 0; i < this.tracks.length; i++) { + tracks.push(this.tracks[i].clone()); + } + const clip = new this.constructor(this.name, this.duration, tracks, this.blendMode); + clip.userData = JSON.parse(JSON.stringify(this.userData)); + return clip; + } + /** + * Serializes this animation clip into JSON. + * + * @return {Object} The JSON object. + */ + toJSON() { + return this.constructor.toJSON(this); + } +}; +function getTrackTypeForValueTypeName(typeName) { + switch (typeName.toLowerCase()) { + case "scalar": + case "double": + case "float": + case "number": + case "integer": + return NumberKeyframeTrack; + case "vector": + case "vector2": + case "vector3": + case "vector4": + return VectorKeyframeTrack; + case "color": + return ColorKeyframeTrack; + case "quaternion": + return QuaternionKeyframeTrack; + case "bool": + case "boolean": + return BooleanKeyframeTrack; + case "string": + return StringKeyframeTrack; + } + throw new Error("THREE.KeyframeTrack: Unsupported typeName: " + typeName); +} +function parseKeyframeTrack(json) { + if (json.type === void 0) { + throw new Error("THREE.KeyframeTrack: track type undefined, can not parse"); + } + const trackType = getTrackTypeForValueTypeName(json.type); + if (json.times === void 0) { + const times = [], values = []; + flattenJSON(json.keys, times, values, "value"); + json.times = times; + json.values = values; + } + if (trackType.parse !== void 0) { + return trackType.parse(json); + } else { + return new trackType(json.name, json.times, json.values, json.interpolation); + } +} +var Cache = { + /** + * Whether caching is enabled or not. + * + * @static + * @type {boolean} + * @default false + */ + enabled: false, + /** + * A dictionary that holds cached files. + * + * @static + * @type {Object} + */ + files: {}, + /** + * Adds a cache entry with a key to reference the file. If this key already + * holds a file, it is overwritten. + * + * @static + * @param {string} key - The key to reference the cached file. + * @param {Object} file - The file to be cached. + */ + add: function(key, file) { + if (this.enabled === false) return; + this.files[key] = file; + }, + /** + * Gets the cached value for the given key. + * + * @static + * @param {string} key - The key to reference the cached file. + * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned. + */ + get: function(key) { + if (this.enabled === false) return; + return this.files[key]; + }, + /** + * Removes the cached file associated with the given key. + * + * @static + * @param {string} key - The key to reference the cached file. + */ + remove: function(key) { + delete this.files[key]; + }, + /** + * Remove all values from the cache. + * + * @static + */ + clear: function() { + this.files = {}; + } +}; +var LoadingManager = class { + /** + * Constructs a new loading manager. + * + * @param {Function} [onLoad] - Executes when all items have been loaded. + * @param {Function} [onProgress] - Executes when single items have been loaded. + * @param {Function} [onError] - Executes when an error occurs. + */ + constructor(onLoad, onProgress, onError) { + const scope = this; + let isLoading = false; + let itemsLoaded = 0; + let itemsTotal = 0; + let urlModifier = void 0; + const handlers = []; + this.onStart = void 0; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + this._abortController = null; + this.itemStart = function(url) { + itemsTotal++; + if (isLoading === false) { + if (scope.onStart !== void 0) { + scope.onStart(url, itemsLoaded, itemsTotal); + } + } + isLoading = true; + }; + this.itemEnd = function(url) { + itemsLoaded++; + if (scope.onProgress !== void 0) { + scope.onProgress(url, itemsLoaded, itemsTotal); + } + if (itemsLoaded === itemsTotal) { + isLoading = false; + if (scope.onLoad !== void 0) { + scope.onLoad(); + } + } + }; + this.itemError = function(url) { + if (scope.onError !== void 0) { + scope.onError(url); + } + }; + this.resolveURL = function(url) { + if (urlModifier) { + return urlModifier(url); + } + return url; + }; + this.setURLModifier = function(transform) { + urlModifier = transform; + return this; + }; + this.addHandler = function(regex, loader) { + handlers.push(regex, loader); + return this; + }; + this.removeHandler = function(regex) { + const index = handlers.indexOf(regex); + if (index !== -1) { + handlers.splice(index, 2); + } + return this; + }; + this.getHandler = function(file) { + for (let i = 0, l = handlers.length; i < l; i += 2) { + const regex = handlers[i]; + const loader = handlers[i + 1]; + if (regex.global) regex.lastIndex = 0; + if (regex.test(file)) { + return loader; + } + } + return null; + }; + this.abort = function() { + this.abortController.abort(); + this._abortController = null; + return this; + }; + } + // TODO: Revert this back to a single member variable once this issue has been fixed + // https://github.com/cloudflare/workerd/issues/3657 + /** + * Used for aborting ongoing requests in loaders using this manager. + * + * @type {AbortController} + */ + get abortController() { + if (!this._abortController) { + this._abortController = new AbortController(); + } + return this._abortController; + } +}; +var DefaultLoadingManager = new LoadingManager(); +var Loader = class { + /** + * Constructs a new loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + this.manager = manager !== void 0 ? manager : DefaultLoadingManager; + this.crossOrigin = "anonymous"; + this.withCredentials = false; + this.path = ""; + this.resourcePath = ""; + this.requestHeader = {}; + } + /** + * This method needs to be implemented by all concrete loaders. It holds the + * logic for loading assets from the backend. + * + * @abstract + * @param {string} url - The path/URL of the file to be loaded. + * @param {Function} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress. + * @param {onErrorCallback} [onError] - Executed when errors occur. + */ + load() { + } + /** + * A async version of {@link Loader#load}. + * + * @param {string} url - The path/URL of the file to be loaded. + * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress. + * @return {Promise} A Promise that resolves when the asset has been loaded. + */ + loadAsync(url, onProgress) { + const scope = this; + return new Promise(function(resolve, reject) { + scope.load(url, resolve, onProgress, reject); + }); + } + /** + * This method needs to be implemented by all concrete loaders. It holds the + * logic for parsing the asset into three.js entities. + * + * @abstract + * @param {any} data - The data to parse. + */ + parse() { + } + /** + * Sets the `crossOrigin` String to implement CORS for loading the URL + * from a different domain that allows CORS. + * + * @param {string} crossOrigin - The `crossOrigin` value. + * @return {Loader} A reference to this instance. + */ + setCrossOrigin(crossOrigin) { + this.crossOrigin = crossOrigin; + return this; + } + /** + * Whether the XMLHttpRequest uses credentials such as cookies, authorization + * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials). + * + * Note: This setting has no effect if you are loading files locally or from the same domain. + * + * @param {boolean} value - The `withCredentials` value. + * @return {Loader} A reference to this instance. + */ + setWithCredentials(value) { + this.withCredentials = value; + return this; + } + /** + * Sets the base path for the asset. + * + * @param {string} path - The base path. + * @return {Loader} A reference to this instance. + */ + setPath(path) { + this.path = path; + return this; + } + /** + * Sets the base path for dependent resources like textures. + * + * @param {string} resourcePath - The resource path. + * @return {Loader} A reference to this instance. + */ + setResourcePath(resourcePath) { + this.resourcePath = resourcePath; + return this; + } + /** + * Sets the given request header. + * + * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header) + * for configuring the HTTP request. + * @return {Loader} A reference to this instance. + */ + setRequestHeader(requestHeader) { + this.requestHeader = requestHeader; + return this; + } + /** + * This method can be implemented in loaders for aborting ongoing requests. + * + * @abstract + * @return {Loader} A reference to this instance. + */ + abort() { + return this; + } +}; +Loader.DEFAULT_MATERIAL_NAME = "__DEFAULT"; +var loading = {}; +var HttpError = class extends Error { + constructor(message, response) { + super(message); + this.response = response; + } +}; +var FileLoader = class extends Loader { + /** + * Constructs a new file loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + this.mimeType = ""; + this.responseType = ""; + this._abortController = new AbortController(); + } + /** + * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(any)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress. + * @param {onErrorCallback} [onError] - Executed when errors occur. + * @return {any|undefined} The cached resource if available. + */ + load(url, onLoad, onProgress, onError) { + if (url === void 0) url = ""; + if (this.path !== void 0) url = this.path + url; + url = this.manager.resolveURL(url); + const cached = Cache.get(`file:${url}`); + if (cached !== void 0) { + this.manager.itemStart(url); + setTimeout(() => { + if (onLoad) onLoad(cached); + this.manager.itemEnd(url); + }, 0); + return cached; + } + if (loading[url] !== void 0) { + loading[url].push({ + onLoad, + onProgress, + onError + }); + return; + } + loading[url] = []; + loading[url].push({ + onLoad, + onProgress, + onError + }); + const req = new Request(url, { + headers: new Headers(this.requestHeader), + credentials: this.withCredentials ? "include" : "same-origin", + signal: typeof AbortSignal.any === "function" ? AbortSignal.any([this._abortController.signal, this.manager.abortController.signal]) : this._abortController.signal + }); + const mimeType = this.mimeType; + const responseType = this.responseType; + fetch(req).then((response) => { + if (response.status === 200 || response.status === 0) { + if (response.status === 0) { + warn("FileLoader: HTTP Status 0 received."); + } + if (typeof ReadableStream === "undefined" || response.body === void 0 || response.body.getReader === void 0) { + return response; + } + const callbacks = loading[url]; + const reader = response.body.getReader(); + const contentLength = response.headers.get("X-File-Size") || response.headers.get("Content-Length"); + const total = contentLength ? parseInt(contentLength) : 0; + const lengthComputable = total !== 0; + let loaded = 0; + const stream = new ReadableStream({ + start(controller) { + readData(); + function readData() { + reader.read().then(({ done, value }) => { + if (done) { + controller.close(); + } else { + loaded += value.byteLength; + const event = new ProgressEvent("progress", { lengthComputable, loaded, total }); + for (let i = 0, il = callbacks.length; i < il; i++) { + const callback = callbacks[i]; + if (callback.onProgress) callback.onProgress(event); + } + controller.enqueue(value); + readData(); + } + }, (e) => { + controller.error(e); + }); + } + } + }); + return new Response(stream); + } else { + throw new HttpError(`fetch for "${response.url}" responded with ${response.status}: ${response.statusText}`, response); + } + }).then((response) => { + switch (responseType) { + case "arraybuffer": + return response.arrayBuffer(); + case "blob": + return response.blob(); + case "document": + return response.text().then((text) => { + const parser = new DOMParser(); + return parser.parseFromString(text, mimeType); + }); + case "json": + return response.json(); + default: + if (mimeType === "") { + return response.text(); + } else { + const re = /charset="?([^;"\s]*)"?/i; + const exec = re.exec(mimeType); + const label = exec && exec[1] ? exec[1].toLowerCase() : void 0; + const decoder = new TextDecoder(label); + return response.arrayBuffer().then((ab) => decoder.decode(ab)); + } + } + }).then((data) => { + Cache.add(`file:${url}`, data); + const callbacks = loading[url]; + delete loading[url]; + for (let i = 0, il = callbacks.length; i < il; i++) { + const callback = callbacks[i]; + if (callback.onLoad) callback.onLoad(data); + } + }).catch((err) => { + const callbacks = loading[url]; + if (callbacks === void 0) { + this.manager.itemError(url); + throw err; + } + delete loading[url]; + for (let i = 0, il = callbacks.length; i < il; i++) { + const callback = callbacks[i]; + if (callback.onError) callback.onError(err); + } + this.manager.itemError(url); + }).finally(() => { + this.manager.itemEnd(url); + }); + this.manager.itemStart(url); + } + /** + * Sets the expected response type. + * + * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type. + * @return {FileLoader} A reference to this file loader. + */ + setResponseType(value) { + this.responseType = value; + return this; + } + /** + * Sets the expected mime type of the loaded file. + * + * @param {string} value - The mime type. + * @return {FileLoader} A reference to this file loader. + */ + setMimeType(value) { + this.mimeType = value; + return this; + } + /** + * Aborts ongoing fetch requests. + * + * @return {FileLoader} A reference to this instance. + */ + abort() { + this._abortController.abort(); + this._abortController = new AbortController(); + return this; + } +}; +var AnimationLoader = class extends Loader { + /** + * Constructs a new animation loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and pass the loaded animations as an array + * holding instances of {@link AnimationClip} to the `onLoad()` callback. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(Array)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @param {onErrorCallback} onError - Executed when errors occur. + */ + load(url, onLoad, onProgress, onError) { + const scope = this; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(text) { + try { + onLoad(scope.parse(JSON.parse(text))); + } catch (e) { + if (onError) { + onError(e); + } else { + error(e); + } + scope.manager.itemError(url); + } + }, onProgress, onError); + } + /** + * Parses the given JSON object and returns an array of animation clips. + * + * @param {Object} json - The serialized animation clips. + * @return {Array} The parsed animation clips. + */ + parse(json) { + const animations = []; + for (let i = 0; i < json.length; i++) { + const clip = AnimationClip.parse(json[i]); + animations.push(clip); + } + return animations; + } +}; +var CompressedTextureLoader = class extends Loader { + /** + * Constructs a new compressed texture loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and passes the loaded compressed texture + * to the `onLoad()` callback. The method also returns a new texture object which can + * directly be used for material creation. If you do it this way, the texture + * may pop up in your scene once the respective loading process is finished. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @param {onErrorCallback} onError - Executed when errors occur. + * @return {CompressedTexture} The compressed texture. + */ + load(url, onLoad, onProgress, onError) { + const scope = this; + const images = []; + const texture = new CompressedTexture(); + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setResponseType("arraybuffer"); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(scope.withCredentials); + let loaded = 0; + function loadTexture(i) { + loader.load(url[i], function(buffer) { + const texDatas = scope.parse(buffer, true); + images[i] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + loaded += 1; + if (loaded === 6) { + if (texDatas.mipmapCount === 1) texture.minFilter = LinearFilter; + texture.image = images; + texture.format = texDatas.format; + texture.needsUpdate = true; + if (onLoad) onLoad(texture); + } + }, onProgress, onError); + } + if (Array.isArray(url)) { + for (let i = 0, il = url.length; i < il; ++i) { + loadTexture(i); + } + } else { + loader.load(url, function(buffer) { + const texDatas = scope.parse(buffer, true); + if (texDatas.isCubemap) { + const faces = texDatas.mipmaps.length / texDatas.mipmapCount; + for (let f = 0; f < faces; f++) { + images[f] = { mipmaps: [] }; + for (let i = 0; i < texDatas.mipmapCount; i++) { + images[f].mipmaps.push(texDatas.mipmaps[f * texDatas.mipmapCount + i]); + images[f].format = texDatas.format; + images[f].width = texDatas.width; + images[f].height = texDatas.height; + } + } + texture.image = images; + } else { + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + } + if (texDatas.mipmapCount === 1) { + texture.minFilter = LinearFilter; + } + texture.format = texDatas.format; + texture.needsUpdate = true; + if (onLoad) onLoad(texture); + }, onProgress, onError); + } + return texture; + } +}; +var _loading = /* @__PURE__ */ new WeakMap(); +var ImageLoader = class extends Loader { + /** + * Constructs a new image loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and passes the loaded image + * to the `onLoad()` callback. The method also returns a new `Image` object which can + * directly be used for texture creation. If you do it this way, the texture + * may pop up in your scene once the respective loading process is finished. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(Image)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Unsupported in this loader. + * @param {onErrorCallback} onError - Executed when errors occur. + * @return {Image} The image. + */ + load(url, onLoad, onProgress, onError) { + if (this.path !== void 0) url = this.path + url; + url = this.manager.resolveURL(url); + const scope = this; + const cached = Cache.get(`image:${url}`); + if (cached !== void 0) { + if (cached.complete === true) { + scope.manager.itemStart(url); + setTimeout(function() { + if (onLoad) onLoad(cached); + scope.manager.itemEnd(url); + }, 0); + } else { + let arr = _loading.get(cached); + if (arr === void 0) { + arr = []; + _loading.set(cached, arr); + } + arr.push({ onLoad, onError }); + } + return cached; + } + const image = createElementNS("img"); + function onImageLoad() { + removeEventListeners(); + if (onLoad) onLoad(this); + const callbacks = _loading.get(this) || []; + for (let i = 0; i < callbacks.length; i++) { + const callback = callbacks[i]; + if (callback.onLoad) callback.onLoad(this); + } + _loading.delete(this); + scope.manager.itemEnd(url); + } + function onImageError(event) { + removeEventListeners(); + if (onError) onError(event); + Cache.remove(`image:${url}`); + const callbacks = _loading.get(this) || []; + for (let i = 0; i < callbacks.length; i++) { + const callback = callbacks[i]; + if (callback.onError) callback.onError(event); + } + _loading.delete(this); + scope.manager.itemError(url); + scope.manager.itemEnd(url); + } + function removeEventListeners() { + image.removeEventListener("load", onImageLoad, false); + image.removeEventListener("error", onImageError, false); + } + image.addEventListener("load", onImageLoad, false); + image.addEventListener("error", onImageError, false); + if (url.slice(0, 5) !== "data:") { + if (this.crossOrigin !== void 0) image.crossOrigin = this.crossOrigin; + } + Cache.add(`image:${url}`, image); + scope.manager.itemStart(url); + image.src = url; + return image; + } +}; +var CubeTextureLoader = class extends Loader { + /** + * Constructs a new cube texture loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and pass the fully loaded cube texture + * to the `onLoad()` callback. The method also returns a new cube texture object which can + * directly be used for material creation. If you do it this way, the cube texture + * may pop up in your scene once the respective loading process is finished. + * + * @param {Array} urls - Array of 6 URLs to images, one for each side of the + * cube texture. The urls should be specified in the following order: pos-x, + * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well. + * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Unsupported in this loader. + * @param {onErrorCallback} onError - Executed when errors occur. + * @return {CubeTexture} The cube texture. + */ + load(urls, onLoad, onProgress, onError) { + const texture = new CubeTexture(); + texture.colorSpace = SRGBColorSpace; + const loader = new ImageLoader(this.manager); + loader.setCrossOrigin(this.crossOrigin); + loader.setPath(this.path); + let loaded = 0; + function loadTexture(i) { + loader.load(urls[i], function(image) { + texture.images[i] = image; + loaded++; + if (loaded === 6) { + texture.needsUpdate = true; + if (onLoad) onLoad(texture); + } + }, void 0, onError); + } + for (let i = 0; i < urls.length; ++i) { + loadTexture(i); + } + return texture; + } +}; +var DataTextureLoader = class extends Loader { + /** + * Constructs a new data texture loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and passes the loaded data texture + * to the `onLoad()` callback. The method also returns a new texture object which can + * directly be used for material creation. If you do it this way, the texture + * may pop up in your scene once the respective loading process is finished. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @param {onErrorCallback} onError - Executed when errors occur. + * @return {DataTexture} The data texture. + */ + load(url, onLoad, onProgress, onError) { + const scope = this; + const texture = new DataTexture(); + const loader = new FileLoader(this.manager); + loader.setResponseType("arraybuffer"); + loader.setRequestHeader(this.requestHeader); + loader.setPath(this.path); + loader.setWithCredentials(scope.withCredentials); + loader.load(url, function(buffer) { + let texData; + try { + texData = scope.parse(buffer); + } catch (error2) { + if (onError !== void 0) { + onError(error2); + } else { + error2(error2); + return; + } + } + if (texData.image !== void 0) { + texture.image = texData.image; + } else if (texData.data !== void 0) { + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + } + texture.wrapS = texData.wrapS !== void 0 ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = texData.wrapT !== void 0 ? texData.wrapT : ClampToEdgeWrapping; + texture.magFilter = texData.magFilter !== void 0 ? texData.magFilter : LinearFilter; + texture.minFilter = texData.minFilter !== void 0 ? texData.minFilter : LinearFilter; + texture.anisotropy = texData.anisotropy !== void 0 ? texData.anisotropy : 1; + if (texData.colorSpace !== void 0) { + texture.colorSpace = texData.colorSpace; + } + if (texData.flipY !== void 0) { + texture.flipY = texData.flipY; + } + if (texData.format !== void 0) { + texture.format = texData.format; + } + if (texData.type !== void 0) { + texture.type = texData.type; + } + if (texData.mipmaps !== void 0) { + texture.mipmaps = texData.mipmaps; + texture.minFilter = LinearMipmapLinearFilter; + } + if (texData.mipmapCount === 1) { + texture.minFilter = LinearFilter; + } + if (texData.generateMipmaps !== void 0) { + texture.generateMipmaps = texData.generateMipmaps; + } + texture.needsUpdate = true; + if (onLoad) onLoad(texture, texData); + }, onProgress, onError); + return texture; + } +}; +var TextureLoader = class extends Loader { + /** + * Constructs a new texture loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and pass the fully loaded texture + * to the `onLoad()` callback. The method also returns a new texture object which can + * directly be used for material creation. If you do it this way, the texture + * may pop up in your scene once the respective loading process is finished. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(Texture)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Unsupported in this loader. + * @param {onErrorCallback} onError - Executed when errors occur. + * @return {Texture} The texture. + */ + load(url, onLoad, onProgress, onError) { + const texture = new Texture(); + const loader = new ImageLoader(this.manager); + loader.setCrossOrigin(this.crossOrigin); + loader.setPath(this.path); + loader.load(url, function(image) { + texture.image = image; + texture.needsUpdate = true; + if (onLoad !== void 0) { + onLoad(texture); + } + }, onProgress, onError); + return texture; + } +}; +var Light = class extends Object3D { + /** + * Constructs a new light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity. + */ + constructor(color, intensity = 1) { + super(); + this.isLight = true; + this.type = "Light"; + this.color = new Color(color); + this.intensity = intensity; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.dispatchEvent({ type: "dispose" }); + } + copy(source, recursive) { + super.copy(source, recursive); + this.color.copy(source.color); + this.intensity = source.intensity; + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + return data; + } +}; +var HemisphereLight = class extends Light { + /** + * Constructs a new hemisphere light. + * + * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color. + * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color. + * @param {number} [intensity=1] - The light's strength/intensity. + */ + constructor(skyColor, groundColor, intensity) { + super(skyColor, intensity); + this.isHemisphereLight = true; + this.type = "HemisphereLight"; + this.position.copy(Object3D.DEFAULT_UP); + this.updateMatrix(); + this.groundColor = new Color(groundColor); + } + copy(source, recursive) { + super.copy(source, recursive); + this.groundColor.copy(source.groundColor); + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.groundColor = this.groundColor.getHex(); + return data; + } +}; +var _projScreenMatrix = new Matrix4(); +var _lightPositionWorld = new Vector3(); +var _lookTarget = new Vector3(); +var LightShadow = class { + /** + * Constructs a new light shadow. + * + * @param {Camera} camera - The light's view of the world. + */ + constructor(camera) { + this.camera = camera; + this.intensity = 1; + this.bias = 0; + this.normalBias = 0; + this.radius = 1; + this.blurSamples = 8; + this.mapSize = new Vector2(512, 512); + this.mapType = UnsignedByteType; + this.map = null; + this.mapPass = null; + this.matrix = new Matrix4(); + this.autoUpdate = true; + this.needsUpdate = false; + this._frustum = new Frustum(); + this._frameExtents = new Vector2(1, 1); + this._viewportCount = 1; + this._viewports = [ + new Vector4(0, 0, 1, 1) + ]; + } + /** + * Used internally by the renderer to get the number of viewports that need + * to be rendered for this shadow. + * + * @return {number} The viewport count. + */ + getViewportCount() { + return this._viewportCount; + } + /** + * Gets the shadow cameras frustum. Used internally by the renderer to cull objects. + * + * @return {Frustum} The shadow camera frustum. + */ + getFrustum() { + return this._frustum; + } + /** + * Update the matrices for the camera and shadow, used internally by the renderer. + * + * @param {Light} light - The light for which the shadow is being rendered. + */ + updateMatrices(light) { + const shadowCamera = this.camera; + const shadowMatrix = this.matrix; + _lightPositionWorld.setFromMatrixPosition(light.matrixWorld); + shadowCamera.position.copy(_lightPositionWorld); + _lookTarget.setFromMatrixPosition(light.target.matrixWorld); + shadowCamera.lookAt(_lookTarget); + shadowCamera.updateMatrixWorld(); + _projScreenMatrix.multiplyMatrices(shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse); + this._frustum.setFromProjectionMatrix(_projScreenMatrix, shadowCamera.coordinateSystem, shadowCamera.reversedDepth); + if (shadowCamera.reversedDepth) { + shadowMatrix.set( + 0.5, + 0, + 0, + 0.5, + 0, + 0.5, + 0, + 0.5, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ); + } else { + shadowMatrix.set( + 0.5, + 0, + 0, + 0.5, + 0, + 0.5, + 0, + 0.5, + 0, + 0, + 0.5, + 0.5, + 0, + 0, + 0, + 1 + ); + } + shadowMatrix.multiply(_projScreenMatrix); + } + /** + * Returns a viewport definition for the given viewport index. + * + * @param {number} viewportIndex - The viewport index. + * @return {Vector4} The viewport. + */ + getViewport(viewportIndex) { + return this._viewports[viewportIndex]; + } + /** + * Returns the frame extends. + * + * @return {Vector2} The frame extends. + */ + getFrameExtents() { + return this._frameExtents; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + if (this.map) { + this.map.dispose(); + } + if (this.mapPass) { + this.mapPass.dispose(); + } + } + /** + * Copies the values of the given light shadow instance to this instance. + * + * @param {LightShadow} source - The light shadow to copy. + * @return {LightShadow} A reference to this light shadow instance. + */ + copy(source) { + this.camera = source.camera.clone(); + this.intensity = source.intensity; + this.bias = source.bias; + this.radius = source.radius; + this.autoUpdate = source.autoUpdate; + this.needsUpdate = source.needsUpdate; + this.normalBias = source.normalBias; + this.blurSamples = source.blurSamples; + this.mapSize.copy(source.mapSize); + return this; + } + /** + * Returns a new light shadow instance with copied values from this instance. + * + * @return {LightShadow} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Serializes the light shadow into JSON. + * + * @return {Object} A JSON object representing the serialized light shadow. + * @see {@link ObjectLoader#parse} + */ + toJSON() { + const object = {}; + if (this.intensity !== 1) object.intensity = this.intensity; + if (this.bias !== 0) object.bias = this.bias; + if (this.normalBias !== 0) object.normalBias = this.normalBias; + if (this.radius !== 1) object.radius = this.radius; + if (this.mapSize.x !== 512 || this.mapSize.y !== 512) object.mapSize = this.mapSize.toArray(); + object.camera = this.camera.toJSON(false).object; + delete object.camera.matrix; + return object; + } +}; +var SpotLightShadow = class extends LightShadow { + /** + * Constructs a new spot light shadow. + */ + constructor() { + super(new PerspectiveCamera(50, 1, 0.5, 500)); + this.isSpotLightShadow = true; + this.focus = 1; + this.aspect = 1; + } + updateMatrices(light) { + const camera = this.camera; + const fov2 = RAD2DEG * 2 * light.angle * this.focus; + const aspect2 = this.mapSize.width / this.mapSize.height * this.aspect; + const far = light.distance || camera.far; + if (fov2 !== camera.fov || aspect2 !== camera.aspect || far !== camera.far) { + camera.fov = fov2; + camera.aspect = aspect2; + camera.far = far; + camera.updateProjectionMatrix(); + } + super.updateMatrices(light); + } + copy(source) { + super.copy(source); + this.focus = source.focus; + return this; + } +}; +var SpotLight = class extends Light { + /** + * Constructs a new spot light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd). + * @param {number} [distance=0] - Maximum range of the light. `0` means no limit. + * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`. + * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`. + * @param {number} [decay=2] - The amount the light dims along the distance of the light. + */ + constructor(color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2) { + super(color, intensity); + this.isSpotLight = true; + this.type = "SpotLight"; + this.position.copy(Object3D.DEFAULT_UP); + this.updateMatrix(); + this.target = new Object3D(); + this.distance = distance; + this.angle = angle; + this.penumbra = penumbra; + this.decay = decay; + this.map = null; + this.shadow = new SpotLightShadow(); + } + /** + * The light's power. Power is the luminous power of the light measured in lumens (lm). + * Changing the power will also change the light's intensity. + * + * @type {number} + */ + get power() { + return this.intensity * Math.PI; + } + set power(power) { + this.intensity = power / Math.PI; + } + dispose() { + super.dispose(); + this.shadow.dispose(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + this.target = source.target.clone(); + this.map = source.map; + this.shadow = source.shadow.clone(); + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.distance = this.distance; + data.object.angle = this.angle; + data.object.decay = this.decay; + data.object.penumbra = this.penumbra; + data.object.target = this.target.uuid; + if (this.map && this.map.isTexture) data.object.map = this.map.toJSON(meta).uuid; + data.object.shadow = this.shadow.toJSON(); + return data; + } +}; +var PointLightShadow = class extends LightShadow { + /** + * Constructs a new point light shadow. + */ + constructor() { + super(new PerspectiveCamera(90, 1, 0.5, 500)); + this.isPointLightShadow = true; + } +}; +var PointLight = class extends Light { + /** + * Constructs a new point light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd). + * @param {number} [distance=0] - Maximum range of the light. `0` means no limit. + * @param {number} [decay=2] - The amount the light dims along the distance of the light. + */ + constructor(color, intensity, distance = 0, decay = 2) { + super(color, intensity); + this.isPointLight = true; + this.type = "PointLight"; + this.distance = distance; + this.decay = decay; + this.shadow = new PointLightShadow(); + } + /** + * The light's power. Power is the luminous power of the light measured in lumens (lm). + * Changing the power will also change the light's intensity. + * + * @type {number} + */ + get power() { + return this.intensity * 4 * Math.PI; + } + set power(power) { + this.intensity = power / (4 * Math.PI); + } + dispose() { + super.dispose(); + this.shadow.dispose(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.distance = source.distance; + this.decay = source.decay; + this.shadow = source.shadow.clone(); + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.distance = this.distance; + data.object.decay = this.decay; + data.object.shadow = this.shadow.toJSON(); + return data; + } +}; +var OrthographicCamera = class extends Camera { + /** + * Constructs a new orthographic camera. + * + * @param {number} [left=-1] - The left plane of the camera's frustum. + * @param {number} [right=1] - The right plane of the camera's frustum. + * @param {number} [top=1] - The top plane of the camera's frustum. + * @param {number} [bottom=-1] - The bottom plane of the camera's frustum. + * @param {number} [near=0.1] - The camera's near plane. + * @param {number} [far=2000] - The camera's far plane. + */ + constructor(left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2e3) { + super(); + this.isOrthographicCamera = true; + this.type = "OrthographicCamera"; + this.zoom = 1; + this.view = null; + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + this.near = near; + this.far = far; + this.updateProjectionMatrix(); + } + copy(source, recursive) { + super.copy(source, recursive); + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign({}, source.view); + return this; + } + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * @param {number} fullWidth - The full width of multiview setup. + * @param {number} fullHeight - The full height of multiview setup. + * @param {number} x - The horizontal offset of the subcamera. + * @param {number} y - The vertical offset of the subcamera. + * @param {number} width - The width of subcamera. + * @param {number} height - The height of subcamera. + * @see {@link PerspectiveCamera#setViewOffset} + */ + setViewOffset(fullWidth, fullHeight, x, y, width, height) { + if (this.view === null) { + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1 + }; + } + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + this.updateProjectionMatrix(); + } + /** + * Removes the view offset from the projection matrix. + */ + clearViewOffset() { + if (this.view !== null) { + this.view.enabled = false; + } + this.updateProjectionMatrix(); + } + /** + * Updates the camera's projection matrix. Must be called after any change of + * camera properties. + */ + updateProjectionMatrix() { + const dx = (this.right - this.left) / (2 * this.zoom); + const dy = (this.top - this.bottom) / (2 * this.zoom); + const cx = (this.right + this.left) / 2; + const cy = (this.top + this.bottom) / 2; + let left = cx - dx; + let right = cx + dx; + let top = cy + dy; + let bottom = cy - dy; + if (this.view !== null && this.view.enabled) { + const scaleW = (this.right - this.left) / this.view.fullWidth / this.zoom; + const scaleH = (this.top - this.bottom) / this.view.fullHeight / this.zoom; + left += scaleW * this.view.offsetX; + right = left + scaleW * this.view.width; + top -= scaleH * this.view.offsetY; + bottom = top - scaleH * this.view.height; + } + this.projectionMatrix.makeOrthographic(left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth); + this.projectionMatrixInverse.copy(this.projectionMatrix).invert(); + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + if (this.view !== null) data.object.view = Object.assign({}, this.view); + return data; + } +}; +var DirectionalLightShadow = class extends LightShadow { + /** + * Constructs a new directional light shadow. + */ + constructor() { + super(new OrthographicCamera(-5, 5, 5, -5, 0.5, 500)); + this.isDirectionalLightShadow = true; + } +}; +var DirectionalLight = class extends Light { + /** + * Constructs a new directional light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity. + */ + constructor(color, intensity) { + super(color, intensity); + this.isDirectionalLight = true; + this.type = "DirectionalLight"; + this.position.copy(Object3D.DEFAULT_UP); + this.updateMatrix(); + this.target = new Object3D(); + this.shadow = new DirectionalLightShadow(); + } + dispose() { + super.dispose(); + this.shadow.dispose(); + } + copy(source) { + super.copy(source); + this.target = source.target.clone(); + this.shadow = source.shadow.clone(); + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.shadow = this.shadow.toJSON(); + data.object.target = this.target.uuid; + return data; + } +}; +var AmbientLight = class extends Light { + /** + * Constructs a new ambient light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity. + */ + constructor(color, intensity) { + super(color, intensity); + this.isAmbientLight = true; + this.type = "AmbientLight"; + } +}; +var RectAreaLight = class extends Light { + /** + * Constructs a new area light. + * + * @param {(number|Color|string)} [color=0xffffff] - The light's color. + * @param {number} [intensity=1] - The light's strength/intensity. + * @param {number} [width=10] - The width of the light. + * @param {number} [height=10] - The height of the light. + */ + constructor(color, intensity, width = 10, height = 10) { + super(color, intensity); + this.isRectAreaLight = true; + this.type = "RectAreaLight"; + this.width = width; + this.height = height; + } + /** + * The light's power. Power is the luminous power of the light measured in lumens (lm). + * Changing the power will also change the light's intensity. + * + * @type {number} + */ + get power() { + return this.intensity * this.width * this.height * Math.PI; + } + set power(power) { + this.intensity = power / (this.width * this.height * Math.PI); + } + copy(source) { + super.copy(source); + this.width = source.width; + this.height = source.height; + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.width = this.width; + data.object.height = this.height; + return data; + } +}; +var SphericalHarmonics3 = class { + /** + * Constructs a new spherical harmonics. + */ + constructor() { + this.isSphericalHarmonics3 = true; + this.coefficients = []; + for (let i = 0; i < 9; i++) { + this.coefficients.push(new Vector3()); + } + } + /** + * Sets the given SH coefficients to this instance by copying + * the values. + * + * @param {Array} coefficients - The SH coefficients. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + set(coefficients) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].copy(coefficients[i]); + } + return this; + } + /** + * Sets all SH coefficients to `0`. + * + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + zero() { + for (let i = 0; i < 9; i++) { + this.coefficients[i].set(0, 0, 0); + } + return this; + } + /** + * Returns the radiance in the direction of the given normal. + * + * @param {Vector3} normal - The normal vector (assumed to be unit length) + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The radiance. + */ + getAt(normal, target) { + const x = normal.x, y = normal.y, z = normal.z; + const coeff = this.coefficients; + target.copy(coeff[0]).multiplyScalar(0.282095); + target.addScaledVector(coeff[1], 0.488603 * y); + target.addScaledVector(coeff[2], 0.488603 * z); + target.addScaledVector(coeff[3], 0.488603 * x); + target.addScaledVector(coeff[4], 1.092548 * (x * y)); + target.addScaledVector(coeff[5], 1.092548 * (y * z)); + target.addScaledVector(coeff[6], 0.315392 * (3 * z * z - 1)); + target.addScaledVector(coeff[7], 1.092548 * (x * z)); + target.addScaledVector(coeff[8], 0.546274 * (x * x - y * y)); + return target; + } + /** + * Returns the irradiance (radiance convolved with cosine lobe) in the + * direction of the given normal. + * + * @param {Vector3} normal - The normal vector (assumed to be unit length) + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The irradiance. + */ + getIrradianceAt(normal, target) { + const x = normal.x, y = normal.y, z = normal.z; + const coeff = this.coefficients; + target.copy(coeff[0]).multiplyScalar(0.886227); + target.addScaledVector(coeff[1], 2 * 0.511664 * y); + target.addScaledVector(coeff[2], 2 * 0.511664 * z); + target.addScaledVector(coeff[3], 2 * 0.511664 * x); + target.addScaledVector(coeff[4], 2 * 0.429043 * x * y); + target.addScaledVector(coeff[5], 2 * 0.429043 * y * z); + target.addScaledVector(coeff[6], 0.743125 * z * z - 0.247708); + target.addScaledVector(coeff[7], 2 * 0.429043 * x * z); + target.addScaledVector(coeff[8], 0.429043 * (x * x - y * y)); + return target; + } + /** + * Adds the given SH to this instance. + * + * @param {SphericalHarmonics3} sh - The SH to add. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + add(sh) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].add(sh.coefficients[i]); + } + return this; + } + /** + * A convenience method for performing {@link SphericalHarmonics3#add} and + * {@link SphericalHarmonics3#scale} at once. + * + * @param {SphericalHarmonics3} sh - The SH to add. + * @param {number} s - The scale factor. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + addScaledSH(sh, s) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].addScaledVector(sh.coefficients[i], s); + } + return this; + } + /** + * Scales this SH by the given scale factor. + * + * @param {number} s - The scale factor. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + scale(s) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].multiplyScalar(s); + } + return this; + } + /** + * Linear interpolates between the given SH and this instance by the given + * alpha factor. + * + * @param {SphericalHarmonics3} sh - The SH to interpolate with. + * @param {number} alpha - The alpha factor. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + lerp(sh, alpha) { + for (let i = 0; i < 9; i++) { + this.coefficients[i].lerp(sh.coefficients[i], alpha); + } + return this; + } + /** + * Returns `true` if this spherical harmonics is equal with the given one. + * + * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality. + * @return {boolean} Whether this spherical harmonics is equal with the given one. + */ + equals(sh) { + for (let i = 0; i < 9; i++) { + if (!this.coefficients[i].equals(sh.coefficients[i])) { + return false; + } + } + return true; + } + /** + * Copies the values of the given spherical harmonics to this instance. + * + * @param {SphericalHarmonics3} sh - The spherical harmonics to copy. + * @return {SphericalHarmonics3} A reference to this spherical harmonics. + */ + copy(sh) { + return this.set(sh.coefficients); + } + /** + * Returns a new spherical harmonics with copied values from this instance. + * + * @return {SphericalHarmonics3} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Sets the SH coefficients of this instance from the given array. + * + * @param {Array} array - An array holding the SH coefficients. + * @param {number} [offset=0] - The array offset where to start copying. + * @return {SphericalHarmonics3} A clone of this instance. + */ + fromArray(array, offset = 0) { + const coefficients = this.coefficients; + for (let i = 0; i < 9; i++) { + coefficients[i].fromArray(array, offset + i * 3); + } + return this; + } + /** + * Returns an array with the SH coefficients, or copies them into the provided + * array. The coefficients are represented as numbers. + * + * @param {Array} [array=[]] - The target array. + * @param {number} [offset=0] - The array offset where to start copying. + * @return {Array} An array with flat SH coefficients. + */ + toArray(array = [], offset = 0) { + const coefficients = this.coefficients; + for (let i = 0; i < 9; i++) { + coefficients[i].toArray(array, offset + i * 3); + } + return array; + } + /** + * Computes the SH basis for the given normal vector. + * + * @param {Vector3} normal - The normal. + * @param {Array} shBasis - The target array holding the SH basis. + */ + static getBasisAt(normal, shBasis) { + const x = normal.x, y = normal.y, z = normal.z; + shBasis[0] = 0.282095; + shBasis[1] = 0.488603 * y; + shBasis[2] = 0.488603 * z; + shBasis[3] = 0.488603 * x; + shBasis[4] = 1.092548 * x * y; + shBasis[5] = 1.092548 * y * z; + shBasis[6] = 0.315392 * (3 * z * z - 1); + shBasis[7] = 1.092548 * x * z; + shBasis[8] = 0.546274 * (x * x - y * y); + } +}; +var LightProbe = class extends Light { + /** + * Constructs a new light probe. + * + * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information. + * @param {number} [intensity=1] - The light's strength/intensity. + */ + constructor(sh = new SphericalHarmonics3(), intensity = 1) { + super(void 0, intensity); + this.isLightProbe = true; + this.sh = sh; + } + copy(source) { + super.copy(source); + this.sh.copy(source.sh); + return this; + } + toJSON(meta) { + const data = super.toJSON(meta); + data.object.sh = this.sh.toArray(); + return data; + } +}; +var MaterialLoader = class _MaterialLoader extends Loader { + /** + * Constructs a new material loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + this.textures = {}; + } + /** + * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(Material)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @param {onErrorCallback} onError - Executed when errors occur. + */ + load(url, onLoad, onProgress, onError) { + const scope = this; + const loader = new FileLoader(scope.manager); + loader.setPath(scope.path); + loader.setRequestHeader(scope.requestHeader); + loader.setWithCredentials(scope.withCredentials); + loader.load(url, function(text) { + try { + onLoad(scope.parse(JSON.parse(text))); + } catch (e) { + if (onError) { + onError(e); + } else { + error(e); + } + scope.manager.itemError(url); + } + }, onProgress, onError); + } + /** + * Parses the given JSON object and returns a material. + * + * @param {Object} json - The serialized material. + * @return {Material} The parsed material. + */ + parse(json) { + const textures = this.textures; + function getTexture(name) { + if (textures[name] === void 0) { + warn("MaterialLoader: Undefined texture", name); + } + return textures[name]; + } + const material = this.createMaterialFromType(json.type); + if (json.uuid !== void 0) material.uuid = json.uuid; + if (json.name !== void 0) material.name = json.name; + if (json.color !== void 0 && material.color !== void 0) material.color.setHex(json.color); + if (json.roughness !== void 0) material.roughness = json.roughness; + if (json.metalness !== void 0) material.metalness = json.metalness; + if (json.sheen !== void 0) material.sheen = json.sheen; + if (json.sheenColor !== void 0) material.sheenColor = new Color().setHex(json.sheenColor); + if (json.sheenRoughness !== void 0) material.sheenRoughness = json.sheenRoughness; + if (json.emissive !== void 0 && material.emissive !== void 0) material.emissive.setHex(json.emissive); + if (json.specular !== void 0 && material.specular !== void 0) material.specular.setHex(json.specular); + if (json.specularIntensity !== void 0) material.specularIntensity = json.specularIntensity; + if (json.specularColor !== void 0 && material.specularColor !== void 0) material.specularColor.setHex(json.specularColor); + if (json.shininess !== void 0) material.shininess = json.shininess; + if (json.clearcoat !== void 0) material.clearcoat = json.clearcoat; + if (json.clearcoatRoughness !== void 0) material.clearcoatRoughness = json.clearcoatRoughness; + if (json.dispersion !== void 0) material.dispersion = json.dispersion; + if (json.iridescence !== void 0) material.iridescence = json.iridescence; + if (json.iridescenceIOR !== void 0) material.iridescenceIOR = json.iridescenceIOR; + if (json.iridescenceThicknessRange !== void 0) material.iridescenceThicknessRange = json.iridescenceThicknessRange; + if (json.transmission !== void 0) material.transmission = json.transmission; + if (json.thickness !== void 0) material.thickness = json.thickness; + if (json.attenuationDistance !== void 0) material.attenuationDistance = json.attenuationDistance; + if (json.attenuationColor !== void 0 && material.attenuationColor !== void 0) material.attenuationColor.setHex(json.attenuationColor); + if (json.anisotropy !== void 0) material.anisotropy = json.anisotropy; + if (json.anisotropyRotation !== void 0) material.anisotropyRotation = json.anisotropyRotation; + if (json.fog !== void 0) material.fog = json.fog; + if (json.flatShading !== void 0) material.flatShading = json.flatShading; + if (json.blending !== void 0) material.blending = json.blending; + if (json.combine !== void 0) material.combine = json.combine; + if (json.side !== void 0) material.side = json.side; + if (json.shadowSide !== void 0) material.shadowSide = json.shadowSide; + if (json.opacity !== void 0) material.opacity = json.opacity; + if (json.transparent !== void 0) material.transparent = json.transparent; + if (json.alphaTest !== void 0) material.alphaTest = json.alphaTest; + if (json.alphaHash !== void 0) material.alphaHash = json.alphaHash; + if (json.depthFunc !== void 0) material.depthFunc = json.depthFunc; + if (json.depthTest !== void 0) material.depthTest = json.depthTest; + if (json.depthWrite !== void 0) material.depthWrite = json.depthWrite; + if (json.colorWrite !== void 0) material.colorWrite = json.colorWrite; + if (json.blendSrc !== void 0) material.blendSrc = json.blendSrc; + if (json.blendDst !== void 0) material.blendDst = json.blendDst; + if (json.blendEquation !== void 0) material.blendEquation = json.blendEquation; + if (json.blendSrcAlpha !== void 0) material.blendSrcAlpha = json.blendSrcAlpha; + if (json.blendDstAlpha !== void 0) material.blendDstAlpha = json.blendDstAlpha; + if (json.blendEquationAlpha !== void 0) material.blendEquationAlpha = json.blendEquationAlpha; + if (json.blendColor !== void 0 && material.blendColor !== void 0) material.blendColor.setHex(json.blendColor); + if (json.blendAlpha !== void 0) material.blendAlpha = json.blendAlpha; + if (json.stencilWriteMask !== void 0) material.stencilWriteMask = json.stencilWriteMask; + if (json.stencilFunc !== void 0) material.stencilFunc = json.stencilFunc; + if (json.stencilRef !== void 0) material.stencilRef = json.stencilRef; + if (json.stencilFuncMask !== void 0) material.stencilFuncMask = json.stencilFuncMask; + if (json.stencilFail !== void 0) material.stencilFail = json.stencilFail; + if (json.stencilZFail !== void 0) material.stencilZFail = json.stencilZFail; + if (json.stencilZPass !== void 0) material.stencilZPass = json.stencilZPass; + if (json.stencilWrite !== void 0) material.stencilWrite = json.stencilWrite; + if (json.wireframe !== void 0) material.wireframe = json.wireframe; + if (json.wireframeLinewidth !== void 0) material.wireframeLinewidth = json.wireframeLinewidth; + if (json.wireframeLinecap !== void 0) material.wireframeLinecap = json.wireframeLinecap; + if (json.wireframeLinejoin !== void 0) material.wireframeLinejoin = json.wireframeLinejoin; + if (json.rotation !== void 0) material.rotation = json.rotation; + if (json.linewidth !== void 0) material.linewidth = json.linewidth; + if (json.dashSize !== void 0) material.dashSize = json.dashSize; + if (json.gapSize !== void 0) material.gapSize = json.gapSize; + if (json.scale !== void 0) material.scale = json.scale; + if (json.polygonOffset !== void 0) material.polygonOffset = json.polygonOffset; + if (json.polygonOffsetFactor !== void 0) material.polygonOffsetFactor = json.polygonOffsetFactor; + if (json.polygonOffsetUnits !== void 0) material.polygonOffsetUnits = json.polygonOffsetUnits; + if (json.dithering !== void 0) material.dithering = json.dithering; + if (json.alphaToCoverage !== void 0) material.alphaToCoverage = json.alphaToCoverage; + if (json.premultipliedAlpha !== void 0) material.premultipliedAlpha = json.premultipliedAlpha; + if (json.forceSinglePass !== void 0) material.forceSinglePass = json.forceSinglePass; + if (json.allowOverride !== void 0) material.allowOverride = json.allowOverride; + if (json.visible !== void 0) material.visible = json.visible; + if (json.toneMapped !== void 0) material.toneMapped = json.toneMapped; + if (json.userData !== void 0) material.userData = json.userData; + if (json.vertexColors !== void 0) { + if (typeof json.vertexColors === "number") { + material.vertexColors = json.vertexColors > 0 ? true : false; + } else { + material.vertexColors = json.vertexColors; + } + } + if (json.uniforms !== void 0) { + for (const name in json.uniforms) { + const uniform = json.uniforms[name]; + material.uniforms[name] = {}; + switch (uniform.type) { + case "t": + material.uniforms[name].value = getTexture(uniform.value); + break; + case "c": + material.uniforms[name].value = new Color().setHex(uniform.value); + break; + case "v2": + material.uniforms[name].value = new Vector2().fromArray(uniform.value); + break; + case "v3": + material.uniforms[name].value = new Vector3().fromArray(uniform.value); + break; + case "v4": + material.uniforms[name].value = new Vector4().fromArray(uniform.value); + break; + case "m3": + material.uniforms[name].value = new Matrix3().fromArray(uniform.value); + break; + case "m4": + material.uniforms[name].value = new Matrix4().fromArray(uniform.value); + break; + default: + material.uniforms[name].value = uniform.value; + } + } + } + if (json.defines !== void 0) material.defines = json.defines; + if (json.vertexShader !== void 0) material.vertexShader = json.vertexShader; + if (json.fragmentShader !== void 0) material.fragmentShader = json.fragmentShader; + if (json.glslVersion !== void 0) material.glslVersion = json.glslVersion; + if (json.extensions !== void 0) { + for (const key in json.extensions) { + material.extensions[key] = json.extensions[key]; + } + } + if (json.lights !== void 0) material.lights = json.lights; + if (json.clipping !== void 0) material.clipping = json.clipping; + if (json.size !== void 0) material.size = json.size; + if (json.sizeAttenuation !== void 0) material.sizeAttenuation = json.sizeAttenuation; + if (json.map !== void 0) material.map = getTexture(json.map); + if (json.matcap !== void 0) material.matcap = getTexture(json.matcap); + if (json.alphaMap !== void 0) material.alphaMap = getTexture(json.alphaMap); + if (json.bumpMap !== void 0) material.bumpMap = getTexture(json.bumpMap); + if (json.bumpScale !== void 0) material.bumpScale = json.bumpScale; + if (json.normalMap !== void 0) material.normalMap = getTexture(json.normalMap); + if (json.normalMapType !== void 0) material.normalMapType = json.normalMapType; + if (json.normalScale !== void 0) { + let normalScale = json.normalScale; + if (Array.isArray(normalScale) === false) { + normalScale = [normalScale, normalScale]; + } + material.normalScale = new Vector2().fromArray(normalScale); + } + if (json.displacementMap !== void 0) material.displacementMap = getTexture(json.displacementMap); + if (json.displacementScale !== void 0) material.displacementScale = json.displacementScale; + if (json.displacementBias !== void 0) material.displacementBias = json.displacementBias; + if (json.roughnessMap !== void 0) material.roughnessMap = getTexture(json.roughnessMap); + if (json.metalnessMap !== void 0) material.metalnessMap = getTexture(json.metalnessMap); + if (json.emissiveMap !== void 0) material.emissiveMap = getTexture(json.emissiveMap); + if (json.emissiveIntensity !== void 0) material.emissiveIntensity = json.emissiveIntensity; + if (json.specularMap !== void 0) material.specularMap = getTexture(json.specularMap); + if (json.specularIntensityMap !== void 0) material.specularIntensityMap = getTexture(json.specularIntensityMap); + if (json.specularColorMap !== void 0) material.specularColorMap = getTexture(json.specularColorMap); + if (json.envMap !== void 0) material.envMap = getTexture(json.envMap); + if (json.envMapRotation !== void 0) material.envMapRotation.fromArray(json.envMapRotation); + if (json.envMapIntensity !== void 0) material.envMapIntensity = json.envMapIntensity; + if (json.reflectivity !== void 0) material.reflectivity = json.reflectivity; + if (json.refractionRatio !== void 0) material.refractionRatio = json.refractionRatio; + if (json.lightMap !== void 0) material.lightMap = getTexture(json.lightMap); + if (json.lightMapIntensity !== void 0) material.lightMapIntensity = json.lightMapIntensity; + if (json.aoMap !== void 0) material.aoMap = getTexture(json.aoMap); + if (json.aoMapIntensity !== void 0) material.aoMapIntensity = json.aoMapIntensity; + if (json.gradientMap !== void 0) material.gradientMap = getTexture(json.gradientMap); + if (json.clearcoatMap !== void 0) material.clearcoatMap = getTexture(json.clearcoatMap); + if (json.clearcoatRoughnessMap !== void 0) material.clearcoatRoughnessMap = getTexture(json.clearcoatRoughnessMap); + if (json.clearcoatNormalMap !== void 0) material.clearcoatNormalMap = getTexture(json.clearcoatNormalMap); + if (json.clearcoatNormalScale !== void 0) material.clearcoatNormalScale = new Vector2().fromArray(json.clearcoatNormalScale); + if (json.iridescenceMap !== void 0) material.iridescenceMap = getTexture(json.iridescenceMap); + if (json.iridescenceThicknessMap !== void 0) material.iridescenceThicknessMap = getTexture(json.iridescenceThicknessMap); + if (json.transmissionMap !== void 0) material.transmissionMap = getTexture(json.transmissionMap); + if (json.thicknessMap !== void 0) material.thicknessMap = getTexture(json.thicknessMap); + if (json.anisotropyMap !== void 0) material.anisotropyMap = getTexture(json.anisotropyMap); + if (json.sheenColorMap !== void 0) material.sheenColorMap = getTexture(json.sheenColorMap); + if (json.sheenRoughnessMap !== void 0) material.sheenRoughnessMap = getTexture(json.sheenRoughnessMap); + return material; + } + /** + * Textures are not embedded in the material JSON so they have + * to be injected before the loading process starts. + * + * @param {Object} value - A dictionary holding textures for material properties. + * @return {MaterialLoader} A reference to this material loader. + */ + setTextures(value) { + this.textures = value; + return this; + } + /** + * Creates a material for the given type. + * + * @param {string} type - The material type. + * @return {Material} The new material. + */ + createMaterialFromType(type) { + return _MaterialLoader.createMaterialFromType(type); + } + /** + * Creates a material for the given type. + * + * @static + * @param {string} type - The material type. + * @return {Material} The new material. + */ + static createMaterialFromType(type) { + const materialLib = { + ShadowMaterial, + SpriteMaterial, + RawShaderMaterial, + ShaderMaterial, + PointsMaterial, + MeshPhysicalMaterial, + MeshStandardMaterial, + MeshPhongMaterial, + MeshToonMaterial, + MeshNormalMaterial, + MeshLambertMaterial, + MeshDepthMaterial, + MeshDistanceMaterial, + MeshBasicMaterial, + MeshMatcapMaterial, + LineDashedMaterial, + LineBasicMaterial, + Material + }; + return new materialLib[type](); + } +}; +var LoaderUtils = class { + /** + * Extracts the base URL from the given URL. + * + * @param {string} url -The URL to extract the base URL from. + * @return {string} The extracted base URL. + */ + static extractUrlBase(url) { + const index = url.lastIndexOf("/"); + if (index === -1) return "./"; + return url.slice(0, index + 1); + } + /** + * Resolves relative URLs against the given path. Absolute paths, data urls, + * and blob URLs will be returned as is. Invalid URLs will return an empty + * string. + * + * @param {string} url -The URL to resolve. + * @param {string} path - The base path for relative URLs to be resolved against. + * @return {string} The resolved URL. + */ + static resolveURL(url, path) { + if (typeof url !== "string" || url === "") return ""; + if (/^https?:\/\//i.test(path) && /^\//.test(url)) { + path = path.replace(/(^https?:\/\/[^\/]+).*/i, "$1"); + } + if (/^(https?:)?\/\//i.test(url)) return url; + if (/^data:.*,.*$/i.test(url)) return url; + if (/^blob:.*$/i.test(url)) return url; + return path + url; + } +}; +var InstancedBufferGeometry = class extends BufferGeometry { + /** + * Constructs a new instanced buffer geometry. + */ + constructor() { + super(); + this.isInstancedBufferGeometry = true; + this.type = "InstancedBufferGeometry"; + this.instanceCount = Infinity; + } + copy(source) { + super.copy(source); + this.instanceCount = source.instanceCount; + return this; + } + toJSON() { + const data = super.toJSON(); + data.instanceCount = this.instanceCount; + data.isInstancedBufferGeometry = true; + return data; + } +}; +var BufferGeometryLoader = class extends Loader { + /** + * Constructs a new geometry loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @param {onErrorCallback} onError - Executed when errors occur. + */ + load(url, onLoad, onProgress, onError) { + const scope = this; + const loader = new FileLoader(scope.manager); + loader.setPath(scope.path); + loader.setRequestHeader(scope.requestHeader); + loader.setWithCredentials(scope.withCredentials); + loader.load(url, function(text) { + try { + onLoad(scope.parse(JSON.parse(text))); + } catch (e) { + if (onError) { + onError(e); + } else { + error(e); + } + scope.manager.itemError(url); + } + }, onProgress, onError); + } + /** + * Parses the given JSON object and returns a geometry. + * + * @param {Object} json - The serialized geometry. + * @return {BufferGeometry} The parsed geometry. + */ + parse(json) { + const interleavedBufferMap = {}; + const arrayBufferMap = {}; + function getInterleavedBuffer(json2, uuid) { + if (interleavedBufferMap[uuid] !== void 0) return interleavedBufferMap[uuid]; + const interleavedBuffers = json2.interleavedBuffers; + const interleavedBuffer = interleavedBuffers[uuid]; + const buffer = getArrayBuffer(json2, interleavedBuffer.buffer); + const array = getTypedArray(interleavedBuffer.type, buffer); + const ib = new InterleavedBuffer(array, interleavedBuffer.stride); + ib.uuid = interleavedBuffer.uuid; + interleavedBufferMap[uuid] = ib; + return ib; + } + function getArrayBuffer(json2, uuid) { + if (arrayBufferMap[uuid] !== void 0) return arrayBufferMap[uuid]; + const arrayBuffers = json2.arrayBuffers; + const arrayBuffer = arrayBuffers[uuid]; + const ab = new Uint32Array(arrayBuffer).buffer; + arrayBufferMap[uuid] = ab; + return ab; + } + const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry(); + const index = json.data.index; + if (index !== void 0) { + const typedArray = getTypedArray(index.type, index.array); + geometry.setIndex(new BufferAttribute(typedArray, 1)); + } + const attributes = json.data.attributes; + for (const key in attributes) { + const attribute = attributes[key]; + let bufferAttribute; + if (attribute.isInterleavedBufferAttribute) { + const interleavedBuffer = getInterleavedBuffer(json.data, attribute.data); + bufferAttribute = new InterleavedBufferAttribute(interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized); + } else { + const typedArray = getTypedArray(attribute.type, attribute.array); + const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute; + bufferAttribute = new bufferAttributeConstr(typedArray, attribute.itemSize, attribute.normalized); + } + if (attribute.name !== void 0) bufferAttribute.name = attribute.name; + if (attribute.usage !== void 0) bufferAttribute.setUsage(attribute.usage); + geometry.setAttribute(key, bufferAttribute); + } + const morphAttributes = json.data.morphAttributes; + if (morphAttributes) { + for (const key in morphAttributes) { + const attributeArray = morphAttributes[key]; + const array = []; + for (let i = 0, il = attributeArray.length; i < il; i++) { + const attribute = attributeArray[i]; + let bufferAttribute; + if (attribute.isInterleavedBufferAttribute) { + const interleavedBuffer = getInterleavedBuffer(json.data, attribute.data); + bufferAttribute = new InterleavedBufferAttribute(interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized); + } else { + const typedArray = getTypedArray(attribute.type, attribute.array); + bufferAttribute = new BufferAttribute(typedArray, attribute.itemSize, attribute.normalized); + } + if (attribute.name !== void 0) bufferAttribute.name = attribute.name; + array.push(bufferAttribute); + } + geometry.morphAttributes[key] = array; + } + } + const morphTargetsRelative = json.data.morphTargetsRelative; + if (morphTargetsRelative) { + geometry.morphTargetsRelative = true; + } + const groups = json.data.groups || json.data.drawcalls || json.data.offsets; + if (groups !== void 0) { + for (let i = 0, n = groups.length; i !== n; ++i) { + const group = groups[i]; + geometry.addGroup(group.start, group.count, group.materialIndex); + } + } + const boundingSphere = json.data.boundingSphere; + if (boundingSphere !== void 0) { + geometry.boundingSphere = new Sphere().fromJSON(boundingSphere); + } + if (json.name) geometry.name = json.name; + if (json.userData) geometry.userData = json.userData; + return geometry; + } +}; +var ObjectLoader = class extends Loader { + /** + * Constructs a new object loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(Object3D)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @param {onErrorCallback} onError - Executed when errors occur. + */ + load(url, onLoad, onProgress, onError) { + const scope = this; + const path = this.path === "" ? LoaderUtils.extractUrlBase(url) : this.path; + this.resourcePath = this.resourcePath || path; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(text) { + let json = null; + try { + json = JSON.parse(text); + } catch (error2) { + if (onError !== void 0) onError(error2); + error2("ObjectLoader: Can't parse " + url + ".", error2.message); + return; + } + const metadata = json.metadata; + if (metadata === void 0 || metadata.type === void 0 || metadata.type.toLowerCase() === "geometry") { + if (onError !== void 0) onError(new Error("THREE.ObjectLoader: Can't load " + url)); + error("ObjectLoader: Can't load " + url); + return; + } + scope.parse(json, onLoad); + }, onProgress, onError); + } + /** + * Async version of {@link ObjectLoader#load}. + * + * @async + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @return {Promise} A Promise that resolves with the loaded 3D object. + */ + async loadAsync(url, onProgress) { + const scope = this; + const path = this.path === "" ? LoaderUtils.extractUrlBase(url) : this.path; + this.resourcePath = this.resourcePath || path; + const loader = new FileLoader(this.manager); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + const text = await loader.loadAsync(url, onProgress); + const json = JSON.parse(text); + const metadata = json.metadata; + if (metadata === void 0 || metadata.type === void 0 || metadata.type.toLowerCase() === "geometry") { + throw new Error("THREE.ObjectLoader: Can't load " + url); + } + return await scope.parseAsync(json); + } + /** + * Parses the given JSON. This is used internally by {@link ObjectLoader#load} + * but can also be used directly to parse a previously loaded JSON structure. + * + * @param {Object} json - The serialized 3D object. + * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded. + * @return {Object3D} The parsed 3D object. + */ + parse(json, onLoad) { + const animations = this.parseAnimations(json.animations); + const shapes = this.parseShapes(json.shapes); + const geometries = this.parseGeometries(json.geometries, shapes); + const images = this.parseImages(json.images, function() { + if (onLoad !== void 0) onLoad(object); + }); + const textures = this.parseTextures(json.textures, images); + const materials = this.parseMaterials(json.materials, textures); + const object = this.parseObject(json.object, geometries, materials, textures, animations); + const skeletons = this.parseSkeletons(json.skeletons, object); + this.bindSkeletons(object, skeletons); + this.bindLightTargets(object); + if (onLoad !== void 0) { + let hasImages = false; + for (const uuid in images) { + if (images[uuid].data instanceof HTMLImageElement) { + hasImages = true; + break; + } + } + if (hasImages === false) onLoad(object); + } + return object; + } + /** + * Async version of {@link ObjectLoader#parse}. + * + * @param {Object} json - The serialized 3D object. + * @return {Promise} A Promise that resolves with the parsed 3D object. + */ + async parseAsync(json) { + const animations = this.parseAnimations(json.animations); + const shapes = this.parseShapes(json.shapes); + const geometries = this.parseGeometries(json.geometries, shapes); + const images = await this.parseImagesAsync(json.images); + const textures = this.parseTextures(json.textures, images); + const materials = this.parseMaterials(json.materials, textures); + const object = this.parseObject(json.object, geometries, materials, textures, animations); + const skeletons = this.parseSkeletons(json.skeletons, object); + this.bindSkeletons(object, skeletons); + this.bindLightTargets(object); + return object; + } + // internals + parseShapes(json) { + const shapes = {}; + if (json !== void 0) { + for (let i = 0, l = json.length; i < l; i++) { + const shape = new Shape().fromJSON(json[i]); + shapes[shape.uuid] = shape; + } + } + return shapes; + } + parseSkeletons(json, object) { + const skeletons = {}; + const bones = {}; + object.traverse(function(child) { + if (child.isBone) bones[child.uuid] = child; + }); + if (json !== void 0) { + for (let i = 0, l = json.length; i < l; i++) { + const skeleton = new Skeleton().fromJSON(json[i], bones); + skeletons[skeleton.uuid] = skeleton; + } + } + return skeletons; + } + parseGeometries(json, shapes) { + const geometries = {}; + if (json !== void 0) { + const bufferGeometryLoader = new BufferGeometryLoader(); + for (let i = 0, l = json.length; i < l; i++) { + let geometry; + const data = json[i]; + switch (data.type) { + case "BufferGeometry": + case "InstancedBufferGeometry": + geometry = bufferGeometryLoader.parse(data); + break; + default: + if (data.type in Geometries) { + geometry = Geometries[data.type].fromJSON(data, shapes); + } else { + warn(`ObjectLoader: Unsupported geometry type "${data.type}"`); + } + } + geometry.uuid = data.uuid; + if (data.name !== void 0) geometry.name = data.name; + if (data.userData !== void 0) geometry.userData = data.userData; + geometries[data.uuid] = geometry; + } + } + return geometries; + } + parseMaterials(json, textures) { + const cache = {}; + const materials = {}; + if (json !== void 0) { + const loader = new MaterialLoader(); + loader.setTextures(textures); + for (let i = 0, l = json.length; i < l; i++) { + const data = json[i]; + if (cache[data.uuid] === void 0) { + cache[data.uuid] = loader.parse(data); + } + materials[data.uuid] = cache[data.uuid]; + } + } + return materials; + } + parseAnimations(json) { + const animations = {}; + if (json !== void 0) { + for (let i = 0; i < json.length; i++) { + const data = json[i]; + const clip = AnimationClip.parse(data); + animations[clip.uuid] = clip; + } + } + return animations; + } + parseImages(json, onLoad) { + const scope = this; + const images = {}; + let loader; + function loadImage(url) { + scope.manager.itemStart(url); + return loader.load(url, function() { + scope.manager.itemEnd(url); + }, void 0, function() { + scope.manager.itemError(url); + scope.manager.itemEnd(url); + }); + } + function deserializeImage(image) { + if (typeof image === "string") { + const url = image; + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(url) ? url : scope.resourcePath + url; + return loadImage(path); + } else { + if (image.data) { + return { + data: getTypedArray(image.type, image.data), + width: image.width, + height: image.height + }; + } else { + return null; + } + } + } + if (json !== void 0 && json.length > 0) { + const manager = new LoadingManager(onLoad); + loader = new ImageLoader(manager); + loader.setCrossOrigin(this.crossOrigin); + for (let i = 0, il = json.length; i < il; i++) { + const image = json[i]; + const url = image.url; + if (Array.isArray(url)) { + const imageArray = []; + for (let j = 0, jl = url.length; j < jl; j++) { + const currentUrl = url[j]; + const deserializedImage = deserializeImage(currentUrl); + if (deserializedImage !== null) { + if (deserializedImage instanceof HTMLImageElement) { + imageArray.push(deserializedImage); + } else { + imageArray.push(new DataTexture(deserializedImage.data, deserializedImage.width, deserializedImage.height)); + } + } + } + images[image.uuid] = new Source(imageArray); + } else { + const deserializedImage = deserializeImage(image.url); + images[image.uuid] = new Source(deserializedImage); + } + } + } + return images; + } + async parseImagesAsync(json) { + const scope = this; + const images = {}; + let loader; + async function deserializeImage(image) { + if (typeof image === "string") { + const url = image; + const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(url) ? url : scope.resourcePath + url; + return await loader.loadAsync(path); + } else { + if (image.data) { + return { + data: getTypedArray(image.type, image.data), + width: image.width, + height: image.height + }; + } else { + return null; + } + } + } + if (json !== void 0 && json.length > 0) { + loader = new ImageLoader(this.manager); + loader.setCrossOrigin(this.crossOrigin); + for (let i = 0, il = json.length; i < il; i++) { + const image = json[i]; + const url = image.url; + if (Array.isArray(url)) { + const imageArray = []; + for (let j = 0, jl = url.length; j < jl; j++) { + const currentUrl = url[j]; + const deserializedImage = await deserializeImage(currentUrl); + if (deserializedImage !== null) { + if (deserializedImage instanceof HTMLImageElement) { + imageArray.push(deserializedImage); + } else { + imageArray.push(new DataTexture(deserializedImage.data, deserializedImage.width, deserializedImage.height)); + } + } + } + images[image.uuid] = new Source(imageArray); + } else { + const deserializedImage = await deserializeImage(image.url); + images[image.uuid] = new Source(deserializedImage); + } + } + } + return images; + } + parseTextures(json, images) { + function parseConstant(value, type) { + if (typeof value === "number") return value; + warn("ObjectLoader.parseTexture: Constant should be in numeric form.", value); + return type[value]; + } + const textures = {}; + if (json !== void 0) { + for (let i = 0, l = json.length; i < l; i++) { + const data = json[i]; + if (data.image === void 0) { + warn('ObjectLoader: No "image" specified for', data.uuid); + } + if (images[data.image] === void 0) { + warn("ObjectLoader: Undefined image", data.image); + } + const source = images[data.image]; + const image = source.data; + let texture; + if (Array.isArray(image)) { + texture = new CubeTexture(); + if (image.length === 6) texture.needsUpdate = true; + } else { + if (image && image.data) { + texture = new DataTexture(); + } else { + texture = new Texture(); + } + if (image) texture.needsUpdate = true; + } + texture.source = source; + texture.uuid = data.uuid; + if (data.name !== void 0) texture.name = data.name; + if (data.mapping !== void 0) texture.mapping = parseConstant(data.mapping, TEXTURE_MAPPING); + if (data.channel !== void 0) texture.channel = data.channel; + if (data.offset !== void 0) texture.offset.fromArray(data.offset); + if (data.repeat !== void 0) texture.repeat.fromArray(data.repeat); + if (data.center !== void 0) texture.center.fromArray(data.center); + if (data.rotation !== void 0) texture.rotation = data.rotation; + if (data.wrap !== void 0) { + texture.wrapS = parseConstant(data.wrap[0], TEXTURE_WRAPPING); + texture.wrapT = parseConstant(data.wrap[1], TEXTURE_WRAPPING); + } + if (data.format !== void 0) texture.format = data.format; + if (data.internalFormat !== void 0) texture.internalFormat = data.internalFormat; + if (data.type !== void 0) texture.type = data.type; + if (data.colorSpace !== void 0) texture.colorSpace = data.colorSpace; + if (data.minFilter !== void 0) texture.minFilter = parseConstant(data.minFilter, TEXTURE_FILTER); + if (data.magFilter !== void 0) texture.magFilter = parseConstant(data.magFilter, TEXTURE_FILTER); + if (data.anisotropy !== void 0) texture.anisotropy = data.anisotropy; + if (data.flipY !== void 0) texture.flipY = data.flipY; + if (data.generateMipmaps !== void 0) texture.generateMipmaps = data.generateMipmaps; + if (data.premultiplyAlpha !== void 0) texture.premultiplyAlpha = data.premultiplyAlpha; + if (data.unpackAlignment !== void 0) texture.unpackAlignment = data.unpackAlignment; + if (data.compareFunction !== void 0) texture.compareFunction = data.compareFunction; + if (data.userData !== void 0) texture.userData = data.userData; + textures[data.uuid] = texture; + } + } + return textures; + } + parseObject(data, geometries, materials, textures, animations) { + let object; + function getGeometry(name) { + if (geometries[name] === void 0) { + warn("ObjectLoader: Undefined geometry", name); + } + return geometries[name]; + } + function getMaterial(name) { + if (name === void 0) return void 0; + if (Array.isArray(name)) { + const array = []; + for (let i = 0, l = name.length; i < l; i++) { + const uuid = name[i]; + if (materials[uuid] === void 0) { + warn("ObjectLoader: Undefined material", uuid); + } + array.push(materials[uuid]); + } + return array; + } + if (materials[name] === void 0) { + warn("ObjectLoader: Undefined material", name); + } + return materials[name]; + } + function getTexture(uuid) { + if (textures[uuid] === void 0) { + warn("ObjectLoader: Undefined texture", uuid); + } + return textures[uuid]; + } + let geometry, material; + switch (data.type) { + case "Scene": + object = new Scene(); + if (data.background !== void 0) { + if (Number.isInteger(data.background)) { + object.background = new Color(data.background); + } else { + object.background = getTexture(data.background); + } + } + if (data.environment !== void 0) { + object.environment = getTexture(data.environment); + } + if (data.fog !== void 0) { + if (data.fog.type === "Fog") { + object.fog = new Fog(data.fog.color, data.fog.near, data.fog.far); + } else if (data.fog.type === "FogExp2") { + object.fog = new FogExp2(data.fog.color, data.fog.density); + } + if (data.fog.name !== "") { + object.fog.name = data.fog.name; + } + } + if (data.backgroundBlurriness !== void 0) object.backgroundBlurriness = data.backgroundBlurriness; + if (data.backgroundIntensity !== void 0) object.backgroundIntensity = data.backgroundIntensity; + if (data.backgroundRotation !== void 0) object.backgroundRotation.fromArray(data.backgroundRotation); + if (data.environmentIntensity !== void 0) object.environmentIntensity = data.environmentIntensity; + if (data.environmentRotation !== void 0) object.environmentRotation.fromArray(data.environmentRotation); + break; + case "PerspectiveCamera": + object = new PerspectiveCamera(data.fov, data.aspect, data.near, data.far); + if (data.focus !== void 0) object.focus = data.focus; + if (data.zoom !== void 0) object.zoom = data.zoom; + if (data.filmGauge !== void 0) object.filmGauge = data.filmGauge; + if (data.filmOffset !== void 0) object.filmOffset = data.filmOffset; + if (data.view !== void 0) object.view = Object.assign({}, data.view); + break; + case "OrthographicCamera": + object = new OrthographicCamera(data.left, data.right, data.top, data.bottom, data.near, data.far); + if (data.zoom !== void 0) object.zoom = data.zoom; + if (data.view !== void 0) object.view = Object.assign({}, data.view); + break; + case "AmbientLight": + object = new AmbientLight(data.color, data.intensity); + break; + case "DirectionalLight": + object = new DirectionalLight(data.color, data.intensity); + object.target = data.target || ""; + break; + case "PointLight": + object = new PointLight(data.color, data.intensity, data.distance, data.decay); + break; + case "RectAreaLight": + object = new RectAreaLight(data.color, data.intensity, data.width, data.height); + break; + case "SpotLight": + object = new SpotLight(data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay); + object.target = data.target || ""; + break; + case "HemisphereLight": + object = new HemisphereLight(data.color, data.groundColor, data.intensity); + break; + case "LightProbe": + const sh = new SphericalHarmonics3().fromArray(data.sh); + object = new LightProbe(sh, data.intensity); + break; + case "SkinnedMesh": + geometry = getGeometry(data.geometry); + material = getMaterial(data.material); + object = new SkinnedMesh(geometry, material); + if (data.bindMode !== void 0) object.bindMode = data.bindMode; + if (data.bindMatrix !== void 0) object.bindMatrix.fromArray(data.bindMatrix); + if (data.skeleton !== void 0) object.skeleton = data.skeleton; + break; + case "Mesh": + geometry = getGeometry(data.geometry); + material = getMaterial(data.material); + object = new Mesh(geometry, material); + break; + case "InstancedMesh": + geometry = getGeometry(data.geometry); + material = getMaterial(data.material); + const count = data.count; + const instanceMatrix = data.instanceMatrix; + const instanceColor = data.instanceColor; + object = new InstancedMesh(geometry, material, count); + object.instanceMatrix = new InstancedBufferAttribute(new Float32Array(instanceMatrix.array), 16); + if (instanceColor !== void 0) object.instanceColor = new InstancedBufferAttribute(new Float32Array(instanceColor.array), instanceColor.itemSize); + break; + case "BatchedMesh": + geometry = getGeometry(data.geometry); + material = getMaterial(data.material); + object = new BatchedMesh(data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material); + object.geometry = geometry; + object.perObjectFrustumCulled = data.perObjectFrustumCulled; + object.sortObjects = data.sortObjects; + object._drawRanges = data.drawRanges; + object._reservedRanges = data.reservedRanges; + object._geometryInfo = data.geometryInfo.map((info) => { + let box = null; + let sphere = null; + if (info.boundingBox !== void 0) { + box = new Box3().fromJSON(info.boundingBox); + } + if (info.boundingSphere !== void 0) { + sphere = new Sphere().fromJSON(info.boundingSphere); + } + return { + ...info, + boundingBox: box, + boundingSphere: sphere + }; + }); + object._instanceInfo = data.instanceInfo; + object._availableInstanceIds = data._availableInstanceIds; + object._availableGeometryIds = data._availableGeometryIds; + object._nextIndexStart = data.nextIndexStart; + object._nextVertexStart = data.nextVertexStart; + object._geometryCount = data.geometryCount; + object._maxInstanceCount = data.maxInstanceCount; + object._maxVertexCount = data.maxVertexCount; + object._maxIndexCount = data.maxIndexCount; + object._geometryInitialized = data.geometryInitialized; + object._matricesTexture = getTexture(data.matricesTexture.uuid); + object._indirectTexture = getTexture(data.indirectTexture.uuid); + if (data.colorsTexture !== void 0) { + object._colorsTexture = getTexture(data.colorsTexture.uuid); + } + if (data.boundingSphere !== void 0) { + object.boundingSphere = new Sphere().fromJSON(data.boundingSphere); + } + if (data.boundingBox !== void 0) { + object.boundingBox = new Box3().fromJSON(data.boundingBox); + } + break; + case "LOD": + object = new LOD(); + break; + case "Line": + object = new Line(getGeometry(data.geometry), getMaterial(data.material)); + break; + case "LineLoop": + object = new LineLoop(getGeometry(data.geometry), getMaterial(data.material)); + break; + case "LineSegments": + object = new LineSegments(getGeometry(data.geometry), getMaterial(data.material)); + break; + case "PointCloud": + case "Points": + object = new Points(getGeometry(data.geometry), getMaterial(data.material)); + break; + case "Sprite": + object = new Sprite(getMaterial(data.material)); + break; + case "Group": + object = new Group(); + break; + case "Bone": + object = new Bone(); + break; + default: + object = new Object3D(); + } + object.uuid = data.uuid; + if (data.name !== void 0) object.name = data.name; + if (data.matrix !== void 0) { + object.matrix.fromArray(data.matrix); + if (data.matrixAutoUpdate !== void 0) object.matrixAutoUpdate = data.matrixAutoUpdate; + if (object.matrixAutoUpdate) object.matrix.decompose(object.position, object.quaternion, object.scale); + } else { + if (data.position !== void 0) object.position.fromArray(data.position); + if (data.rotation !== void 0) object.rotation.fromArray(data.rotation); + if (data.quaternion !== void 0) object.quaternion.fromArray(data.quaternion); + if (data.scale !== void 0) object.scale.fromArray(data.scale); + } + if (data.up !== void 0) object.up.fromArray(data.up); + if (data.castShadow !== void 0) object.castShadow = data.castShadow; + if (data.receiveShadow !== void 0) object.receiveShadow = data.receiveShadow; + if (data.shadow) { + if (data.shadow.intensity !== void 0) object.shadow.intensity = data.shadow.intensity; + if (data.shadow.bias !== void 0) object.shadow.bias = data.shadow.bias; + if (data.shadow.normalBias !== void 0) object.shadow.normalBias = data.shadow.normalBias; + if (data.shadow.radius !== void 0) object.shadow.radius = data.shadow.radius; + if (data.shadow.mapSize !== void 0) object.shadow.mapSize.fromArray(data.shadow.mapSize); + if (data.shadow.camera !== void 0) object.shadow.camera = this.parseObject(data.shadow.camera); + } + if (data.visible !== void 0) object.visible = data.visible; + if (data.frustumCulled !== void 0) object.frustumCulled = data.frustumCulled; + if (data.renderOrder !== void 0) object.renderOrder = data.renderOrder; + if (data.userData !== void 0) object.userData = data.userData; + if (data.layers !== void 0) object.layers.mask = data.layers; + if (data.children !== void 0) { + const children = data.children; + for (let i = 0; i < children.length; i++) { + object.add(this.parseObject(children[i], geometries, materials, textures, animations)); + } + } + if (data.animations !== void 0) { + const objectAnimations = data.animations; + for (let i = 0; i < objectAnimations.length; i++) { + const uuid = objectAnimations[i]; + object.animations.push(animations[uuid]); + } + } + if (data.type === "LOD") { + if (data.autoUpdate !== void 0) object.autoUpdate = data.autoUpdate; + const levels = data.levels; + for (let l = 0; l < levels.length; l++) { + const level = levels[l]; + const child = object.getObjectByProperty("uuid", level.object); + if (child !== void 0) { + object.addLevel(child, level.distance, level.hysteresis); + } + } + } + return object; + } + bindSkeletons(object, skeletons) { + if (Object.keys(skeletons).length === 0) return; + object.traverse(function(child) { + if (child.isSkinnedMesh === true && child.skeleton !== void 0) { + const skeleton = skeletons[child.skeleton]; + if (skeleton === void 0) { + warn("ObjectLoader: No skeleton found with UUID:", child.skeleton); + } else { + child.bind(skeleton, child.bindMatrix); + } + } + }); + } + bindLightTargets(object) { + object.traverse(function(child) { + if (child.isDirectionalLight || child.isSpotLight) { + const uuid = child.target; + const target = object.getObjectByProperty("uuid", uuid); + if (target !== void 0) { + child.target = target; + } else { + child.target = new Object3D(); + } + } + }); + } +}; +var TEXTURE_MAPPING = { + UVMapping, + CubeReflectionMapping, + CubeRefractionMapping, + EquirectangularReflectionMapping, + EquirectangularRefractionMapping, + CubeUVReflectionMapping +}; +var TEXTURE_WRAPPING = { + RepeatWrapping, + ClampToEdgeWrapping, + MirroredRepeatWrapping +}; +var TEXTURE_FILTER = { + NearestFilter, + NearestMipmapNearestFilter, + NearestMipmapLinearFilter, + LinearFilter, + LinearMipmapNearestFilter, + LinearMipmapLinearFilter +}; +var _errorMap = /* @__PURE__ */ new WeakMap(); +var ImageBitmapLoader = class extends Loader { + /** + * Constructs a new image bitmap loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + this.isImageBitmapLoader = true; + if (typeof createImageBitmap === "undefined") { + warn("ImageBitmapLoader: createImageBitmap() not supported."); + } + if (typeof fetch === "undefined") { + warn("ImageBitmapLoader: fetch() not supported."); + } + this.options = { premultiplyAlpha: "none" }; + this._abortController = new AbortController(); + } + /** + * Sets the given loader options. The structure of the object must match the `options` parameter of + * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap). + * + * @param {Object} options - The loader options to set. + * @return {ImageBitmapLoader} A reference to this image bitmap loader. + */ + setOptions(options) { + this.options = options; + return this; + } + /** + * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Unsupported in this loader. + * @param {onErrorCallback} onError - Executed when errors occur. + * @return {ImageBitmap|undefined} The image bitmap. + */ + load(url, onLoad, onProgress, onError) { + if (url === void 0) url = ""; + if (this.path !== void 0) url = this.path + url; + url = this.manager.resolveURL(url); + const scope = this; + const cached = Cache.get(`image-bitmap:${url}`); + if (cached !== void 0) { + scope.manager.itemStart(url); + if (cached.then) { + cached.then((imageBitmap) => { + if (_errorMap.has(cached) === true) { + if (onError) onError(_errorMap.get(cached)); + scope.manager.itemError(url); + scope.manager.itemEnd(url); + } else { + if (onLoad) onLoad(imageBitmap); + scope.manager.itemEnd(url); + return imageBitmap; + } + }); + return; + } + setTimeout(function() { + if (onLoad) onLoad(cached); + scope.manager.itemEnd(url); + }, 0); + return cached; + } + const fetchOptions = {}; + fetchOptions.credentials = this.crossOrigin === "anonymous" ? "same-origin" : "include"; + fetchOptions.headers = this.requestHeader; + fetchOptions.signal = typeof AbortSignal.any === "function" ? AbortSignal.any([this._abortController.signal, this.manager.abortController.signal]) : this._abortController.signal; + const promise = fetch(url, fetchOptions).then(function(res) { + return res.blob(); + }).then(function(blob) { + return createImageBitmap(blob, Object.assign(scope.options, { colorSpaceConversion: "none" })); + }).then(function(imageBitmap) { + Cache.add(`image-bitmap:${url}`, imageBitmap); + if (onLoad) onLoad(imageBitmap); + scope.manager.itemEnd(url); + return imageBitmap; + }).catch(function(e) { + if (onError) onError(e); + _errorMap.set(promise, e); + Cache.remove(`image-bitmap:${url}`); + scope.manager.itemError(url); + scope.manager.itemEnd(url); + }); + Cache.add(`image-bitmap:${url}`, promise); + scope.manager.itemStart(url); + } + /** + * Aborts ongoing fetch requests. + * + * @return {ImageBitmapLoader} A reference to this instance. + */ + abort() { + this._abortController.abort(); + this._abortController = new AbortController(); + return this; + } +}; +var _context; +var AudioContext = class { + /** + * Returns the global native audio context. + * + * @return {AudioContext} The native audio context. + */ + static getContext() { + if (_context === void 0) { + _context = new (window.AudioContext || window.webkitAudioContext)(); + } + return _context; + } + /** + * Allows to set the global native audio context from outside. + * + * @param {AudioContext} value - The native context to set. + */ + static setContext(value) { + _context = value; + } +}; +var AudioLoader = class extends Loader { + /** + * Constructs a new audio loader. + * + * @param {LoadingManager} [manager] - The loading manager. + */ + constructor(manager) { + super(manager); + } + /** + * Starts loading from the given URL and passes the loaded audio buffer + * to the `onLoad()` callback. + * + * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI. + * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished. + * @param {onProgressCallback} onProgress - Executed while the loading is in progress. + * @param {onErrorCallback} onError - Executed when errors occur. + */ + load(url, onLoad, onProgress, onError) { + const scope = this; + const loader = new FileLoader(this.manager); + loader.setResponseType("arraybuffer"); + loader.setPath(this.path); + loader.setRequestHeader(this.requestHeader); + loader.setWithCredentials(this.withCredentials); + loader.load(url, function(buffer) { + try { + const bufferCopy = buffer.slice(0); + const context = AudioContext.getContext(); + context.decodeAudioData(bufferCopy, function(audioBuffer) { + onLoad(audioBuffer); + }).catch(handleError); + } catch (e) { + handleError(e); + } + }, onProgress, onError); + function handleError(e) { + if (onError) { + onError(e); + } else { + error(e); + } + scope.manager.itemError(url); + } + } +}; +var _eyeRight = new Matrix4(); +var _eyeLeft = new Matrix4(); +var _projectionMatrix = new Matrix4(); +var StereoCamera = class { + /** + * Constructs a new stereo camera. + */ + constructor() { + this.type = "StereoCamera"; + this.aspect = 1; + this.eyeSep = 0.064; + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable(1); + this.cameraL.matrixAutoUpdate = false; + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable(2); + this.cameraR.matrixAutoUpdate = false; + this._cache = { + focus: null, + fov: null, + aspect: null, + near: null, + far: null, + zoom: null, + eyeSep: null + }; + } + /** + * Updates the stereo camera based on the given perspective camera. + * + * @param {PerspectiveCamera} camera - The perspective camera. + */ + update(camera) { + const cache = this._cache; + const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov || cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near || cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep; + if (needsUpdate) { + cache.focus = camera.focus; + cache.fov = camera.fov; + cache.aspect = camera.aspect * this.aspect; + cache.near = camera.near; + cache.far = camera.far; + cache.zoom = camera.zoom; + cache.eyeSep = this.eyeSep; + _projectionMatrix.copy(camera.projectionMatrix); + const eyeSepHalf = cache.eyeSep / 2; + const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus; + const ymax = cache.near * Math.tan(DEG2RAD * cache.fov * 0.5) / cache.zoom; + let xmin, xmax; + _eyeLeft.elements[12] = -eyeSepHalf; + _eyeRight.elements[12] = eyeSepHalf; + xmin = -ymax * cache.aspect + eyeSepOnProjection; + xmax = ymax * cache.aspect + eyeSepOnProjection; + _projectionMatrix.elements[0] = 2 * cache.near / (xmax - xmin); + _projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin); + this.cameraL.projectionMatrix.copy(_projectionMatrix); + xmin = -ymax * cache.aspect - eyeSepOnProjection; + xmax = ymax * cache.aspect - eyeSepOnProjection; + _projectionMatrix.elements[0] = 2 * cache.near / (xmax - xmin); + _projectionMatrix.elements[8] = (xmax + xmin) / (xmax - xmin); + this.cameraR.projectionMatrix.copy(_projectionMatrix); + } + this.cameraL.matrixWorld.copy(camera.matrixWorld).multiply(_eyeLeft); + this.cameraR.matrixWorld.copy(camera.matrixWorld).multiply(_eyeRight); + } +}; +var ArrayCamera = class extends PerspectiveCamera { + /** + * Constructs a new array camera. + * + * @param {Array} [array=[]] - An array of perspective sub cameras. + */ + constructor(array = []) { + super(); + this.isArrayCamera = true; + this.isMultiViewCamera = false; + this.cameras = array; + } +}; +var Clock = class { + /** + * Constructs a new clock. + * + * @param {boolean} [autoStart=true] - Whether to automatically start the clock when + * `getDelta()` is called for the first time. + */ + constructor(autoStart = true) { + this.autoStart = autoStart; + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + this.running = false; + } + /** + * Starts the clock. When `autoStart` is set to `true`, the method is automatically + * called by the class. + */ + start() { + this.startTime = performance.now(); + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + } + /** + * Stops the clock. + */ + stop() { + this.getElapsedTime(); + this.running = false; + this.autoStart = false; + } + /** + * Returns the elapsed time in seconds. + * + * @return {number} The elapsed time. + */ + getElapsedTime() { + this.getDelta(); + return this.elapsedTime; + } + /** + * Returns the delta time in seconds. + * + * @return {number} The delta time. + */ + getDelta() { + let diff = 0; + if (this.autoStart && !this.running) { + this.start(); + return 0; + } + if (this.running) { + const newTime = performance.now(); + diff = (newTime - this.oldTime) / 1e3; + this.oldTime = newTime; + this.elapsedTime += diff; + } + return diff; + } +}; +var _position$1 = new Vector3(); +var _quaternion$1 = new Quaternion(); +var _scale$1 = new Vector3(); +var _forward = new Vector3(); +var _up = new Vector3(); +var AudioListener = class extends Object3D { + /** + * Constructs a new audio listener. + */ + constructor() { + super(); + this.type = "AudioListener"; + this.context = AudioContext.getContext(); + this.gain = this.context.createGain(); + this.gain.connect(this.context.destination); + this.filter = null; + this.timeDelta = 0; + this._clock = new Clock(); + } + /** + * Returns the listener's input node. + * + * This method is used by other audio nodes to connect to this listener. + * + * @return {GainNode} The input node. + */ + getInput() { + return this.gain; + } + /** + * Removes the current filter from this listener. + * + * @return {AudioListener} A reference to this listener. + */ + removeFilter() { + if (this.filter !== null) { + this.gain.disconnect(this.filter); + this.filter.disconnect(this.context.destination); + this.gain.connect(this.context.destination); + this.filter = null; + } + return this; + } + /** + * Returns the current set filter. + * + * @return {?AudioNode} The filter. + */ + getFilter() { + return this.filter; + } + /** + * Sets the given filter to this listener. + * + * @param {AudioNode} value - The filter to set. + * @return {AudioListener} A reference to this listener. + */ + setFilter(value) { + if (this.filter !== null) { + this.gain.disconnect(this.filter); + this.filter.disconnect(this.context.destination); + } else { + this.gain.disconnect(this.context.destination); + } + this.filter = value; + this.gain.connect(this.filter); + this.filter.connect(this.context.destination); + return this; + } + /** + * Returns the applications master volume. + * + * @return {number} The master volume. + */ + getMasterVolume() { + return this.gain.gain.value; + } + /** + * Sets the applications master volume. This volume setting affects + * all audio nodes in the scene. + * + * @param {number} value - The master volume to set. + * @return {AudioListener} A reference to this listener. + */ + setMasterVolume(value) { + this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01); + return this; + } + updateMatrixWorld(force) { + super.updateMatrixWorld(force); + const listener = this.context.listener; + this.timeDelta = this._clock.getDelta(); + this.matrixWorld.decompose(_position$1, _quaternion$1, _scale$1); + _forward.set(0, 0, -1).applyQuaternion(_quaternion$1); + _up.set(0, 1, 0).applyQuaternion(_quaternion$1); + if (listener.positionX) { + const endTime = this.context.currentTime + this.timeDelta; + listener.positionX.linearRampToValueAtTime(_position$1.x, endTime); + listener.positionY.linearRampToValueAtTime(_position$1.y, endTime); + listener.positionZ.linearRampToValueAtTime(_position$1.z, endTime); + listener.forwardX.linearRampToValueAtTime(_forward.x, endTime); + listener.forwardY.linearRampToValueAtTime(_forward.y, endTime); + listener.forwardZ.linearRampToValueAtTime(_forward.z, endTime); + listener.upX.linearRampToValueAtTime(_up.x, endTime); + listener.upY.linearRampToValueAtTime(_up.y, endTime); + listener.upZ.linearRampToValueAtTime(_up.z, endTime); + } else { + listener.setPosition(_position$1.x, _position$1.y, _position$1.z); + listener.setOrientation(_forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z); + } + } +}; +var Audio = class extends Object3D { + /** + * Constructs a new audio. + * + * @param {AudioListener} listener - The global audio listener. + */ + constructor(listener) { + super(); + this.type = "Audio"; + this.listener = listener; + this.context = listener.context; + this.gain = this.context.createGain(); + this.gain.connect(listener.getInput()); + this.autoplay = false; + this.buffer = null; + this.detune = 0; + this.loop = false; + this.loopStart = 0; + this.loopEnd = 0; + this.offset = 0; + this.duration = void 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.source = null; + this.sourceType = "empty"; + this._startedAt = 0; + this._progress = 0; + this._connected = false; + this.filters = []; + } + /** + * Returns the output audio node. + * + * @return {GainNode} The output node. + */ + getOutput() { + return this.gain; + } + /** + * Sets the given audio node as the source of this instance. + * + * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`. + * + * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`. + * @return {Audio} A reference to this instance. + */ + setNodeSource(audioNode) { + this.hasPlaybackControl = false; + this.sourceType = "audioNode"; + this.source = audioNode; + this.connect(); + return this; + } + /** + * Sets the given media element as the source of this instance. + * + * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`. + * + * @param {HTMLMediaElement} mediaElement - The media element. + * @return {Audio} A reference to this instance. + */ + setMediaElementSource(mediaElement) { + this.hasPlaybackControl = false; + this.sourceType = "mediaNode"; + this.source = this.context.createMediaElementSource(mediaElement); + this.connect(); + return this; + } + /** + * Sets the given media stream as the source of this instance. + * + * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`. + * + * @param {MediaStream} mediaStream - The media stream. + * @return {Audio} A reference to this instance. + */ + setMediaStreamSource(mediaStream) { + this.hasPlaybackControl = false; + this.sourceType = "mediaStreamNode"; + this.source = this.context.createMediaStreamSource(mediaStream); + this.connect(); + return this; + } + /** + * Sets the given audio buffer as the source of this instance. + * + * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`. + * + * @param {AudioBuffer} audioBuffer - The audio buffer. + * @return {Audio} A reference to this instance. + */ + setBuffer(audioBuffer) { + this.buffer = audioBuffer; + this.sourceType = "buffer"; + if (this.autoplay) this.play(); + return this; + } + /** + * Starts the playback of the audio. + * + * Can only be used with compatible audio sources that allow playback control. + * + * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing. + * @return {Audio|undefined} A reference to this instance. + */ + play(delay = 0) { + if (this.isPlaying === true) { + warn("Audio: Audio is already playing."); + return; + } + if (this.hasPlaybackControl === false) { + warn("Audio: this Audio has no playback control."); + return; + } + this._startedAt = this.context.currentTime + delay; + const source = this.context.createBufferSource(); + source.buffer = this.buffer; + source.loop = this.loop; + source.loopStart = this.loopStart; + source.loopEnd = this.loopEnd; + source.onended = this.onEnded.bind(this); + source.start(this._startedAt, this._progress + this.offset, this.duration); + this.isPlaying = true; + this.source = source; + this.setDetune(this.detune); + this.setPlaybackRate(this.playbackRate); + return this.connect(); + } + /** + * Pauses the playback of the audio. + * + * Can only be used with compatible audio sources that allow playback control. + * + * @return {Audio|undefined} A reference to this instance. + */ + pause() { + if (this.hasPlaybackControl === false) { + warn("Audio: this Audio has no playback control."); + return; + } + if (this.isPlaying === true) { + this._progress += Math.max(this.context.currentTime - this._startedAt, 0) * this.playbackRate; + if (this.loop === true) { + this._progress = this._progress % (this.duration || this.buffer.duration); + } + this.source.stop(); + this.source.onended = null; + this.isPlaying = false; + } + return this; + } + /** + * Stops the playback of the audio. + * + * Can only be used with compatible audio sources that allow playback control. + * + * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing. + * @return {Audio|undefined} A reference to this instance. + */ + stop(delay = 0) { + if (this.hasPlaybackControl === false) { + warn("Audio: this Audio has no playback control."); + return; + } + this._progress = 0; + if (this.source !== null) { + this.source.stop(this.context.currentTime + delay); + this.source.onended = null; + } + this.isPlaying = false; + return this; + } + /** + * Connects to the audio source. This is used internally on + * initialisation and when setting / removing filters. + * + * @return {Audio} A reference to this instance. + */ + connect() { + if (this.filters.length > 0) { + this.source.connect(this.filters[0]); + for (let i = 1, l = this.filters.length; i < l; i++) { + this.filters[i - 1].connect(this.filters[i]); + } + this.filters[this.filters.length - 1].connect(this.getOutput()); + } else { + this.source.connect(this.getOutput()); + } + this._connected = true; + return this; + } + /** + * Disconnects to the audio source. This is used internally on + * initialisation and when setting / removing filters. + * + * @return {Audio|undefined} A reference to this instance. + */ + disconnect() { + if (this._connected === false) { + return; + } + if (this.filters.length > 0) { + this.source.disconnect(this.filters[0]); + for (let i = 1, l = this.filters.length; i < l; i++) { + this.filters[i - 1].disconnect(this.filters[i]); + } + this.filters[this.filters.length - 1].disconnect(this.getOutput()); + } else { + this.source.disconnect(this.getOutput()); + } + this._connected = false; + return this; + } + /** + * Returns the current set filters. + * + * @return {Array} The list of filters. + */ + getFilters() { + return this.filters; + } + /** + * Sets an array of filters and connects them with the audio source. + * + * @param {Array} [value] - A list of filters. + * @return {Audio} A reference to this instance. + */ + setFilters(value) { + if (!value) value = []; + if (this._connected === true) { + this.disconnect(); + this.filters = value.slice(); + this.connect(); + } else { + this.filters = value.slice(); + } + return this; + } + /** + * Defines the detuning of oscillation in cents. + * + * @param {number} value - The detuning of oscillation in cents. + * @return {Audio} A reference to this instance. + */ + setDetune(value) { + this.detune = value; + if (this.isPlaying === true && this.source.detune !== void 0) { + this.source.detune.setTargetAtTime(this.detune, this.context.currentTime, 0.01); + } + return this; + } + /** + * Returns the detuning of oscillation in cents. + * + * @return {number} The detuning of oscillation in cents. + */ + getDetune() { + return this.detune; + } + /** + * Returns the first filter in the list of filters. + * + * @return {AudioNode|undefined} The first filter in the list of filters. + */ + getFilter() { + return this.getFilters()[0]; + } + /** + * Applies a single filter node to the audio. + * + * @param {AudioNode} [filter] - The filter to set. + * @return {Audio} A reference to this instance. + */ + setFilter(filter) { + return this.setFilters(filter ? [filter] : []); + } + /** + * Sets the playback rate. + * + * Can only be used with compatible audio sources that allow playback control. + * + * @param {number} [value] - The playback rate to set. + * @return {Audio|undefined} A reference to this instance. + */ + setPlaybackRate(value) { + if (this.hasPlaybackControl === false) { + warn("Audio: this Audio has no playback control."); + return; + } + this.playbackRate = value; + if (this.isPlaying === true) { + this.source.playbackRate.setTargetAtTime(this.playbackRate, this.context.currentTime, 0.01); + } + return this; + } + /** + * Returns the current playback rate. + + * @return {number} The playback rate. + */ + getPlaybackRate() { + return this.playbackRate; + } + /** + * Automatically called when playback finished. + */ + onEnded() { + this.isPlaying = false; + this._progress = 0; + } + /** + * Returns the loop flag. + * + * Can only be used with compatible audio sources that allow playback control. + * + * @return {boolean} Whether the audio should loop or not. + */ + getLoop() { + if (this.hasPlaybackControl === false) { + warn("Audio: this Audio has no playback control."); + return false; + } + return this.loop; + } + /** + * Sets the loop flag. + * + * Can only be used with compatible audio sources that allow playback control. + * + * @param {boolean} value - Whether the audio should loop or not. + * @return {Audio|undefined} A reference to this instance. + */ + setLoop(value) { + if (this.hasPlaybackControl === false) { + warn("Audio: this Audio has no playback control."); + return; + } + this.loop = value; + if (this.isPlaying === true) { + this.source.loop = this.loop; + } + return this; + } + /** + * Sets the loop start value which defines where in the audio buffer the replay should + * start, in seconds. + * + * @param {number} value - The loop start value. + * @return {Audio} A reference to this instance. + */ + setLoopStart(value) { + this.loopStart = value; + return this; + } + /** + * Sets the loop end value which defines where in the audio buffer the replay should + * stop, in seconds. + * + * @param {number} value - The loop end value. + * @return {Audio} A reference to this instance. + */ + setLoopEnd(value) { + this.loopEnd = value; + return this; + } + /** + * Returns the volume. + * + * @return {number} The volume. + */ + getVolume() { + return this.gain.gain.value; + } + /** + * Sets the volume. + * + * @param {number} value - The volume to set. + * @return {Audio} A reference to this instance. + */ + setVolume(value) { + this.gain.gain.setTargetAtTime(value, this.context.currentTime, 0.01); + return this; + } + copy(source, recursive) { + super.copy(source, recursive); + if (source.sourceType !== "buffer") { + warn("Audio: Audio source type cannot be copied."); + return this; + } + this.autoplay = source.autoplay; + this.buffer = source.buffer; + this.detune = source.detune; + this.loop = source.loop; + this.loopStart = source.loopStart; + this.loopEnd = source.loopEnd; + this.offset = source.offset; + this.duration = source.duration; + this.playbackRate = source.playbackRate; + this.hasPlaybackControl = source.hasPlaybackControl; + this.sourceType = source.sourceType; + this.filters = source.filters.slice(); + return this; + } + clone(recursive) { + return new this.constructor(this.listener).copy(this, recursive); + } +}; +var _position = new Vector3(); +var _quaternion = new Quaternion(); +var _scale = new Vector3(); +var _orientation = new Vector3(); +var PositionalAudio = class extends Audio { + /** + * Constructs a positional audio. + * + * @param {AudioListener} listener - The global audio listener. + */ + constructor(listener) { + super(listener); + this.panner = this.context.createPanner(); + this.panner.panningModel = "HRTF"; + this.panner.connect(this.gain); + } + connect() { + super.connect(); + this.panner.connect(this.gain); + return this; + } + disconnect() { + super.disconnect(); + this.panner.disconnect(this.gain); + return this; + } + getOutput() { + return this.panner; + } + /** + * Returns the current reference distance. + * + * @return {number} The reference distance. + */ + getRefDistance() { + return this.panner.refDistance; + } + /** + * Defines the reference distance for reducing volume as the audio source moves + * further from the listener – i.e. the distance at which the volume reduction + * starts taking effect. + * + * @param {number} value - The reference distance to set. + * @return {PositionalAudio} A reference to this instance. + */ + setRefDistance(value) { + this.panner.refDistance = value; + return this; + } + /** + * Returns the current rolloff factor. + * + * @return {number} The rolloff factor. + */ + getRolloffFactor() { + return this.panner.rolloffFactor; + } + /** + * Defines how quickly the volume is reduced as the source moves away from the listener. + * + * @param {number} value - The rolloff factor. + * @return {PositionalAudio} A reference to this instance. + */ + setRolloffFactor(value) { + this.panner.rolloffFactor = value; + return this; + } + /** + * Returns the current distance model. + * + * @return {('linear'|'inverse'|'exponential')} The distance model. + */ + getDistanceModel() { + return this.panner.distanceModel; + } + /** + * Defines which algorithm to use to reduce the volume of the audio source + * as it moves away from the listener. + * + * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype) + * for more details. + * + * @param {('linear'|'inverse'|'exponential')} value - The distance model to set. + * @return {PositionalAudio} A reference to this instance. + */ + setDistanceModel(value) { + this.panner.distanceModel = value; + return this; + } + /** + * Returns the current max distance. + * + * @return {number} The max distance. + */ + getMaxDistance() { + return this.panner.maxDistance; + } + /** + * Defines the maximum distance between the audio source and the listener, + * after which the volume is not reduced any further. + * + * This value is used only by the `linear` distance model. + * + * @param {number} value - The max distance. + * @return {PositionalAudio} A reference to this instance. + */ + setMaxDistance(value) { + this.panner.maxDistance = value; + return this; + } + /** + * Sets the directional cone in which the audio can be listened. + * + * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction. + * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter. + * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard. + * @return {PositionalAudio} A reference to this instance. + */ + setDirectionalCone(coneInnerAngle, coneOuterAngle, coneOuterGain) { + this.panner.coneInnerAngle = coneInnerAngle; + this.panner.coneOuterAngle = coneOuterAngle; + this.panner.coneOuterGain = coneOuterGain; + return this; + } + updateMatrixWorld(force) { + super.updateMatrixWorld(force); + if (this.hasPlaybackControl === true && this.isPlaying === false) return; + this.matrixWorld.decompose(_position, _quaternion, _scale); + _orientation.set(0, 0, 1).applyQuaternion(_quaternion); + const panner = this.panner; + if (panner.positionX) { + const endTime = this.context.currentTime + this.listener.timeDelta; + panner.positionX.linearRampToValueAtTime(_position.x, endTime); + panner.positionY.linearRampToValueAtTime(_position.y, endTime); + panner.positionZ.linearRampToValueAtTime(_position.z, endTime); + panner.orientationX.linearRampToValueAtTime(_orientation.x, endTime); + panner.orientationY.linearRampToValueAtTime(_orientation.y, endTime); + panner.orientationZ.linearRampToValueAtTime(_orientation.z, endTime); + } else { + panner.setPosition(_position.x, _position.y, _position.z); + panner.setOrientation(_orientation.x, _orientation.y, _orientation.z); + } + } +}; +var AudioAnalyser = class { + /** + * Constructs a new audio analyzer. + * + * @param {Audio} audio - The audio to analyze. + * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data. + */ + constructor(audio, fftSize = 2048) { + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize; + this.data = new Uint8Array(this.analyser.frequencyBinCount); + audio.getOutput().connect(this.analyser); + } + /** + * Returns an array with frequency data of the audio. + * + * Each item in the array represents the decibel value for a specific frequency. + * The frequencies are spread linearly from 0 to 1/2 of the sample rate. + * For example, for 48000 sample rate, the last item of the array will represent + * the decibel value for 24000 Hz. + * + * @return {Uint8Array} The frequency data. + */ + getFrequencyData() { + this.analyser.getByteFrequencyData(this.data); + return this.data; + } + /** + * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}. + * + * @return {number} The average frequency. + */ + getAverageFrequency() { + let value = 0; + const data = this.getFrequencyData(); + for (let i = 0; i < data.length; i++) { + value += data[i]; + } + return value / data.length; + } +}; +var PropertyMixer = class { + /** + * Constructs a new property mixer. + * + * @param {PropertyBinding} binding - The property binding. + * @param {string} typeName - The keyframe track type name. + * @param {number} valueSize - The keyframe track value size. + */ + constructor(binding, typeName, valueSize) { + this.binding = binding; + this.valueSize = valueSize; + let mixFunction, mixFunctionAdditive, setIdentity; + switch (typeName) { + case "quaternion": + mixFunction = this._slerp; + mixFunctionAdditive = this._slerpAdditive; + setIdentity = this._setAdditiveIdentityQuaternion; + this.buffer = new Float64Array(valueSize * 6); + this._workIndex = 5; + break; + case "string": + case "bool": + mixFunction = this._select; + mixFunctionAdditive = this._select; + setIdentity = this._setAdditiveIdentityOther; + this.buffer = new Array(valueSize * 5); + break; + default: + mixFunction = this._lerp; + mixFunctionAdditive = this._lerpAdditive; + setIdentity = this._setAdditiveIdentityNumeric; + this.buffer = new Float64Array(valueSize * 5); + } + this._mixBufferRegion = mixFunction; + this._mixBufferRegionAdditive = mixFunctionAdditive; + this._setIdentity = setIdentity; + this._origIndex = 3; + this._addIndex = 4; + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + this.useCount = 0; + this.referenceCount = 0; + } + /** + * Accumulates data in the `incoming` region into `accu`. + * + * @param {number} accuIndex - The accumulation index. + * @param {number} weight - The weight. + */ + accumulate(accuIndex, weight) { + const buffer = this.buffer, stride = this.valueSize, offset = accuIndex * stride + stride; + let currentWeight = this.cumulativeWeight; + if (currentWeight === 0) { + for (let i = 0; i !== stride; ++i) { + buffer[offset + i] = buffer[i]; + } + currentWeight = weight; + } else { + currentWeight += weight; + const mix = weight / currentWeight; + this._mixBufferRegion(buffer, offset, 0, mix, stride); + } + this.cumulativeWeight = currentWeight; + } + /** + * Accumulates data in the `incoming` region into `add`. + * + * @param {number} weight - The weight. + */ + accumulateAdditive(weight) { + const buffer = this.buffer, stride = this.valueSize, offset = stride * this._addIndex; + if (this.cumulativeWeightAdditive === 0) { + this._setIdentity(); + } + this._mixBufferRegionAdditive(buffer, offset, 0, weight, stride); + this.cumulativeWeightAdditive += weight; + } + /** + * Applies the state of `accu` to the binding when accus differ. + * + * @param {number} accuIndex - The accumulation index. + */ + apply(accuIndex) { + const stride = this.valueSize, buffer = this.buffer, offset = accuIndex * stride + stride, weight = this.cumulativeWeight, weightAdditive = this.cumulativeWeightAdditive, binding = this.binding; + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + if (weight < 1) { + const originalValueOffset = stride * this._origIndex; + this._mixBufferRegion( + buffer, + offset, + originalValueOffset, + 1 - weight, + stride + ); + } + if (weightAdditive > 0) { + this._mixBufferRegionAdditive(buffer, offset, this._addIndex * stride, 1, stride); + } + for (let i = stride, e = stride + stride; i !== e; ++i) { + if (buffer[i] !== buffer[i + stride]) { + binding.setValue(buffer, offset); + break; + } + } + } + /** + * Remembers the state of the bound property and copy it to both accus. + */ + saveOriginalState() { + const binding = this.binding; + const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * this._origIndex; + binding.getValue(buffer, originalValueOffset); + for (let i = stride, e = originalValueOffset; i !== e; ++i) { + buffer[i] = buffer[originalValueOffset + i % stride]; + } + this._setIdentity(); + this.cumulativeWeight = 0; + this.cumulativeWeightAdditive = 0; + } + /** + * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding. + */ + restoreOriginalState() { + const originalValueOffset = this.valueSize * 3; + this.binding.setValue(this.buffer, originalValueOffset); + } + // internals + _setAdditiveIdentityNumeric() { + const startIndex = this._addIndex * this.valueSize; + const endIndex = startIndex + this.valueSize; + for (let i = startIndex; i < endIndex; i++) { + this.buffer[i] = 0; + } + } + _setAdditiveIdentityQuaternion() { + this._setAdditiveIdentityNumeric(); + this.buffer[this._addIndex * this.valueSize + 3] = 1; + } + _setAdditiveIdentityOther() { + const startIndex = this._origIndex * this.valueSize; + const targetIndex = this._addIndex * this.valueSize; + for (let i = 0; i < this.valueSize; i++) { + this.buffer[targetIndex + i] = this.buffer[startIndex + i]; + } + } + // mix functions + _select(buffer, dstOffset, srcOffset, t, stride) { + if (t >= 0.5) { + for (let i = 0; i !== stride; ++i) { + buffer[dstOffset + i] = buffer[srcOffset + i]; + } + } + } + _slerp(buffer, dstOffset, srcOffset, t) { + Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t); + } + _slerpAdditive(buffer, dstOffset, srcOffset, t, stride) { + const workOffset = this._workIndex * stride; + Quaternion.multiplyQuaternionsFlat(buffer, workOffset, buffer, dstOffset, buffer, srcOffset); + Quaternion.slerpFlat(buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t); + } + _lerp(buffer, dstOffset, srcOffset, t, stride) { + const s = 1 - t; + for (let i = 0; i !== stride; ++i) { + const j = dstOffset + i; + buffer[j] = buffer[j] * s + buffer[srcOffset + i] * t; + } + } + _lerpAdditive(buffer, dstOffset, srcOffset, t, stride) { + for (let i = 0; i !== stride; ++i) { + const j = dstOffset + i; + buffer[j] = buffer[j] + buffer[srcOffset + i] * t; + } + } +}; +var _RESERVED_CHARS_RE = "\\[\\]\\.:\\/"; +var _reservedRe = new RegExp("[" + _RESERVED_CHARS_RE + "]", "g"); +var _wordChar = "[^" + _RESERVED_CHARS_RE + "]"; +var _wordCharOrDot = "[^" + _RESERVED_CHARS_RE.replace("\\.", "") + "]"; +var _directoryRe = /((?:WC+[\/:])*)/.source.replace("WC", _wordChar); +var _nodeRe = /(WCOD+)?/.source.replace("WCOD", _wordCharOrDot); +var _objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", _wordChar); +var _propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", _wordChar); +var _trackRe = new RegExp( + "^" + _directoryRe + _nodeRe + _objectRe + _propertyRe + "$" +); +var _supportedObjectNames = ["material", "materials", "bones", "map"]; +var Composite = class { + constructor(targetGroup, path, optionalParsedPath) { + const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName(path); + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_(path, parsedPath); + } + getValue(array, offset) { + this.bind(); + const firstValidIndex = this._targetGroup.nCachedObjects_, binding = this._bindings[firstValidIndex]; + if (binding !== void 0) binding.getValue(array, offset); + } + setValue(array, offset) { + const bindings = this._bindings; + for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].setValue(array, offset); + } + } + bind() { + const bindings = this._bindings; + for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].bind(); + } + } + unbind() { + const bindings = this._bindings; + for (let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++i) { + bindings[i].unbind(); + } + } +}; +var PropertyBinding = class _PropertyBinding { + /** + * Constructs a new property binding. + * + * @param {Object} rootNode - The root node. + * @param {string} path - The path. + * @param {?Object} [parsedPath] - The parsed path. + */ + constructor(rootNode, path, parsedPath) { + this.path = path; + this.parsedPath = parsedPath || _PropertyBinding.parseTrackName(path); + this.node = _PropertyBinding.findNode(rootNode, this.parsedPath.nodeName); + this.rootNode = rootNode; + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + } + /** + * Factory method for creating a property binding from the given parameters. + * + * @static + * @param {Object} root - The root node. + * @param {string} path - The path. + * @param {?Object} [parsedPath] - The parsed path. + * @return {PropertyBinding|Composite} The created property binding or composite. + */ + static create(root, path, parsedPath) { + if (!(root && root.isAnimationObjectGroup)) { + return new _PropertyBinding(root, path, parsedPath); + } else { + return new _PropertyBinding.Composite(root, path, parsedPath); + } + } + /** + * Replaces spaces with underscores and removes unsupported characters from + * node names, to ensure compatibility with parseTrackName(). + * + * @param {string} name - Node name to be sanitized. + * @return {string} The sanitized node name. + */ + static sanitizeNodeName(name) { + return name.replace(/\s/g, "_").replace(_reservedRe, ""); + } + /** + * Parses the given track name (an object path to an animated property) and + * returns an object with information about the path. Matches strings in the following forms: + * + * - nodeName.property + * - nodeName.property[accessor] + * - nodeName.material.property[accessor] + * - uuid.property[accessor] + * - uuid.objectName[objectIndex].propertyName[propertyIndex] + * - parentName/nodeName.property + * - parentName/parentName/nodeName.property[index] + * - .bone[Armature.DEF_cog].position + * - scene:helium_balloon_model:helium_balloon_model.position + * + * @static + * @param {string} trackName - The track name to parse. + * @return {Object} The parsed track name as an object. + */ + static parseTrackName(trackName) { + const matches = _trackRe.exec(trackName); + if (matches === null) { + throw new Error("PropertyBinding: Cannot parse trackName: " + trackName); + } + const results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[2], + objectName: matches[3], + objectIndex: matches[4], + propertyName: matches[5], + // required + propertyIndex: matches[6] + }; + const lastDot = results.nodeName && results.nodeName.lastIndexOf("."); + if (lastDot !== void 0 && lastDot !== -1) { + const objectName = results.nodeName.substring(lastDot + 1); + if (_supportedObjectNames.indexOf(objectName) !== -1) { + results.nodeName = results.nodeName.substring(0, lastDot); + results.objectName = objectName; + } + } + if (results.propertyName === null || results.propertyName.length === 0) { + throw new Error("PropertyBinding: can not parse propertyName from trackName: " + trackName); + } + return results; + } + /** + * Searches for a node in the hierarchy of the given root object by the given + * node name. + * + * @static + * @param {Object} root - The root object. + * @param {string|number} nodeName - The name of the node. + * @return {?Object} The found node. Returns `null` if no object was found. + */ + static findNode(root, nodeName) { + if (nodeName === void 0 || nodeName === "" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid) { + return root; + } + if (root.skeleton) { + const bone = root.skeleton.getBoneByName(nodeName); + if (bone !== void 0) { + return bone; + } + } + if (root.children) { + const searchNodeSubtree = function(children) { + for (let i = 0; i < children.length; i++) { + const childNode = children[i]; + if (childNode.name === nodeName || childNode.uuid === nodeName) { + return childNode; + } + const result = searchNodeSubtree(childNode.children); + if (result) return result; + } + return null; + }; + const subTreeNode = searchNodeSubtree(root.children); + if (subTreeNode) { + return subTreeNode; + } + } + return null; + } + // these are used to "bind" a nonexistent property + _getValue_unavailable() { + } + _setValue_unavailable() { + } + // Getters + _getValue_direct(buffer, offset) { + buffer[offset] = this.targetObject[this.propertyName]; + } + _getValue_array(buffer, offset) { + const source = this.resolvedProperty; + for (let i = 0, n = source.length; i !== n; ++i) { + buffer[offset++] = source[i]; + } + } + _getValue_arrayElement(buffer, offset) { + buffer[offset] = this.resolvedProperty[this.propertyIndex]; + } + _getValue_toArray(buffer, offset) { + this.resolvedProperty.toArray(buffer, offset); + } + // Direct + _setValue_direct(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset]; + } + _setValue_direct_setNeedsUpdate(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset]; + this.targetObject.needsUpdate = true; + } + _setValue_direct_setMatrixWorldNeedsUpdate(buffer, offset) { + this.targetObject[this.propertyName] = buffer[offset]; + this.targetObject.matrixWorldNeedsUpdate = true; + } + // EntireArray + _setValue_array(buffer, offset) { + const dest = this.resolvedProperty; + for (let i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++]; + } + } + _setValue_array_setNeedsUpdate(buffer, offset) { + const dest = this.resolvedProperty; + for (let i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++]; + } + this.targetObject.needsUpdate = true; + } + _setValue_array_setMatrixWorldNeedsUpdate(buffer, offset) { + const dest = this.resolvedProperty; + for (let i = 0, n = dest.length; i !== n; ++i) { + dest[i] = buffer[offset++]; + } + this.targetObject.matrixWorldNeedsUpdate = true; + } + // ArrayElement + _setValue_arrayElement(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset]; + } + _setValue_arrayElement_setNeedsUpdate(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset]; + this.targetObject.needsUpdate = true; + } + _setValue_arrayElement_setMatrixWorldNeedsUpdate(buffer, offset) { + this.resolvedProperty[this.propertyIndex] = buffer[offset]; + this.targetObject.matrixWorldNeedsUpdate = true; + } + // HasToFromArray + _setValue_fromArray(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset); + } + _setValue_fromArray_setNeedsUpdate(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset); + this.targetObject.needsUpdate = true; + } + _setValue_fromArray_setMatrixWorldNeedsUpdate(buffer, offset) { + this.resolvedProperty.fromArray(buffer, offset); + this.targetObject.matrixWorldNeedsUpdate = true; + } + _getValue_unbound(targetArray, offset) { + this.bind(); + this.getValue(targetArray, offset); + } + _setValue_unbound(sourceArray, offset) { + this.bind(); + this.setValue(sourceArray, offset); + } + /** + * Creates a getter / setter pair for the property tracked by this binding. + */ + bind() { + let targetObject = this.node; + const parsedPath = this.parsedPath; + const objectName = parsedPath.objectName; + const propertyName = parsedPath.propertyName; + let propertyIndex = parsedPath.propertyIndex; + if (!targetObject) { + targetObject = _PropertyBinding.findNode(this.rootNode, parsedPath.nodeName); + this.node = targetObject; + } + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + if (!targetObject) { + warn("PropertyBinding: No target node found for track: " + this.path + "."); + return; + } + if (objectName) { + let objectIndex = parsedPath.objectIndex; + switch (objectName) { + case "materials": + if (!targetObject.material) { + error("PropertyBinding: Can not bind to material as node does not have a material.", this); + return; + } + if (!targetObject.material.materials) { + error("PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.", this); + return; + } + targetObject = targetObject.material.materials; + break; + case "bones": + if (!targetObject.skeleton) { + error("PropertyBinding: Can not bind to bones as node does not have a skeleton.", this); + return; + } + targetObject = targetObject.skeleton.bones; + for (let i = 0; i < targetObject.length; i++) { + if (targetObject[i].name === objectIndex) { + objectIndex = i; + break; + } + } + break; + case "map": + if ("map" in targetObject) { + targetObject = targetObject.map; + break; + } + if (!targetObject.material) { + error("PropertyBinding: Can not bind to material as node does not have a material.", this); + return; + } + if (!targetObject.material.map) { + error("PropertyBinding: Can not bind to material.map as node.material does not have a map.", this); + return; + } + targetObject = targetObject.material.map; + break; + default: + if (targetObject[objectName] === void 0) { + error("PropertyBinding: Can not bind to objectName of node undefined.", this); + return; + } + targetObject = targetObject[objectName]; + } + if (objectIndex !== void 0) { + if (targetObject[objectIndex] === void 0) { + error("PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.", this, targetObject); + return; + } + targetObject = targetObject[objectIndex]; + } + } + const nodeProperty = targetObject[propertyName]; + if (nodeProperty === void 0) { + const nodeName = parsedPath.nodeName; + error("PropertyBinding: Trying to update property for track: " + nodeName + "." + propertyName + " but it wasn't found.", targetObject); + return; + } + let versioning = this.Versioning.None; + this.targetObject = targetObject; + if (targetObject.isMaterial === true) { + versioning = this.Versioning.NeedsUpdate; + } else if (targetObject.isObject3D === true) { + versioning = this.Versioning.MatrixWorldNeedsUpdate; + } + let bindingType = this.BindingType.Direct; + if (propertyIndex !== void 0) { + if (propertyName === "morphTargetInfluences") { + if (!targetObject.geometry) { + error("PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.", this); + return; + } + if (!targetObject.geometry.morphAttributes) { + error("PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.", this); + return; + } + if (targetObject.morphTargetDictionary[propertyIndex] !== void 0) { + propertyIndex = targetObject.morphTargetDictionary[propertyIndex]; + } + } + bindingType = this.BindingType.ArrayElement; + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + } else if (nodeProperty.fromArray !== void 0 && nodeProperty.toArray !== void 0) { + bindingType = this.BindingType.HasFromToArray; + this.resolvedProperty = nodeProperty; + } else if (Array.isArray(nodeProperty)) { + bindingType = this.BindingType.EntireArray; + this.resolvedProperty = nodeProperty; + } else { + this.propertyName = propertyName; + } + this.getValue = this.GetterByBindingType[bindingType]; + this.setValue = this.SetterByBindingTypeAndVersioning[bindingType][versioning]; + } + /** + * Unbinds the property. + */ + unbind() { + this.node = null; + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + } +}; +PropertyBinding.Composite = Composite; +PropertyBinding.prototype.BindingType = { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 +}; +PropertyBinding.prototype.Versioning = { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 +}; +PropertyBinding.prototype.GetterByBindingType = [ + PropertyBinding.prototype._getValue_direct, + PropertyBinding.prototype._getValue_array, + PropertyBinding.prototype._getValue_arrayElement, + PropertyBinding.prototype._getValue_toArray +]; +PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [ + [ + // Direct + PropertyBinding.prototype._setValue_direct, + PropertyBinding.prototype._setValue_direct_setNeedsUpdate, + PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate + ], + [ + // EntireArray + PropertyBinding.prototype._setValue_array, + PropertyBinding.prototype._setValue_array_setNeedsUpdate, + PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate + ], + [ + // ArrayElement + PropertyBinding.prototype._setValue_arrayElement, + PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate, + PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate + ], + [ + // HasToFromArray + PropertyBinding.prototype._setValue_fromArray, + PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate, + PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate + ] +]; +var AnimationObjectGroup = class { + /** + * Constructs a new animation group. + * + * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state. + */ + constructor() { + this.isAnimationObjectGroup = true; + this.uuid = generateUUID(); + this._objects = Array.prototype.slice.call(arguments); + this.nCachedObjects_ = 0; + const indices = {}; + this._indicesByUUID = indices; + for (let i = 0, n = arguments.length; i !== n; ++i) { + indices[arguments[i].uuid] = i; + } + this._paths = []; + this._parsedPaths = []; + this._bindings = []; + this._bindingsIndicesByPath = {}; + const scope = this; + this.stats = { + objects: { + get total() { + return scope._objects.length; + }, + get inUse() { + return this.total - scope.nCachedObjects_; + } + }, + get bindingsPerObject() { + return scope._bindings.length; + } + }; + } + /** + * Adds an arbitrary number of objects to this animation group. + * + * @param {...Object3D} arguments - The 3D objects to add. + */ + add() { + const objects = this._objects, indicesByUUID = this._indicesByUUID, paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, nBindings = bindings.length; + let knownObject = void 0, nObjects = objects.length, nCachedObjects = this.nCachedObjects_; + for (let i = 0, n = arguments.length; i !== n; ++i) { + const object = arguments[i], uuid = object.uuid; + let index = indicesByUUID[uuid]; + if (index === void 0) { + index = nObjects++; + indicesByUUID[uuid] = index; + objects.push(object); + for (let j = 0, m = nBindings; j !== m; ++j) { + bindings[j].push(new PropertyBinding(object, paths[j], parsedPaths[j])); + } + } else if (index < nCachedObjects) { + knownObject = objects[index]; + const firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex]; + indicesByUUID[lastCachedObject.uuid] = index; + objects[index] = lastCachedObject; + indicesByUUID[uuid] = firstActiveIndex; + objects[firstActiveIndex] = object; + for (let j = 0, m = nBindings; j !== m; ++j) { + const bindingsForPath = bindings[j], lastCached = bindingsForPath[firstActiveIndex]; + let binding = bindingsForPath[index]; + bindingsForPath[index] = lastCached; + if (binding === void 0) { + binding = new PropertyBinding(object, paths[j], parsedPaths[j]); + } + bindingsForPath[firstActiveIndex] = binding; + } + } else if (objects[index] !== knownObject) { + error("AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes."); + } + } + this.nCachedObjects_ = nCachedObjects; + } + /** + * Removes an arbitrary number of objects to this animation group + * + * @param {...Object3D} arguments - The 3D objects to remove. + */ + remove() { + const objects = this._objects, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; + let nCachedObjects = this.nCachedObjects_; + for (let i = 0, n = arguments.length; i !== n; ++i) { + const object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid]; + if (index !== void 0 && index >= nCachedObjects) { + const lastCachedIndex = nCachedObjects++, firstActiveObject = objects[lastCachedIndex]; + indicesByUUID[firstActiveObject.uuid] = index; + objects[index] = firstActiveObject; + indicesByUUID[uuid] = lastCachedIndex; + objects[lastCachedIndex] = object; + for (let j = 0, m = nBindings; j !== m; ++j) { + const bindingsForPath = bindings[j], firstActive = bindingsForPath[lastCachedIndex], binding = bindingsForPath[index]; + bindingsForPath[index] = firstActive; + bindingsForPath[lastCachedIndex] = binding; + } + } + } + this.nCachedObjects_ = nCachedObjects; + } + /** + * Deallocates all memory resources for the passed 3D objects of this animation group. + * + * @param {...Object3D} arguments - The 3D objects to uncache. + */ + uncache() { + const objects = this._objects, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; + let nCachedObjects = this.nCachedObjects_, nObjects = objects.length; + for (let i = 0, n = arguments.length; i !== n; ++i) { + const object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid]; + if (index !== void 0) { + delete indicesByUUID[uuid]; + if (index < nCachedObjects) { + const firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex], lastIndex = --nObjects, lastObject = objects[lastIndex]; + indicesByUUID[lastCachedObject.uuid] = index; + objects[index] = lastCachedObject; + indicesByUUID[lastObject.uuid] = firstActiveIndex; + objects[firstActiveIndex] = lastObject; + objects.pop(); + for (let j = 0, m = nBindings; j !== m; ++j) { + const bindingsForPath = bindings[j], lastCached = bindingsForPath[firstActiveIndex], last = bindingsForPath[lastIndex]; + bindingsForPath[index] = lastCached; + bindingsForPath[firstActiveIndex] = last; + bindingsForPath.pop(); + } + } else { + const lastIndex = --nObjects, lastObject = objects[lastIndex]; + if (lastIndex > 0) { + indicesByUUID[lastObject.uuid] = index; + } + objects[index] = lastObject; + objects.pop(); + for (let j = 0, m = nBindings; j !== m; ++j) { + const bindingsForPath = bindings[j]; + bindingsForPath[index] = bindingsForPath[lastIndex]; + bindingsForPath.pop(); + } + } + } + } + this.nCachedObjects_ = nCachedObjects; + } + // Internal interface used by befriended PropertyBinding.Composite: + subscribe_(path, parsedPath) { + const indicesByPath = this._bindingsIndicesByPath; + let index = indicesByPath[path]; + const bindings = this._bindings; + if (index !== void 0) return bindings[index]; + const paths = this._paths, parsedPaths = this._parsedPaths, objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, bindingsForPath = new Array(nObjects); + index = bindings.length; + indicesByPath[path] = index; + paths.push(path); + parsedPaths.push(parsedPath); + bindings.push(bindingsForPath); + for (let i = nCachedObjects, n = objects.length; i !== n; ++i) { + const object = objects[i]; + bindingsForPath[i] = new PropertyBinding(object, path, parsedPath); + } + return bindingsForPath; + } + unsubscribe_(path) { + const indicesByPath = this._bindingsIndicesByPath, index = indicesByPath[path]; + if (index !== void 0) { + const paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, lastBindingsIndex = bindings.length - 1, lastBindings = bindings[lastBindingsIndex], lastBindingsPath = path[lastBindingsIndex]; + indicesByPath[lastBindingsPath] = index; + bindings[index] = lastBindings; + bindings.pop(); + parsedPaths[index] = parsedPaths[lastBindingsIndex]; + parsedPaths.pop(); + paths[index] = paths[lastBindingsIndex]; + paths.pop(); + } + } +}; +var AnimationAction = class { + /** + * Constructs a new animation action. + * + * @param {AnimationMixer} mixer - The mixer that is controlled by this action. + * @param {AnimationClip} clip - The animation clip that holds the actual keyframes. + * @param {?Object3D} [localRoot=null] - The root object on which this action is performed. + * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode. + */ + constructor(mixer, clip, localRoot = null, blendMode = clip.blendMode) { + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot; + this.blendMode = blendMode; + const tracks = clip.tracks, nTracks = tracks.length, interpolants = new Array(nTracks); + const interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + for (let i = 0; i !== nTracks; ++i) { + const interpolant = tracks[i].createInterpolant(null); + interpolants[i] = interpolant; + interpolant.settings = interpolantSettings; + } + this._interpolantSettings = interpolantSettings; + this._interpolants = interpolants; + this._propertyBindings = new Array(nTracks); + this._cacheIndex = null; + this._byClipCacheIndex = null; + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + this.loop = LoopRepeat; + this._loopCount = -1; + this._startTime = null; + this.time = 0; + this.timeScale = 1; + this._effectiveTimeScale = 1; + this.weight = 1; + this._effectiveWeight = 1; + this.repetitions = Infinity; + this.paused = false; + this.enabled = true; + this.clampWhenFinished = false; + this.zeroSlopeAtStart = true; + this.zeroSlopeAtEnd = true; + } + /** + * Starts the playback of the animation. + * + * @return {AnimationAction} A reference to this animation action. + */ + play() { + this._mixer._activateAction(this); + return this; + } + /** + * Stops the playback of the animation. + * + * @return {AnimationAction} A reference to this animation action. + */ + stop() { + this._mixer._deactivateAction(this); + return this.reset(); + } + /** + * Resets the playback of the animation. + * + * @return {AnimationAction} A reference to this animation action. + */ + reset() { + this.paused = false; + this.enabled = true; + this.time = 0; + this._loopCount = -1; + this._startTime = null; + return this.stopFading().stopWarping(); + } + /** + * Returns `true` if the animation is running. + * + * @return {boolean} Whether the animation is running or not. + */ + isRunning() { + return this.enabled && !this.paused && this.timeScale !== 0 && this._startTime === null && this._mixer._isActiveAction(this); + } + /** + * Returns `true` when {@link AnimationAction#play} has been called. + * + * @return {boolean} Whether the animation is scheduled or not. + */ + isScheduled() { + return this._mixer._isActiveAction(this); + } + /** + * Defines the time when the animation should start. + * + * @param {number} time - The start time in seconds. + * @return {AnimationAction} A reference to this animation action. + */ + startAt(time) { + this._startTime = time; + return this; + } + /** + * Configures the loop settings for this action. + * + * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode. + * @param {number} repetitions - The number of repetitions. + * @return {AnimationAction} A reference to this animation action. + */ + setLoop(mode, repetitions) { + this.loop = mode; + this.repetitions = repetitions; + return this; + } + /** + * Sets the effective weight of this action. + * + * An action has no effect and thus an effective weight of zero when the + * action is disabled. + * + * @param {number} weight - The weight to set. + * @return {AnimationAction} A reference to this animation action. + */ + setEffectiveWeight(weight) { + this.weight = weight; + this._effectiveWeight = this.enabled ? weight : 0; + return this.stopFading(); + } + /** + * Returns the effective weight of this action. + * + * @return {number} The effective weight. + */ + getEffectiveWeight() { + return this._effectiveWeight; + } + /** + * Fades the animation in by increasing its weight gradually from `0` to `1`, + * within the passed time interval. + * + * @param {number} duration - The duration of the fade. + * @return {AnimationAction} A reference to this animation action. + */ + fadeIn(duration) { + return this._scheduleFading(duration, 0, 1); + } + /** + * Fades the animation out by decreasing its weight gradually from `1` to `0`, + * within the passed time interval. + * + * @param {number} duration - The duration of the fade. + * @return {AnimationAction} A reference to this animation action. + */ + fadeOut(duration) { + return this._scheduleFading(duration, 1, 0); + } + /** + * Causes this action to fade in and the given action to fade out, + * within the passed time interval. + * + * @param {AnimationAction} fadeOutAction - The animation action to fade out. + * @param {number} duration - The duration of the fade. + * @param {boolean} [warp=false] - Whether warping should be used or not. + * @return {AnimationAction} A reference to this animation action. + */ + crossFadeFrom(fadeOutAction, duration, warp = false) { + fadeOutAction.fadeOut(duration); + this.fadeIn(duration); + if (warp === true) { + const fadeInDuration = this._clip.duration, fadeOutDuration = fadeOutAction._clip.duration, startEndRatio = fadeOutDuration / fadeInDuration, endStartRatio = fadeInDuration / fadeOutDuration; + fadeOutAction.warp(1, startEndRatio, duration); + this.warp(endStartRatio, 1, duration); + } + return this; + } + /** + * Causes this action to fade out and the given action to fade in, + * within the passed time interval. + * + * @param {AnimationAction} fadeInAction - The animation action to fade in. + * @param {number} duration - The duration of the fade. + * @param {boolean} [warp=false] - Whether warping should be used or not. + * @return {AnimationAction} A reference to this animation action. + */ + crossFadeTo(fadeInAction, duration, warp = false) { + return fadeInAction.crossFadeFrom(this, duration, warp); + } + /** + * Stops any fading which is applied to this action. + * + * @return {AnimationAction} A reference to this animation action. + */ + stopFading() { + const weightInterpolant = this._weightInterpolant; + if (weightInterpolant !== null) { + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant(weightInterpolant); + } + return this; + } + /** + * Sets the effective time scale of this action. + * + * An action has no effect and thus an effective time scale of zero when the + * action is paused. + * + * @param {number} timeScale - The time scale to set. + * @return {AnimationAction} A reference to this animation action. + */ + setEffectiveTimeScale(timeScale) { + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 : timeScale; + return this.stopWarping(); + } + /** + * Returns the effective time scale of this action. + * + * @return {number} The effective time scale. + */ + getEffectiveTimeScale() { + return this._effectiveTimeScale; + } + /** + * Sets the duration for a single loop of this action. + * + * @param {number} duration - The duration to set. + * @return {AnimationAction} A reference to this animation action. + */ + setDuration(duration) { + this.timeScale = this._clip.duration / duration; + return this.stopWarping(); + } + /** + * Synchronizes this action with the passed other action. + * + * @param {AnimationAction} action - The action to sync with. + * @return {AnimationAction} A reference to this animation action. + */ + syncWith(action) { + this.time = action.time; + this.timeScale = action.timeScale; + return this.stopWarping(); + } + /** + * Decelerates this animation's speed to `0` within the passed time interval. + * + * @param {number} duration - The duration. + * @return {AnimationAction} A reference to this animation action. + */ + halt(duration) { + return this.warp(this._effectiveTimeScale, 0, duration); + } + /** + * Changes the playback speed, within the passed time interval, by modifying + * {@link AnimationAction#timeScale} gradually from `startTimeScale` to + * `endTimeScale`. + * + * @param {number} startTimeScale - The start time scale. + * @param {number} endTimeScale - The end time scale. + * @param {number} duration - The duration. + * @return {AnimationAction} A reference to this animation action. + */ + warp(startTimeScale, endTimeScale, duration) { + const mixer = this._mixer, now = mixer.time, timeScale = this.timeScale; + let interpolant = this._timeScaleInterpolant; + if (interpolant === null) { + interpolant = mixer._lendControlInterpolant(); + this._timeScaleInterpolant = interpolant; + } + const times = interpolant.parameterPositions, values = interpolant.sampleValues; + times[0] = now; + times[1] = now + duration; + values[0] = startTimeScale / timeScale; + values[1] = endTimeScale / timeScale; + return this; + } + /** + * Stops any scheduled warping which is applied to this action. + * + * @return {AnimationAction} A reference to this animation action. + */ + stopWarping() { + const timeScaleInterpolant = this._timeScaleInterpolant; + if (timeScaleInterpolant !== null) { + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant(timeScaleInterpolant); + } + return this; + } + /** + * Returns the animation mixer of this animation action. + * + * @return {AnimationMixer} The animation mixer. + */ + getMixer() { + return this._mixer; + } + /** + * Returns the animation clip of this animation action. + * + * @return {AnimationClip} The animation clip. + */ + getClip() { + return this._clip; + } + /** + * Returns the root object of this animation action. + * + * @return {Object3D} The root object. + */ + getRoot() { + return this._localRoot || this._mixer._root; + } + // Interna + _update(time, deltaTime, timeDirection, accuIndex) { + if (!this.enabled) { + this._updateWeight(time); + return; + } + const startTime = this._startTime; + if (startTime !== null) { + const timeRunning = (time - startTime) * timeDirection; + if (timeRunning < 0 || timeDirection === 0) { + deltaTime = 0; + } else { + this._startTime = null; + deltaTime = timeDirection * timeRunning; + } + } + deltaTime *= this._updateTimeScale(time); + const clipTime = this._updateTime(deltaTime); + const weight = this._updateWeight(time); + if (weight > 0) { + const interpolants = this._interpolants; + const propertyMixers = this._propertyBindings; + switch (this.blendMode) { + case AdditiveAnimationBlendMode: + for (let j = 0, m = interpolants.length; j !== m; ++j) { + interpolants[j].evaluate(clipTime); + propertyMixers[j].accumulateAdditive(weight); + } + break; + case NormalAnimationBlendMode: + default: + for (let j = 0, m = interpolants.length; j !== m; ++j) { + interpolants[j].evaluate(clipTime); + propertyMixers[j].accumulate(accuIndex, weight); + } + } + } + } + _updateWeight(time) { + let weight = 0; + if (this.enabled) { + weight = this.weight; + const interpolant = this._weightInterpolant; + if (interpolant !== null) { + const interpolantValue = interpolant.evaluate(time)[0]; + weight *= interpolantValue; + if (time > interpolant.parameterPositions[1]) { + this.stopFading(); + if (interpolantValue === 0) { + this.enabled = false; + } + } + } + } + this._effectiveWeight = weight; + return weight; + } + _updateTimeScale(time) { + let timeScale = 0; + if (!this.paused) { + timeScale = this.timeScale; + const interpolant = this._timeScaleInterpolant; + if (interpolant !== null) { + const interpolantValue = interpolant.evaluate(time)[0]; + timeScale *= interpolantValue; + if (time > interpolant.parameterPositions[1]) { + this.stopWarping(); + if (timeScale === 0) { + this.paused = true; + } else { + this.timeScale = timeScale; + } + } + } + } + this._effectiveTimeScale = timeScale; + return timeScale; + } + _updateTime(deltaTime) { + const duration = this._clip.duration; + const loop = this.loop; + let time = this.time + deltaTime; + let loopCount = this._loopCount; + const pingPong = loop === LoopPingPong; + if (deltaTime === 0) { + if (loopCount === -1) return time; + return pingPong && (loopCount & 1) === 1 ? duration - time : time; + } + if (loop === LoopOnce) { + if (loopCount === -1) { + this._loopCount = 0; + this._setEndings(true, true, false); + } + handle_stop: { + if (time >= duration) { + time = duration; + } else if (time < 0) { + time = 0; + } else { + this.time = time; + break handle_stop; + } + if (this.clampWhenFinished) this.paused = true; + else this.enabled = false; + this.time = time; + this._mixer.dispatchEvent({ + type: "finished", + action: this, + direction: deltaTime < 0 ? -1 : 1 + }); + } + } else { + if (loopCount === -1) { + if (deltaTime >= 0) { + loopCount = 0; + this._setEndings(true, this.repetitions === 0, pingPong); + } else { + this._setEndings(this.repetitions === 0, true, pingPong); + } + } + if (time >= duration || time < 0) { + const loopDelta = Math.floor(time / duration); + time -= duration * loopDelta; + loopCount += Math.abs(loopDelta); + const pending = this.repetitions - loopCount; + if (pending <= 0) { + if (this.clampWhenFinished) this.paused = true; + else this.enabled = false; + time = deltaTime > 0 ? duration : 0; + this.time = time; + this._mixer.dispatchEvent({ + type: "finished", + action: this, + direction: deltaTime > 0 ? 1 : -1 + }); + } else { + if (pending === 1) { + const atStart = deltaTime < 0; + this._setEndings(atStart, !atStart, pingPong); + } else { + this._setEndings(false, false, pingPong); + } + this._loopCount = loopCount; + this.time = time; + this._mixer.dispatchEvent({ + type: "loop", + action: this, + loopDelta + }); + } + } else { + this.time = time; + } + if (pingPong && (loopCount & 1) === 1) { + return duration - time; + } + } + return time; + } + _setEndings(atStart, atEnd, pingPong) { + const settings = this._interpolantSettings; + if (pingPong) { + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + } else { + if (atStart) { + settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; + } else { + settings.endingStart = WrapAroundEnding; + } + if (atEnd) { + settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; + } else { + settings.endingEnd = WrapAroundEnding; + } + } + } + _scheduleFading(duration, weightNow, weightThen) { + const mixer = this._mixer, now = mixer.time; + let interpolant = this._weightInterpolant; + if (interpolant === null) { + interpolant = mixer._lendControlInterpolant(); + this._weightInterpolant = interpolant; + } + const times = interpolant.parameterPositions, values = interpolant.sampleValues; + times[0] = now; + values[0] = weightNow; + times[1] = now + duration; + values[1] = weightThen; + return this; + } +}; +var _controlInterpolantsResultBuffer = new Float32Array(1); +var AnimationMixer = class extends EventDispatcher { + /** + * Constructs a new animation mixer. + * + * @param {Object3D} root - The object whose animations shall be played by this mixer. + */ + constructor(root) { + super(); + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + this.time = 0; + this.timeScale = 1; + } + _bindAction(action, prototypeAction) { + const root = action._localRoot || this._root, tracks = action._clip.tracks, nTracks = tracks.length, bindings = action._propertyBindings, interpolants = action._interpolants, rootUuid = root.uuid, bindingsByRoot = this._bindingsByRootAndName; + let bindingsByName = bindingsByRoot[rootUuid]; + if (bindingsByName === void 0) { + bindingsByName = {}; + bindingsByRoot[rootUuid] = bindingsByName; + } + for (let i = 0; i !== nTracks; ++i) { + const track = tracks[i], trackName = track.name; + let binding = bindingsByName[trackName]; + if (binding !== void 0) { + ++binding.referenceCount; + bindings[i] = binding; + } else { + binding = bindings[i]; + if (binding !== void 0) { + if (binding._cacheIndex === null) { + ++binding.referenceCount; + this._addInactiveBinding(binding, rootUuid, trackName); + } + continue; + } + const path = prototypeAction && prototypeAction._propertyBindings[i].binding.parsedPath; + binding = new PropertyMixer( + PropertyBinding.create(root, trackName, path), + track.ValueTypeName, + track.getValueSize() + ); + ++binding.referenceCount; + this._addInactiveBinding(binding, rootUuid, trackName); + bindings[i] = binding; + } + interpolants[i].resultBuffer = binding.buffer; + } + } + _activateAction(action) { + if (!this._isActiveAction(action)) { + if (action._cacheIndex === null) { + const rootUuid = (action._localRoot || this._root).uuid, clipUuid = action._clip.uuid, actionsForClip = this._actionsByClip[clipUuid]; + this._bindAction( + action, + actionsForClip && actionsForClip.knownActions[0] + ); + this._addInactiveAction(action, clipUuid, rootUuid); + } + const bindings = action._propertyBindings; + for (let i = 0, n = bindings.length; i !== n; ++i) { + const binding = bindings[i]; + if (binding.useCount++ === 0) { + this._lendBinding(binding); + binding.saveOriginalState(); + } + } + this._lendAction(action); + } + } + _deactivateAction(action) { + if (this._isActiveAction(action)) { + const bindings = action._propertyBindings; + for (let i = 0, n = bindings.length; i !== n; ++i) { + const binding = bindings[i]; + if (--binding.useCount === 0) { + binding.restoreOriginalState(); + this._takeBackBinding(binding); + } + } + this._takeBackAction(action); + } + } + // Memory manager + _initMemoryManager() { + this._actions = []; + this._nActiveActions = 0; + this._actionsByClip = {}; + this._bindings = []; + this._nActiveBindings = 0; + this._bindingsByRootAndName = {}; + this._controlInterpolants = []; + this._nActiveControlInterpolants = 0; + const scope = this; + this.stats = { + actions: { + get total() { + return scope._actions.length; + }, + get inUse() { + return scope._nActiveActions; + } + }, + bindings: { + get total() { + return scope._bindings.length; + }, + get inUse() { + return scope._nActiveBindings; + } + }, + controlInterpolants: { + get total() { + return scope._controlInterpolants.length; + }, + get inUse() { + return scope._nActiveControlInterpolants; + } + } + }; + } + // Memory management for AnimationAction objects + _isActiveAction(action) { + const index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + } + _addInactiveAction(action, clipUuid, rootUuid) { + const actions = this._actions, actionsByClip = this._actionsByClip; + let actionsForClip = actionsByClip[clipUuid]; + if (actionsForClip === void 0) { + actionsForClip = { + knownActions: [action], + actionByRoot: {} + }; + action._byClipCacheIndex = 0; + actionsByClip[clipUuid] = actionsForClip; + } else { + const knownActions = actionsForClip.knownActions; + action._byClipCacheIndex = knownActions.length; + knownActions.push(action); + } + action._cacheIndex = actions.length; + actions.push(action); + actionsForClip.actionByRoot[rootUuid] = action; + } + _removeInactiveAction(action) { + const actions = this._actions, lastInactiveAction = actions[actions.length - 1], cacheIndex = action._cacheIndex; + lastInactiveAction._cacheIndex = cacheIndex; + actions[cacheIndex] = lastInactiveAction; + actions.pop(); + action._cacheIndex = null; + const clipUuid = action._clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[clipUuid], knownActionsForClip = actionsForClip.knownActions, lastKnownAction = knownActionsForClip[knownActionsForClip.length - 1], byClipCacheIndex = action._byClipCacheIndex; + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[byClipCacheIndex] = lastKnownAction; + knownActionsForClip.pop(); + action._byClipCacheIndex = null; + const actionByRoot = actionsForClip.actionByRoot, rootUuid = (action._localRoot || this._root).uuid; + delete actionByRoot[rootUuid]; + if (knownActionsForClip.length === 0) { + delete actionsByClip[clipUuid]; + } + this._removeInactiveBindingsForAction(action); + } + _removeInactiveBindingsForAction(action) { + const bindings = action._propertyBindings; + for (let i = 0, n = bindings.length; i !== n; ++i) { + const binding = bindings[i]; + if (--binding.referenceCount === 0) { + this._removeInactiveBinding(binding); + } + } + } + _lendAction(action) { + const actions = this._actions, prevIndex = action._cacheIndex, lastActiveIndex = this._nActiveActions++, firstInactiveAction = actions[lastActiveIndex]; + action._cacheIndex = lastActiveIndex; + actions[lastActiveIndex] = action; + firstInactiveAction._cacheIndex = prevIndex; + actions[prevIndex] = firstInactiveAction; + } + _takeBackAction(action) { + const actions = this._actions, prevIndex = action._cacheIndex, firstInactiveIndex = --this._nActiveActions, lastActiveAction = actions[firstInactiveIndex]; + action._cacheIndex = firstInactiveIndex; + actions[firstInactiveIndex] = action; + lastActiveAction._cacheIndex = prevIndex; + actions[prevIndex] = lastActiveAction; + } + // Memory management for PropertyMixer objects + _addInactiveBinding(binding, rootUuid, trackName) { + const bindingsByRoot = this._bindingsByRootAndName, bindings = this._bindings; + let bindingByName = bindingsByRoot[rootUuid]; + if (bindingByName === void 0) { + bindingByName = {}; + bindingsByRoot[rootUuid] = bindingByName; + } + bindingByName[trackName] = binding; + binding._cacheIndex = bindings.length; + bindings.push(binding); + } + _removeInactiveBinding(binding) { + const bindings = this._bindings, propBinding = binding.binding, rootUuid = propBinding.rootNode.uuid, trackName = propBinding.path, bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[rootUuid], lastInactiveBinding = bindings[bindings.length - 1], cacheIndex = binding._cacheIndex; + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[cacheIndex] = lastInactiveBinding; + bindings.pop(); + delete bindingByName[trackName]; + if (Object.keys(bindingByName).length === 0) { + delete bindingsByRoot[rootUuid]; + } + } + _lendBinding(binding) { + const bindings = this._bindings, prevIndex = binding._cacheIndex, lastActiveIndex = this._nActiveBindings++, firstInactiveBinding = bindings[lastActiveIndex]; + binding._cacheIndex = lastActiveIndex; + bindings[lastActiveIndex] = binding; + firstInactiveBinding._cacheIndex = prevIndex; + bindings[prevIndex] = firstInactiveBinding; + } + _takeBackBinding(binding) { + const bindings = this._bindings, prevIndex = binding._cacheIndex, firstInactiveIndex = --this._nActiveBindings, lastActiveBinding = bindings[firstInactiveIndex]; + binding._cacheIndex = firstInactiveIndex; + bindings[firstInactiveIndex] = binding; + lastActiveBinding._cacheIndex = prevIndex; + bindings[prevIndex] = lastActiveBinding; + } + // Memory management of Interpolants for weight and time scale + _lendControlInterpolant() { + const interpolants = this._controlInterpolants, lastActiveIndex = this._nActiveControlInterpolants++; + let interpolant = interpolants[lastActiveIndex]; + if (interpolant === void 0) { + interpolant = new LinearInterpolant( + new Float32Array(2), + new Float32Array(2), + 1, + _controlInterpolantsResultBuffer + ); + interpolant.__cacheIndex = lastActiveIndex; + interpolants[lastActiveIndex] = interpolant; + } + return interpolant; + } + _takeBackControlInterpolant(interpolant) { + const interpolants = this._controlInterpolants, prevIndex = interpolant.__cacheIndex, firstInactiveIndex = --this._nActiveControlInterpolants, lastActiveInterpolant = interpolants[firstInactiveIndex]; + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[firstInactiveIndex] = interpolant; + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[prevIndex] = lastActiveInterpolant; + } + /** + * Returns an instance of {@link AnimationAction} for the passed clip. + * + * If an action fitting the clip and root parameters doesn't yet exist, it + * will be created by this method. Calling this method several times with the + * same clip and root parameters always returns the same action. + * + * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip. + * @param {Object3D} [optionalRoot] - An alternative root object. + * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode. + * @return {?AnimationAction} The animation action. + */ + clipAction(clip, optionalRoot, blendMode) { + const root = optionalRoot || this._root, rootUuid = root.uuid; + let clipObject = typeof clip === "string" ? AnimationClip.findByName(root, clip) : clip; + const clipUuid = clipObject !== null ? clipObject.uuid : clip; + const actionsForClip = this._actionsByClip[clipUuid]; + let prototypeAction = null; + if (blendMode === void 0) { + if (clipObject !== null) { + blendMode = clipObject.blendMode; + } else { + blendMode = NormalAnimationBlendMode; + } + } + if (actionsForClip !== void 0) { + const existingAction = actionsForClip.actionByRoot[rootUuid]; + if (existingAction !== void 0 && existingAction.blendMode === blendMode) { + return existingAction; + } + prototypeAction = actionsForClip.knownActions[0]; + if (clipObject === null) + clipObject = prototypeAction._clip; + } + if (clipObject === null) return null; + const newAction = new AnimationAction(this, clipObject, optionalRoot, blendMode); + this._bindAction(newAction, prototypeAction); + this._addInactiveAction(newAction, clipUuid, rootUuid); + return newAction; + } + /** + * Returns an existing animation action for the passed clip. + * + * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip. + * @param {Object3D} [optionalRoot] - An alternative root object. + * @return {?AnimationAction} The animation action. Returns `null` if no action was found. + */ + existingAction(clip, optionalRoot) { + const root = optionalRoot || this._root, rootUuid = root.uuid, clipObject = typeof clip === "string" ? AnimationClip.findByName(root, clip) : clip, clipUuid = clipObject ? clipObject.uuid : clip, actionsForClip = this._actionsByClip[clipUuid]; + if (actionsForClip !== void 0) { + return actionsForClip.actionByRoot[rootUuid] || null; + } + return null; + } + /** + * Deactivates all previously scheduled actions on this mixer. + * + * @return {AnimationMixer} A reference to this animation mixer. + */ + stopAllAction() { + const actions = this._actions, nActions = this._nActiveActions; + for (let i = nActions - 1; i >= 0; --i) { + actions[i].stop(); + } + return this; + } + /** + * Advances the global mixer time and updates the animation. + * + * This is usually done in the render loop by passing the delta + * time from {@link Clock} or {@link Timer}. + * + * @param {number} deltaTime - The delta time in seconds. + * @return {AnimationMixer} A reference to this animation mixer. + */ + update(deltaTime) { + deltaTime *= this.timeScale; + const actions = this._actions, nActions = this._nActiveActions, time = this.time += deltaTime, timeDirection = Math.sign(deltaTime), accuIndex = this._accuIndex ^= 1; + for (let i = 0; i !== nActions; ++i) { + const action = actions[i]; + action._update(time, deltaTime, timeDirection, accuIndex); + } + const bindings = this._bindings, nBindings = this._nActiveBindings; + for (let i = 0; i !== nBindings; ++i) { + bindings[i].apply(accuIndex); + } + return this; + } + /** + * Sets the global mixer to a specific time and updates the animation accordingly. + * + * This is useful when you need to jump to an exact time in an animation. The + * input parameter will be scaled by {@link AnimationMixer#timeScale} + * + * @param {number} time - The time to set in seconds. + * @return {AnimationMixer} A reference to this animation mixer. + */ + setTime(time) { + this.time = 0; + for (let i = 0; i < this._actions.length; i++) { + this._actions[i].time = 0; + } + return this.update(time); + } + /** + * Returns this mixer's root object. + * + * @return {Object3D} The mixer's root object. + */ + getRoot() { + return this._root; + } + /** + * Deallocates all memory resources for a clip. Before using this method make + * sure to call {@link AnimationAction#stop} for all related actions. + * + * @param {AnimationClip} clip - The clip to uncache. + */ + uncacheClip(clip) { + const actions = this._actions, clipUuid = clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[clipUuid]; + if (actionsForClip !== void 0) { + const actionsToRemove = actionsForClip.knownActions; + for (let i = 0, n = actionsToRemove.length; i !== n; ++i) { + const action = actionsToRemove[i]; + this._deactivateAction(action); + const cacheIndex = action._cacheIndex, lastInactiveAction = actions[actions.length - 1]; + action._cacheIndex = null; + action._byClipCacheIndex = null; + lastInactiveAction._cacheIndex = cacheIndex; + actions[cacheIndex] = lastInactiveAction; + actions.pop(); + this._removeInactiveBindingsForAction(action); + } + delete actionsByClip[clipUuid]; + } + } + /** + * Deallocates all memory resources for a root object. Before using this + * method make sure to call {@link AnimationAction#stop} for all related + * actions or alternatively {@link AnimationMixer#stopAllAction} when the + * mixer operates on a single root. + * + * @param {Object3D} root - The root object to uncache. + */ + uncacheRoot(root) { + const rootUuid = root.uuid, actionsByClip = this._actionsByClip; + for (const clipUuid in actionsByClip) { + const actionByRoot = actionsByClip[clipUuid].actionByRoot, action = actionByRoot[rootUuid]; + if (action !== void 0) { + this._deactivateAction(action); + this._removeInactiveAction(action); + } + } + const bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[rootUuid]; + if (bindingByName !== void 0) { + for (const trackName in bindingByName) { + const binding = bindingByName[trackName]; + binding.restoreOriginalState(); + this._removeInactiveBinding(binding); + } + } + } + /** + * Deallocates all memory resources for an action. The action is identified by the + * given clip and an optional root object. Before using this method make + * sure to call {@link AnimationAction#stop} to deactivate the action. + * + * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip. + * @param {Object3D} [optionalRoot] - An alternative root object. + */ + uncacheAction(clip, optionalRoot) { + const action = this.existingAction(clip, optionalRoot); + if (action !== null) { + this._deactivateAction(action); + this._removeInactiveAction(action); + } + } +}; +var RenderTarget3D = class extends RenderTarget { + /** + * Constructs a new 3D render target. + * + * @param {number} [width=1] - The width of the render target. + * @param {number} [height=1] - The height of the render target. + * @param {number} [depth=1] - The height of the render target. + * @param {RenderTarget~Options} [options] - The configuration object. + */ + constructor(width = 1, height = 1, depth = 1, options = {}) { + super(width, height, options); + this.isRenderTarget3D = true; + this.depth = depth; + this.texture = new Data3DTexture(null, width, height, depth); + this._setTextureOptions(options); + this.texture.isRenderTargetTexture = true; + } +}; +var Uniform = class _Uniform { + /** + * Constructs a new uniform. + * + * @param {any} value - The uniform value. + */ + constructor(value) { + this.value = value; + } + /** + * Returns a new uniform with copied values from this instance. + * If the value has a `clone()` method, the value is cloned as well. + * + * @return {Uniform} A clone of this instance. + */ + clone() { + return new _Uniform(this.value.clone === void 0 ? this.value : this.value.clone()); + } +}; +var _id = 0; +var UniformsGroup = class extends EventDispatcher { + /** + * Constructs a new uniforms group. + */ + constructor() { + super(); + this.isUniformsGroup = true; + Object.defineProperty(this, "id", { value: _id++ }); + this.name = ""; + this.usage = StaticDrawUsage; + this.uniforms = []; + } + /** + * Adds the given uniform to this uniforms group. + * + * @param {Uniform} uniform - The uniform to add. + * @return {UniformsGroup} A reference to this uniforms group. + */ + add(uniform) { + this.uniforms.push(uniform); + return this; + } + /** + * Removes the given uniform from this uniforms group. + * + * @param {Uniform} uniform - The uniform to remove. + * @return {UniformsGroup} A reference to this uniforms group. + */ + remove(uniform) { + const index = this.uniforms.indexOf(uniform); + if (index !== -1) this.uniforms.splice(index, 1); + return this; + } + /** + * Sets the name of this uniforms group. + * + * @param {string} name - The name to set. + * @return {UniformsGroup} A reference to this uniforms group. + */ + setName(name) { + this.name = name; + return this; + } + /** + * Sets the usage of this uniforms group. + * + * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set. + * @return {UniformsGroup} A reference to this uniforms group. + */ + setUsage(value) { + this.usage = value; + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + * + * @fires Texture#dispose + */ + dispose() { + this.dispatchEvent({ type: "dispose" }); + } + /** + * Copies the values of the given uniforms group to this instance. + * + * @param {UniformsGroup} source - The uniforms group to copy. + * @return {UniformsGroup} A reference to this uniforms group. + */ + copy(source) { + this.name = source.name; + this.usage = source.usage; + const uniformsSource = source.uniforms; + this.uniforms.length = 0; + for (let i = 0, l = uniformsSource.length; i < l; i++) { + const uniforms = Array.isArray(uniformsSource[i]) ? uniformsSource[i] : [uniformsSource[i]]; + for (let j = 0; j < uniforms.length; j++) { + this.uniforms.push(uniforms[j].clone()); + } + } + return this; + } + /** + * Returns a new uniforms group with copied values from this instance. + * + * @return {UniformsGroup} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } +}; +var InstancedInterleavedBuffer = class extends InterleavedBuffer { + /** + * Constructs a new instanced interleaved buffer. + * + * @param {TypedArray} array - A typed array with a shared buffer storing attribute data. + * @param {number} stride - The number of typed-array elements per vertex. + * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated. + */ + constructor(array, stride, meshPerAttribute = 1) { + super(array, stride); + this.isInstancedInterleavedBuffer = true; + this.meshPerAttribute = meshPerAttribute; + } + copy(source) { + super.copy(source); + this.meshPerAttribute = source.meshPerAttribute; + return this; + } + clone(data) { + const ib = super.clone(data); + ib.meshPerAttribute = this.meshPerAttribute; + return ib; + } + toJSON(data) { + const json = super.toJSON(data); + json.isInstancedInterleavedBuffer = true; + json.meshPerAttribute = this.meshPerAttribute; + return json; + } +}; +var GLBufferAttribute = class { + /** + * Constructs a new GL buffer attribute. + * + * @param {WebGLBuffer} buffer - The native WebGL buffer. + * @param {number} type - The native data type (e.g. `gl.FLOAT`). + * @param {number} itemSize - The item size. + * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter. + * @param {number} count - The expected number of vertices in VBO. + * @param {boolean} [normalized=false] - Whether the data are normalized or not. + */ + constructor(buffer, type, itemSize, elementSize, count, normalized = false) { + this.isGLBufferAttribute = true; + this.name = ""; + this.buffer = buffer; + this.type = type; + this.itemSize = itemSize; + this.elementSize = elementSize; + this.count = count; + this.normalized = normalized; + this.version = 0; + } + /** + * Flag to indicate that this attribute has changed and should be re-sent to + * the GPU. Set this to `true` when you modify the value of the array. + * + * @type {number} + * @default false + * @param {boolean} value + */ + set needsUpdate(value) { + if (value === true) this.version++; + } + /** + * Sets the given native WebGL buffer. + * + * @param {WebGLBuffer} buffer - The buffer to set. + * @return {BufferAttribute} A reference to this instance. + */ + setBuffer(buffer) { + this.buffer = buffer; + return this; + } + /** + * Sets the given native data type and element size. + * + * @param {number} type - The native data type (e.g. `gl.FLOAT`). + * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter. + * @return {BufferAttribute} A reference to this instance. + */ + setType(type, elementSize) { + this.type = type; + this.elementSize = elementSize; + return this; + } + /** + * Sets the item size. + * + * @param {number} itemSize - The item size. + * @return {BufferAttribute} A reference to this instance. + */ + setItemSize(itemSize) { + this.itemSize = itemSize; + return this; + } + /** + * Sets the count (the expected number of vertices in VBO). + * + * @param {number} count - The count. + * @return {BufferAttribute} A reference to this instance. + */ + setCount(count) { + this.count = count; + return this; + } +}; +var _matrix = new Matrix4(); +var Raycaster = class { + /** + * Constructs a new raycaster. + * + * @param {Vector3} origin - The origin vector where the ray casts from. + * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray. + * @param {number} [near=0] - All results returned are further away than near. Near can't be negative. + * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near. + */ + constructor(origin, direction, near = 0, far = Infinity) { + this.ray = new Ray(origin, direction); + this.near = near; + this.far = far; + this.camera = null; + this.layers = new Layers(); + this.params = { + Mesh: {}, + Line: { threshold: 1 }, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + } + /** + * Updates the ray with a new origin and direction by copying the values from the arguments. + * + * @param {Vector3} origin - The origin vector where the ray casts from. + * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray. + */ + set(origin, direction) { + this.ray.set(origin, direction); + } + /** + * Uses the given coordinates and camera to compute a new origin and direction for the internal ray. + * + * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC). + * X and Y components should be between `-1` and `1`. + * @param {Camera} camera - The camera from which the ray should originate. + */ + setFromCamera(coords, camera) { + if (camera.isPerspectiveCamera) { + this.ray.origin.setFromMatrixPosition(camera.matrixWorld); + this.ray.direction.set(coords.x, coords.y, 0.5).unproject(camera).sub(this.ray.origin).normalize(); + this.camera = camera; + } else if (camera.isOrthographicCamera) { + this.ray.origin.set(coords.x, coords.y, (camera.near + camera.far) / (camera.near - camera.far)).unproject(camera); + this.ray.direction.set(0, 0, -1).transformDirection(camera.matrixWorld); + this.camera = camera; + } else { + error("Raycaster: Unsupported camera type: " + camera.type); + } + } + /** + * Uses the given WebXR controller to compute a new origin and direction for the internal ray. + * + * @param {WebXRController} controller - The controller to copy the position and direction from. + * @return {Raycaster} A reference to this raycaster. + */ + setFromXRController(controller) { + _matrix.identity().extractRotation(controller.matrixWorld); + this.ray.origin.setFromMatrixPosition(controller.matrixWorld); + this.ray.direction.set(0, 0, -1).applyMatrix4(_matrix); + return this; + } + /** + * The intersection point of a raycaster intersection test. + * @typedef {Object} Raycaster~Intersection + * @property {number} distance - The distance from the ray's origin to the intersection point. + * @property {number} distanceToRay - Some 3D objects e.g. {@link Points} provide the distance of the + * intersection to the nearest point on the ray. For other objects it will be `undefined`. + * @property {Vector3} point - The intersection point, in world coordinates. + * @property {Object} face - The face that has been intersected. + * @property {number} faceIndex - The face index. + * @property {Object3D} object - The 3D object that has been intersected. + * @property {Vector2} uv - U,V coordinates at point of intersection. + * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection. + * @property {Vector3} normal - Interpolated normal vector at point of intersection. + * @property {number} instanceId - The index number of the instance where the ray + * intersects the {@link InstancedMesh}. + */ + /** + * Checks all intersection between the ray and the object with or without the + * descendants. Intersections are returned sorted by distance, closest first. + * + * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when + * evaluating whether the ray intersects the object or not. This allows meshes to respond + * differently to ray casting than lines or points. + * + * Note that for meshes, faces must be pointed towards the origin of the ray in order + * to be detected; intersections of the ray passing through the back of a face will not + * be detected. To raycast against both faces of an object, you'll want to set {@link Material#side} + * to `THREE.DoubleSide`. + * + * @param {Object3D} object - The 3D object to check for intersection with the ray. + * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants. + * Otherwise it only checks intersection with the object. + * @param {Array} [intersects=[]] The target array that holds the result of the method. + * @return {Array} An array holding the intersection points. + */ + intersectObject(object, recursive = true, intersects2 = []) { + intersect(object, this, intersects2, recursive); + intersects2.sort(ascSort); + return intersects2; + } + /** + * Checks all intersection between the ray and the objects with or without + * the descendants. Intersections are returned sorted by distance, closest first. + * + * @param {Array} objects - The 3D objects to check for intersection with the ray. + * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants. + * Otherwise it only checks intersection with the object. + * @param {Array} [intersects=[]] The target array that holds the result of the method. + * @return {Array} An array holding the intersection points. + */ + intersectObjects(objects, recursive = true, intersects2 = []) { + for (let i = 0, l = objects.length; i < l; i++) { + intersect(objects[i], this, intersects2, recursive); + } + intersects2.sort(ascSort); + return intersects2; + } +}; +function ascSort(a, b) { + return a.distance - b.distance; +} +function intersect(object, raycaster, intersects2, recursive) { + let propagate = true; + if (object.layers.test(raycaster.layers)) { + const result = object.raycast(raycaster, intersects2); + if (result === false) propagate = false; + } + if (propagate === true && recursive === true) { + const children = object.children; + for (let i = 0, l = children.length; i < l; i++) { + intersect(children[i], raycaster, intersects2, true); + } + } +} +var Timer = class { + /** + * Constructs a new timer. + */ + constructor() { + this._previousTime = 0; + this._currentTime = 0; + this._startTime = performance.now(); + this._delta = 0; + this._elapsed = 0; + this._timescale = 1; + this._document = null; + this._pageVisibilityHandler = null; + } + /** + * Connect the timer to the given document.Calling this method is not mandatory to + * use the timer but enables the usage of the Page Visibility API to avoid large time + * delta values. + * + * @param {Document} document - The document. + */ + connect(document2) { + this._document = document2; + if (document2.hidden !== void 0) { + this._pageVisibilityHandler = handleVisibilityChange.bind(this); + document2.addEventListener("visibilitychange", this._pageVisibilityHandler, false); + } + } + /** + * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API. + */ + disconnect() { + if (this._pageVisibilityHandler !== null) { + this._document.removeEventListener("visibilitychange", this._pageVisibilityHandler); + this._pageVisibilityHandler = null; + } + this._document = null; + } + /** + * Returns the time delta in seconds. + * + * @return {number} The time delta in second. + */ + getDelta() { + return this._delta / 1e3; + } + /** + * Returns the elapsed time in seconds. + * + * @return {number} The elapsed time in second. + */ + getElapsed() { + return this._elapsed / 1e3; + } + /** + * Returns the timescale. + * + * @return {number} The timescale. + */ + getTimescale() { + return this._timescale; + } + /** + * Sets the given timescale which scale the time delta computation + * in `update()`. + * + * @param {number} timescale - The timescale to set. + * @return {Timer} A reference to this timer. + */ + setTimescale(timescale) { + this._timescale = timescale; + return this; + } + /** + * Resets the time computation for the current simulation step. + * + * @return {Timer} A reference to this timer. + */ + reset() { + this._currentTime = performance.now() - this._startTime; + return this; + } + /** + * Can be used to free all internal resources. Usually called when + * the timer instance isn't required anymore. + */ + dispose() { + this.disconnect(); + } + /** + * Updates the internal state of the timer. This method should be called + * once per simulation step and before you perform queries against the timer + * (e.g. via `getDelta()`). + * + * @param {number} timestamp - The current time in milliseconds. Can be obtained + * from the `requestAnimationFrame` callback argument. If not provided, the current + * time will be determined with `performance.now`. + * @return {Timer} A reference to this timer. + */ + update(timestamp) { + if (this._pageVisibilityHandler !== null && this._document.hidden === true) { + this._delta = 0; + } else { + this._previousTime = this._currentTime; + this._currentTime = (timestamp !== void 0 ? timestamp : performance.now()) - this._startTime; + this._delta = (this._currentTime - this._previousTime) * this._timescale; + this._elapsed += this._delta; + } + return this; + } +}; +function handleVisibilityChange() { + if (this._document.hidden === false) this.reset(); +} +var Spherical = class { + /** + * Constructs a new spherical. + * + * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin. + * @param {number} [phi=0] - The polar angle in radians from the y (up) axis. + * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis. + */ + constructor(radius = 1, phi = 0, theta = 0) { + this.radius = radius; + this.phi = phi; + this.theta = theta; + } + /** + * Sets the spherical components by copying the given values. + * + * @param {number} radius - The radius. + * @param {number} phi - The polar angle. + * @param {number} theta - The azimuthal angle. + * @return {Spherical} A reference to this spherical. + */ + set(radius, phi, theta) { + this.radius = radius; + this.phi = phi; + this.theta = theta; + return this; + } + /** + * Copies the values of the given spherical to this instance. + * + * @param {Spherical} other - The spherical to copy. + * @return {Spherical} A reference to this spherical. + */ + copy(other) { + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + return this; + } + /** + * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi - + * `0.000001`. + * + * @return {Spherical} A reference to this spherical. + */ + makeSafe() { + const EPS = 1e-6; + this.phi = clamp(this.phi, EPS, Math.PI - EPS); + return this; + } + /** + * Sets the spherical components from the given vector which is assumed to hold + * Cartesian coordinates. + * + * @param {Vector3} v - The vector to set. + * @return {Spherical} A reference to this spherical. + */ + setFromVector3(v) { + return this.setFromCartesianCoords(v.x, v.y, v.z); + } + /** + * Sets the spherical components from the given Cartesian coordinates. + * + * @param {number} x - The x value. + * @param {number} y - The y value. + * @param {number} z - The z value. + * @return {Spherical} A reference to this spherical. + */ + setFromCartesianCoords(x, y, z) { + this.radius = Math.sqrt(x * x + y * y + z * z); + if (this.radius === 0) { + this.theta = 0; + this.phi = 0; + } else { + this.theta = Math.atan2(x, z); + this.phi = Math.acos(clamp(y / this.radius, -1, 1)); + } + return this; + } + /** + * Returns a new spherical with copied values from this instance. + * + * @return {Spherical} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } +}; +var Cylindrical = class { + /** + * Constructs a new cylindrical. + * + * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane. + * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis. + * @param {number} [y=0] - The height above the x-z plane. + */ + constructor(radius = 1, theta = 0, y = 0) { + this.radius = radius; + this.theta = theta; + this.y = y; + } + /** + * Sets the cylindrical components by copying the given values. + * + * @param {number} radius - The radius. + * @param {number} theta - The theta angle. + * @param {number} y - The height value. + * @return {Cylindrical} A reference to this cylindrical. + */ + set(radius, theta, y) { + this.radius = radius; + this.theta = theta; + this.y = y; + return this; + } + /** + * Copies the values of the given cylindrical to this instance. + * + * @param {Cylindrical} other - The cylindrical to copy. + * @return {Cylindrical} A reference to this cylindrical. + */ + copy(other) { + this.radius = other.radius; + this.theta = other.theta; + this.y = other.y; + return this; + } + /** + * Sets the cylindrical components from the given vector which is assumed to hold + * Cartesian coordinates. + * + * @param {Vector3} v - The vector to set. + * @return {Cylindrical} A reference to this cylindrical. + */ + setFromVector3(v) { + return this.setFromCartesianCoords(v.x, v.y, v.z); + } + /** + * Sets the cylindrical components from the given Cartesian coordinates. + * + * @param {number} x - The x value. + * @param {number} y - The x value. + * @param {number} z - The x value. + * @return {Cylindrical} A reference to this cylindrical. + */ + setFromCartesianCoords(x, y, z) { + this.radius = Math.sqrt(x * x + z * z); + this.theta = Math.atan2(x, z); + this.y = y; + return this; + } + /** + * Returns a new cylindrical with copied values from this instance. + * + * @return {Cylindrical} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } +}; +var Matrix2 = class _Matrix2 { + /** + * Constructs a new 2x2 matrix. The arguments are supposed to be + * in row-major order. If no arguments are provided, the constructor + * initializes the matrix as an identity matrix. + * + * @param {number} [n11] - 1-1 matrix element. + * @param {number} [n12] - 1-2 matrix element. + * @param {number} [n21] - 2-1 matrix element. + * @param {number} [n22] - 2-2 matrix element. + */ + constructor(n11, n12, n21, n22) { + _Matrix2.prototype.isMatrix2 = true; + this.elements = [ + 1, + 0, + 0, + 1 + ]; + if (n11 !== void 0) { + this.set(n11, n12, n21, n22); + } + } + /** + * Sets this matrix to the 2x2 identity matrix. + * + * @return {Matrix2} A reference to this matrix. + */ + identity() { + this.set( + 1, + 0, + 0, + 1 + ); + return this; + } + /** + * Sets the elements of the matrix from the given array. + * + * @param {Array} array - The matrix elements in column-major order. + * @param {number} [offset=0] - Index of the first element in the array. + * @return {Matrix2} A reference to this matrix. + */ + fromArray(array, offset = 0) { + for (let i = 0; i < 4; i++) { + this.elements[i] = array[i + offset]; + } + return this; + } + /** + * Sets the elements of the matrix.The arguments are supposed to be + * in row-major order. + * + * @param {number} n11 - 1-1 matrix element. + * @param {number} n12 - 1-2 matrix element. + * @param {number} n21 - 2-1 matrix element. + * @param {number} n22 - 2-2 matrix element. + * @return {Matrix2} A reference to this matrix. + */ + set(n11, n12, n21, n22) { + const te = this.elements; + te[0] = n11; + te[2] = n12; + te[1] = n21; + te[3] = n22; + return this; + } +}; +var _vector$4 = new Vector2(); +var Box2 = class { + /** + * Constructs a new bounding box. + * + * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box. + * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box. + */ + constructor(min = new Vector2(Infinity, Infinity), max = new Vector2(-Infinity, -Infinity)) { + this.isBox2 = true; + this.min = min; + this.max = max; + } + /** + * Sets the lower and upper boundaries of this box. + * Please note that this method only copies the values from the given objects. + * + * @param {Vector2} min - The lower boundary of the box. + * @param {Vector2} max - The upper boundary of the box. + * @return {Box2} A reference to this bounding box. + */ + set(min, max) { + this.min.copy(min); + this.max.copy(max); + return this; + } + /** + * Sets the upper and lower bounds of this box so it encloses the position data + * in the given array. + * + * @param {Array} points - An array holding 2D position data as instances of {@link Vector2}. + * @return {Box2} A reference to this bounding box. + */ + setFromPoints(points) { + this.makeEmpty(); + for (let i = 0, il = points.length; i < il; i++) { + this.expandByPoint(points[i]); + } + return this; + } + /** + * Centers this box on the given center vector and sets this box's width, height and + * depth to the given size values. + * + * @param {Vector2} center - The center of the box. + * @param {Vector2} size - The x and y dimensions of the box. + * @return {Box2} A reference to this bounding box. + */ + setFromCenterAndSize(center, size) { + const halfSize = _vector$4.copy(size).multiplyScalar(0.5); + this.min.copy(center).sub(halfSize); + this.max.copy(center).add(halfSize); + return this; + } + /** + * Returns a new box with copied values from this instance. + * + * @return {Box2} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } + /** + * Copies the values of the given box to this instance. + * + * @param {Box2} box - The box to copy. + * @return {Box2} A reference to this bounding box. + */ + copy(box) { + this.min.copy(box.min); + this.max.copy(box.max); + return this; + } + /** + * Makes this box empty which means in encloses a zero space in 2D. + * + * @return {Box2} A reference to this bounding box. + */ + makeEmpty() { + this.min.x = this.min.y = Infinity; + this.max.x = this.max.y = -Infinity; + return this; + } + /** + * Returns true if this box includes zero points within its bounds. + * Note that a box with equal lower and upper bounds still includes one + * point, the one both bounds share. + * + * @return {boolean} Whether this box is empty or not. + */ + isEmpty() { + return this.max.x < this.min.x || this.max.y < this.min.y; + } + /** + * Returns the center point of this box. + * + * @param {Vector2} target - The target vector that is used to store the method's result. + * @return {Vector2} The center point. + */ + getCenter(target) { + return this.isEmpty() ? target.set(0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5); + } + /** + * Returns the dimensions of this box. + * + * @param {Vector2} target - The target vector that is used to store the method's result. + * @return {Vector2} The size. + */ + getSize(target) { + return this.isEmpty() ? target.set(0, 0) : target.subVectors(this.max, this.min); + } + /** + * Expands the boundaries of this box to include the given point. + * + * @param {Vector2} point - The point that should be included by the bounding box. + * @return {Box2} A reference to this bounding box. + */ + expandByPoint(point) { + this.min.min(point); + this.max.max(point); + return this; + } + /** + * Expands this box equilaterally by the given vector. The width of this + * box will be expanded by the x component of the vector in both + * directions. The height of this box will be expanded by the y component of + * the vector in both directions. + * + * @param {Vector2} vector - The vector that should expand the bounding box. + * @return {Box2} A reference to this bounding box. + */ + expandByVector(vector) { + this.min.sub(vector); + this.max.add(vector); + return this; + } + /** + * Expands each dimension of the box by the given scalar. If negative, the + * dimensions of the box will be contracted. + * + * @param {number} scalar - The scalar value that should expand the bounding box. + * @return {Box2} A reference to this bounding box. + */ + expandByScalar(scalar) { + this.min.addScalar(-scalar); + this.max.addScalar(scalar); + return this; + } + /** + * Returns `true` if the given point lies within or on the boundaries of this box. + * + * @param {Vector2} point - The point to test. + * @return {boolean} Whether the bounding box contains the given point or not. + */ + containsPoint(point) { + return point.x >= this.min.x && point.x <= this.max.x && point.y >= this.min.y && point.y <= this.max.y; + } + /** + * Returns `true` if this bounding box includes the entirety of the given bounding box. + * If this box and the given one are identical, this function also returns `true`. + * + * @param {Box2} box - The bounding box to test. + * @return {boolean} Whether the bounding box contains the given bounding box or not. + */ + containsBox(box) { + return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y; + } + /** + * Returns a point as a proportion of this box's width and height. + * + * @param {Vector2} point - A point in 2D space. + * @param {Vector2} target - The target vector that is used to store the method's result. + * @return {Vector2} A point as a proportion of this box's width and height. + */ + getParameter(point, target) { + return target.set( + (point.x - this.min.x) / (this.max.x - this.min.x), + (point.y - this.min.y) / (this.max.y - this.min.y) + ); + } + /** + * Returns `true` if the given bounding box intersects with this bounding box. + * + * @param {Box2} box - The bounding box to test. + * @return {boolean} Whether the given bounding box intersects with this bounding box. + */ + intersectsBox(box) { + return box.max.x >= this.min.x && box.min.x <= this.max.x && box.max.y >= this.min.y && box.min.y <= this.max.y; + } + /** + * Clamps the given point within the bounds of this box. + * + * @param {Vector2} point - The point to clamp. + * @param {Vector2} target - The target vector that is used to store the method's result. + * @return {Vector2} The clamped point. + */ + clampPoint(point, target) { + return target.copy(point).clamp(this.min, this.max); + } + /** + * Returns the euclidean distance from any edge of this box to the specified point. If + * the given point lies inside of this box, the distance will be `0`. + * + * @param {Vector2} point - The point to compute the distance to. + * @return {number} The euclidean distance. + */ + distanceToPoint(point) { + return this.clampPoint(point, _vector$4).distanceTo(point); + } + /** + * Computes the intersection of this bounding box and the given one, setting the upper + * bound of this box to the lesser of the two boxes' upper bounds and the + * lower bound of this box to the greater of the two boxes' lower bounds. If + * there's no overlap, makes this box empty. + * + * @param {Box2} box - The bounding box to intersect with. + * @return {Box2} A reference to this bounding box. + */ + intersect(box) { + this.min.max(box.min); + this.max.min(box.max); + if (this.isEmpty()) this.makeEmpty(); + return this; + } + /** + * Computes the union of this box and another and the given one, setting the upper + * bound of this box to the greater of the two boxes' upper bounds and the + * lower bound of this box to the lesser of the two boxes' lower bounds. + * + * @param {Box2} box - The bounding box that will be unioned with this instance. + * @return {Box2} A reference to this bounding box. + */ + union(box) { + this.min.min(box.min); + this.max.max(box.max); + return this; + } + /** + * Adds the given offset to both the upper and lower bounds of this bounding box, + * effectively moving it in 2D space. + * + * @param {Vector2} offset - The offset that should be used to translate the bounding box. + * @return {Box2} A reference to this bounding box. + */ + translate(offset) { + this.min.add(offset); + this.max.add(offset); + return this; + } + /** + * Returns `true` if this bounding box is equal with the given one. + * + * @param {Box2} box - The box to test for equality. + * @return {boolean} Whether this bounding box is equal with the given one. + */ + equals(box) { + return box.min.equals(this.min) && box.max.equals(this.max); + } +}; +var _startP = new Vector3(); +var _startEnd = new Vector3(); +var _d1 = new Vector3(); +var _d2 = new Vector3(); +var _r = new Vector3(); +var _c1 = new Vector3(); +var _c2 = new Vector3(); +var Line3 = class { + /** + * Constructs a new line segment. + * + * @param {Vector3} [start=(0,0,0)] - Start of the line segment. + * @param {Vector3} [end=(0,0,0)] - End of the line segment. + */ + constructor(start = new Vector3(), end = new Vector3()) { + this.start = start; + this.end = end; + } + /** + * Sets the start and end values by copying the given vectors. + * + * @param {Vector3} start - The start point. + * @param {Vector3} end - The end point. + * @return {Line3} A reference to this line segment. + */ + set(start, end) { + this.start.copy(start); + this.end.copy(end); + return this; + } + /** + * Copies the values of the given line segment to this instance. + * + * @param {Line3} line - The line segment to copy. + * @return {Line3} A reference to this line segment. + */ + copy(line) { + this.start.copy(line.start); + this.end.copy(line.end); + return this; + } + /** + * Returns the center of the line segment. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The center point. + */ + getCenter(target) { + return target.addVectors(this.start, this.end).multiplyScalar(0.5); + } + /** + * Returns the delta vector of the line segment's start and end point. + * + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The delta vector. + */ + delta(target) { + return target.subVectors(this.end, this.start); + } + /** + * Returns the squared Euclidean distance between the line' start and end point. + * + * @return {number} The squared Euclidean distance. + */ + distanceSq() { + return this.start.distanceToSquared(this.end); + } + /** + * Returns the Euclidean distance between the line' start and end point. + * + * @return {number} The Euclidean distance. + */ + distance() { + return this.start.distanceTo(this.end); + } + /** + * Returns a vector at a certain position along the line segment. + * + * @param {number} t - A value between `[0,1]` to represent a position along the line segment. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The delta vector. + */ + at(t, target) { + return this.delta(target).multiplyScalar(t).add(this.start); + } + /** + * Returns a point parameter based on the closest point as projected on the line segment. + * + * @param {Vector3} point - The point for which to return a point parameter. + * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not. + * @return {number} The point parameter. + */ + closestPointToPointParameter(point, clampToLine) { + _startP.subVectors(point, this.start); + _startEnd.subVectors(this.end, this.start); + const startEnd2 = _startEnd.dot(_startEnd); + const startEnd_startP = _startEnd.dot(_startP); + let t = startEnd_startP / startEnd2; + if (clampToLine) { + t = clamp(t, 0, 1); + } + return t; + } + /** + * Returns the closest point on the line for a given point. + * + * @param {Vector3} point - The point to compute the closest point on the line for. + * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not. + * @param {Vector3} target - The target vector that is used to store the method's result. + * @return {Vector3} The closest point on the line. + */ + closestPointToPoint(point, clampToLine, target) { + const t = this.closestPointToPointParameter(point, clampToLine); + return this.delta(target).multiplyScalar(t).add(this.start); + } + /** + * Returns the closest squared distance between this line segment and the given one. + * + * @param {Line3} line - The line segment to compute the closest squared distance to. + * @param {Vector3} [c1] - The closest point on this line segment. + * @param {Vector3} [c2] - The closest point on the given line segment. + * @return {number} The squared distance between this line segment and the given one. + */ + distanceSqToLine3(line, c1 = _c1, c2 = _c2) { + const EPSILON = 1e-8 * 1e-8; + let s, t; + const p1 = this.start; + const p2 = line.start; + const q1 = this.end; + const q2 = line.end; + _d1.subVectors(q1, p1); + _d2.subVectors(q2, p2); + _r.subVectors(p1, p2); + const a = _d1.dot(_d1); + const e = _d2.dot(_d2); + const f = _d2.dot(_r); + if (a <= EPSILON && e <= EPSILON) { + c1.copy(p1); + c2.copy(p2); + c1.sub(c2); + return c1.dot(c1); + } + if (a <= EPSILON) { + s = 0; + t = f / e; + t = clamp(t, 0, 1); + } else { + const c = _d1.dot(_r); + if (e <= EPSILON) { + t = 0; + s = clamp(-c / a, 0, 1); + } else { + const b = _d1.dot(_d2); + const denom = a * e - b * b; + if (denom !== 0) { + s = clamp((b * f - c * e) / denom, 0, 1); + } else { + s = 0; + } + t = (b * s + f) / e; + if (t < 0) { + t = 0; + s = clamp(-c / a, 0, 1); + } else if (t > 1) { + t = 1; + s = clamp((b - c) / a, 0, 1); + } + } + } + c1.copy(p1).add(_d1.multiplyScalar(s)); + c2.copy(p2).add(_d2.multiplyScalar(t)); + c1.sub(c2); + return c1.dot(c1); + } + /** + * Applies a 4x4 transformation matrix to this line segment. + * + * @param {Matrix4} matrix - The transformation matrix. + * @return {Line3} A reference to this line segment. + */ + applyMatrix4(matrix) { + this.start.applyMatrix4(matrix); + this.end.applyMatrix4(matrix); + return this; + } + /** + * Returns `true` if this line segment is equal with the given one. + * + * @param {Line3} line - The line segment to test for equality. + * @return {boolean} Whether this line segment is equal with the given one. + */ + equals(line) { + return line.start.equals(this.start) && line.end.equals(this.end); + } + /** + * Returns a new line segment with copied values from this instance. + * + * @return {Line3} A clone of this instance. + */ + clone() { + return new this.constructor().copy(this); + } +}; +var _vector$3 = new Vector3(); +var SpotLightHelper = class extends Object3D { + /** + * Constructs a new spot light helper. + * + * @param {HemisphereLight} light - The light to be visualized. + * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take + * the color of the light. + */ + constructor(light, color) { + super(); + this.light = light; + this.matrixAutoUpdate = false; + this.color = color; + this.type = "SpotLightHelper"; + const geometry = new BufferGeometry(); + const positions = [ + 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 i = 0, j = 1, l = 32; i < l; i++, j++) { + const p1 = i / l * Math.PI * 2; + const p2 = j / l * Math.PI * 2; + positions.push( + Math.cos(p1), + Math.sin(p1), + 1, + Math.cos(p2), + Math.sin(p2), + 1 + ); + } + geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); + const material = new LineBasicMaterial({ fog: false, toneMapped: false }); + this.cone = new LineSegments(geometry, material); + this.add(this.cone); + this.update(); + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.cone.geometry.dispose(); + this.cone.material.dispose(); + } + /** + * Updates the helper to match the position and direction of the + * light being visualized. + */ + update() { + this.light.updateWorldMatrix(true, false); + this.light.target.updateWorldMatrix(true, false); + if (this.parent) { + this.parent.updateWorldMatrix(true); + this.matrix.copy(this.parent.matrixWorld).invert().multiply(this.light.matrixWorld); + } else { + this.matrix.copy(this.light.matrixWorld); + } + this.matrixWorld.copy(this.light.matrixWorld); + const coneLength = this.light.distance ? this.light.distance : 1e3; + const coneWidth = coneLength * Math.tan(this.light.angle); + this.cone.scale.set(coneWidth, coneWidth, coneLength); + _vector$3.setFromMatrixPosition(this.light.target.matrixWorld); + this.cone.lookAt(_vector$3); + if (this.color !== void 0) { + this.cone.material.color.set(this.color); + } else { + this.cone.material.color.copy(this.light.color); + } + } +}; +var _vector$2 = new Vector3(); +var _boneMatrix = new Matrix4(); +var _matrixWorldInv = new Matrix4(); +var SkeletonHelper = class extends LineSegments { + /** + * Constructs a new skeleton helper. + * + * @param {Object3D} object - Usually an instance of {@link SkinnedMesh}. However, any 3D object + * can be used if it represents a hierarchy of bones (see {@link Bone}). + */ + constructor(object) { + const bones = getBoneList(object); + const geometry = new BufferGeometry(); + const vertices = []; + const colors = []; + for (let i = 0; i < bones.length; i++) { + const bone = bones[i]; + if (bone.parent && bone.parent.isBone) { + vertices.push(0, 0, 0); + vertices.push(0, 0, 0); + colors.push(0, 0, 0); + colors.push(0, 0, 0); + } + } + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + const material = new LineBasicMaterial({ vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true }); + super(geometry, material); + this.isSkeletonHelper = true; + this.type = "SkeletonHelper"; + this.root = object; + this.bones = bones; + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + const color1 = new Color(255); + const color2 = new Color(65280); + this.setColors(color1, color2); + } + updateMatrixWorld(force) { + const bones = this.bones; + const geometry = this.geometry; + const position = geometry.getAttribute("position"); + _matrixWorldInv.copy(this.root.matrixWorld).invert(); + for (let i = 0, j = 0; i < bones.length; i++) { + const bone = bones[i]; + if (bone.parent && bone.parent.isBone) { + _boneMatrix.multiplyMatrices(_matrixWorldInv, bone.matrixWorld); + _vector$2.setFromMatrixPosition(_boneMatrix); + position.setXYZ(j, _vector$2.x, _vector$2.y, _vector$2.z); + _boneMatrix.multiplyMatrices(_matrixWorldInv, bone.parent.matrixWorld); + _vector$2.setFromMatrixPosition(_boneMatrix); + position.setXYZ(j + 1, _vector$2.x, _vector$2.y, _vector$2.z); + j += 2; + } + } + geometry.getAttribute("position").needsUpdate = true; + super.updateMatrixWorld(force); + } + /** + * Defines the colors of the helper. + * + * @param {Color} color1 - The first line color for each bone. + * @param {Color} color2 - The second line color for each bone. + * @return {SkeletonHelper} A reference to this helper. + */ + setColors(color1, color2) { + const geometry = this.geometry; + const colorAttribute = geometry.getAttribute("color"); + for (let i = 0; i < colorAttribute.count; i += 2) { + colorAttribute.setXYZ(i, color1.r, color1.g, color1.b); + colorAttribute.setXYZ(i + 1, color2.r, color2.g, color2.b); + } + colorAttribute.needsUpdate = true; + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +}; +function getBoneList(object) { + const boneList = []; + if (object.isBone === true) { + boneList.push(object); + } + for (let i = 0; i < object.children.length; i++) { + boneList.push(...getBoneList(object.children[i])); + } + return boneList; +} +var PointLightHelper = class extends Mesh { + /** + * Constructs a new point light helper. + * + * @param {PointLight} light - The light to be visualized. + * @param {number} [sphereSize=1] - The size of the sphere helper. + * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take + * the color of the light. + */ + constructor(light, sphereSize, color) { + const geometry = new SphereGeometry(sphereSize, 4, 2); + const material = new MeshBasicMaterial({ wireframe: true, fog: false, toneMapped: false }); + super(geometry, material); + this.light = light; + this.color = color; + this.type = "PointLightHelper"; + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + this.update(); + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } + /** + * Updates the helper to match the position of the + * light being visualized. + */ + update() { + this.light.updateWorldMatrix(true, false); + if (this.color !== void 0) { + this.material.color.set(this.color); + } else { + this.material.color.copy(this.light.color); + } + } +}; +var _vector$1 = new Vector3(); +var _color1 = new Color(); +var _color2 = new Color(); +var HemisphereLightHelper = class extends Object3D { + /** + * Constructs a new hemisphere light helper. + * + * @param {HemisphereLight} light - The light to be visualized. + * @param {number} [size=1] - The size of the mesh used to visualize the light. + * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take + * the color of the light. + */ + constructor(light, size, color) { + super(); + this.light = light; + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + this.color = color; + this.type = "HemisphereLightHelper"; + const geometry = new OctahedronGeometry(size); + geometry.rotateY(Math.PI * 0.5); + this.material = new MeshBasicMaterial({ wireframe: true, fog: false, toneMapped: false }); + if (this.color === void 0) this.material.vertexColors = true; + const position = geometry.getAttribute("position"); + const colors = new Float32Array(position.count * 3); + geometry.setAttribute("color", new BufferAttribute(colors, 3)); + this.add(new Mesh(geometry, this.material)); + this.update(); + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.children[0].geometry.dispose(); + this.children[0].material.dispose(); + } + /** + * Updates the helper to match the position and direction of the + * light being visualized. + */ + update() { + const mesh = this.children[0]; + if (this.color !== void 0) { + this.material.color.set(this.color); + } else { + const colors = mesh.geometry.getAttribute("color"); + _color1.copy(this.light.color); + _color2.copy(this.light.groundColor); + for (let i = 0, l = colors.count; i < l; i++) { + const color = i < l / 2 ? _color1 : _color2; + colors.setXYZ(i, color.r, color.g, color.b); + } + colors.needsUpdate = true; + } + this.light.updateWorldMatrix(true, false); + mesh.lookAt(_vector$1.setFromMatrixPosition(this.light.matrixWorld).negate()); + } +}; +var GridHelper = class extends LineSegments { + /** + * Constructs a new grid helper. + * + * @param {number} [size=10] - The size of the grid. + * @param {number} [divisions=10] - The number of divisions across the grid. + * @param {number|Color|string} [color1=0x444444] - The color of the center line. + * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid. + */ + constructor(size = 10, divisions = 10, color1 = 4473924, color2 = 8947848) { + color1 = new Color(color1); + color2 = new Color(color2); + const center = divisions / 2; + const step = size / divisions; + const halfSize = size / 2; + const vertices = [], colors = []; + for (let i = 0, j = 0, k = -halfSize; i <= divisions; i++, k += step) { + vertices.push(-halfSize, 0, k, halfSize, 0, k); + vertices.push(k, 0, -halfSize, k, 0, halfSize); + const color = i === center ? color1 : color2; + color.toArray(colors, j); + j += 3; + color.toArray(colors, j); + j += 3; + color.toArray(colors, j); + j += 3; + color.toArray(colors, j); + j += 3; + } + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); + super(geometry, material); + this.type = "GridHelper"; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +}; +var PolarGridHelper = class extends LineSegments { + /** + * Constructs a new polar grid helper. + * + * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number. + * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer. + * @param {number} [rings=16] - The number of rings. This can be any positive integer. + * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer. + * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements. + * @param {number|Color|string} [color2=0x888888] - The second color used for grid elements. + */ + constructor(radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 4473924, color2 = 8947848) { + color1 = new Color(color1); + color2 = new Color(color2); + const vertices = []; + const colors = []; + if (sectors > 1) { + for (let i = 0; i < sectors; i++) { + const v = i / sectors * (Math.PI * 2); + const x = Math.sin(v) * radius; + const z = Math.cos(v) * radius; + vertices.push(0, 0, 0); + vertices.push(x, 0, z); + const color = i & 1 ? color1 : color2; + colors.push(color.r, color.g, color.b); + colors.push(color.r, color.g, color.b); + } + } + for (let i = 0; i < rings; i++) { + const color = i & 1 ? color1 : color2; + const r = radius - radius / rings * i; + for (let j = 0; j < divisions; j++) { + let v = j / divisions * (Math.PI * 2); + let x = Math.sin(v) * r; + let z = Math.cos(v) * r; + vertices.push(x, 0, z); + colors.push(color.r, color.g, color.b); + v = (j + 1) / divisions * (Math.PI * 2); + x = Math.sin(v) * r; + z = Math.cos(v) * r; + vertices.push(x, 0, z); + colors.push(color.r, color.g, color.b); + } + } + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); + super(geometry, material); + this.type = "PolarGridHelper"; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +}; +var _v1 = new Vector3(); +var _v2 = new Vector3(); +var _v3 = new Vector3(); +var DirectionalLightHelper = class extends Object3D { + /** + * Constructs a new directional light helper. + * + * @param {DirectionalLight} light - The light to be visualized. + * @param {number} [size=1] - The dimensions of the plane. + * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take + * the color of the light. + */ + constructor(light, size, color) { + super(); + this.light = light; + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + this.color = color; + this.type = "DirectionalLightHelper"; + if (size === void 0) size = 1; + let geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute([ + -size, + size, + 0, + size, + size, + 0, + size, + -size, + 0, + -size, + -size, + 0, + -size, + size, + 0 + ], 3)); + const material = new LineBasicMaterial({ fog: false, toneMapped: false }); + this.lightPlane = new Line(geometry, material); + this.add(this.lightPlane); + geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3)); + this.targetLine = new Line(geometry, material); + this.add(this.targetLine); + this.update(); + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.lightPlane.geometry.dispose(); + this.lightPlane.material.dispose(); + this.targetLine.geometry.dispose(); + this.targetLine.material.dispose(); + } + /** + * Updates the helper to match the position and direction of the + * light being visualized. + */ + update() { + this.light.updateWorldMatrix(true, false); + this.light.target.updateWorldMatrix(true, false); + _v1.setFromMatrixPosition(this.light.matrixWorld); + _v2.setFromMatrixPosition(this.light.target.matrixWorld); + _v3.subVectors(_v2, _v1); + this.lightPlane.lookAt(_v2); + if (this.color !== void 0) { + this.lightPlane.material.color.set(this.color); + this.targetLine.material.color.set(this.color); + } else { + this.lightPlane.material.color.copy(this.light.color); + this.targetLine.material.color.copy(this.light.color); + } + this.targetLine.lookAt(_v2); + this.targetLine.scale.z = _v3.length(); + } +}; +var _vector = new Vector3(); +var _camera = new Camera(); +var CameraHelper = class extends LineSegments { + /** + * Constructs a new arrow helper. + * + * @param {Camera} camera - The camera to visualize. + */ + constructor(camera) { + const geometry = new BufferGeometry(); + const material = new LineBasicMaterial({ color: 16777215, vertexColors: true, toneMapped: false }); + const vertices = []; + const colors = []; + const pointMap = {}; + addLine("n1", "n2"); + addLine("n2", "n4"); + addLine("n4", "n3"); + addLine("n3", "n1"); + addLine("f1", "f2"); + addLine("f2", "f4"); + addLine("f4", "f3"); + addLine("f3", "f1"); + addLine("n1", "f1"); + addLine("n2", "f2"); + addLine("n3", "f3"); + addLine("n4", "f4"); + addLine("p", "n1"); + addLine("p", "n2"); + addLine("p", "n3"); + addLine("p", "n4"); + addLine("u1", "u2"); + addLine("u2", "u3"); + addLine("u3", "u1"); + addLine("c", "t"); + addLine("p", "c"); + addLine("cn1", "cn2"); + addLine("cn3", "cn4"); + addLine("cf1", "cf2"); + addLine("cf3", "cf4"); + function addLine(a, b) { + addPoint(a); + addPoint(b); + } + function addPoint(id) { + vertices.push(0, 0, 0); + colors.push(0, 0, 0); + if (pointMap[id] === void 0) { + pointMap[id] = []; + } + pointMap[id].push(vertices.length / 3 - 1); + } + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + super(geometry, material); + this.type = "CameraHelper"; + this.camera = camera; + if (this.camera.updateProjectionMatrix) this.camera.updateProjectionMatrix(); + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + this.pointMap = pointMap; + this.update(); + const colorFrustum = new Color(16755200); + const colorCone = new Color(16711680); + const colorUp = new Color(43775); + const colorTarget = new Color(16777215); + const colorCross = new Color(3355443); + this.setColors(colorFrustum, colorCone, colorUp, colorTarget, colorCross); + } + /** + * Defines the colors of the helper. + * + * @param {Color} frustum - The frustum line color. + * @param {Color} cone - The cone line color. + * @param {Color} up - The up line color. + * @param {Color} target - The target line color. + * @param {Color} cross - The cross line color. + * @return {CameraHelper} A reference to this helper. + */ + setColors(frustum, cone, up, target, cross) { + const geometry = this.geometry; + const colorAttribute = geometry.getAttribute("color"); + colorAttribute.setXYZ(0, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(1, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(2, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(3, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(4, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(5, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(6, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(7, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(8, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(9, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(10, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(11, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(12, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(13, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(14, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(15, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(16, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(17, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(18, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(19, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(20, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(21, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(22, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(23, frustum.r, frustum.g, frustum.b); + colorAttribute.setXYZ(24, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(25, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(26, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(27, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(28, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(29, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(30, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(31, cone.r, cone.g, cone.b); + colorAttribute.setXYZ(32, up.r, up.g, up.b); + colorAttribute.setXYZ(33, up.r, up.g, up.b); + colorAttribute.setXYZ(34, up.r, up.g, up.b); + colorAttribute.setXYZ(35, up.r, up.g, up.b); + colorAttribute.setXYZ(36, up.r, up.g, up.b); + colorAttribute.setXYZ(37, up.r, up.g, up.b); + colorAttribute.setXYZ(38, target.r, target.g, target.b); + colorAttribute.setXYZ(39, target.r, target.g, target.b); + colorAttribute.setXYZ(40, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(41, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(42, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(43, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(44, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(45, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(46, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(47, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(48, cross.r, cross.g, cross.b); + colorAttribute.setXYZ(49, cross.r, cross.g, cross.b); + colorAttribute.needsUpdate = true; + return this; + } + /** + * Updates the helper based on the projection matrix of the camera. + */ + update() { + const geometry = this.geometry; + const pointMap = this.pointMap; + const w = 1, h = 1; + let nearZ, farZ; + _camera.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse); + if (this.camera.reversedDepth === true) { + nearZ = 1; + farZ = 0; + } else { + if (this.camera.coordinateSystem === WebGLCoordinateSystem) { + nearZ = -1; + farZ = 1; + } else if (this.camera.coordinateSystem === WebGPUCoordinateSystem) { + nearZ = 0; + farZ = 1; + } else { + throw new Error("THREE.CameraHelper.update(): Invalid coordinate system: " + this.camera.coordinateSystem); + } + } + setPoint("c", pointMap, geometry, _camera, 0, 0, nearZ); + setPoint("t", pointMap, geometry, _camera, 0, 0, farZ); + setPoint("n1", pointMap, geometry, _camera, -w, -h, nearZ); + setPoint("n2", pointMap, geometry, _camera, w, -h, nearZ); + setPoint("n3", pointMap, geometry, _camera, -w, h, nearZ); + setPoint("n4", pointMap, geometry, _camera, w, h, nearZ); + setPoint("f1", pointMap, geometry, _camera, -w, -h, farZ); + setPoint("f2", pointMap, geometry, _camera, w, -h, farZ); + setPoint("f3", pointMap, geometry, _camera, -w, h, farZ); + setPoint("f4", pointMap, geometry, _camera, w, h, farZ); + setPoint("u1", pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ); + setPoint("u2", pointMap, geometry, _camera, -w * 0.7, h * 1.1, nearZ); + setPoint("u3", pointMap, geometry, _camera, 0, h * 2, nearZ); + setPoint("cf1", pointMap, geometry, _camera, -w, 0, farZ); + setPoint("cf2", pointMap, geometry, _camera, w, 0, farZ); + setPoint("cf3", pointMap, geometry, _camera, 0, -h, farZ); + setPoint("cf4", pointMap, geometry, _camera, 0, h, farZ); + setPoint("cn1", pointMap, geometry, _camera, -w, 0, nearZ); + setPoint("cn2", pointMap, geometry, _camera, w, 0, nearZ); + setPoint("cn3", pointMap, geometry, _camera, 0, -h, nearZ); + setPoint("cn4", pointMap, geometry, _camera, 0, h, nearZ); + geometry.getAttribute("position").needsUpdate = true; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +}; +function setPoint(point, pointMap, geometry, camera, x, y, z) { + _vector.set(x, y, z).unproject(camera); + const points = pointMap[point]; + if (points !== void 0) { + const position = geometry.getAttribute("position"); + for (let i = 0, l = points.length; i < l; i++) { + position.setXYZ(points[i], _vector.x, _vector.y, _vector.z); + } + } +} +var _box = new Box3(); +var BoxHelper = class extends LineSegments { + /** + * Constructs a new box helper. + * + * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box. + * @param {number|Color|string} [color=0xffff00] - The box's color. + */ + constructor(object, color = 16776960) { + const indices = 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]); + const positions = new Float32Array(8 * 3); + const geometry = new BufferGeometry(); + geometry.setIndex(new BufferAttribute(indices, 1)); + geometry.setAttribute("position", new BufferAttribute(positions, 3)); + super(geometry, new LineBasicMaterial({ color, toneMapped: false })); + this.object = object; + this.type = "BoxHelper"; + this.matrixAutoUpdate = false; + this.update(); + } + /** + * Updates the helper's geometry to match the dimensions of the object, + * including any children. + */ + update() { + if (this.object !== void 0) { + _box.setFromObject(this.object); + } + if (_box.isEmpty()) return; + const min = _box.min; + const max = _box.max; + const position = this.geometry.attributes.position; + const array = position.array; + array[0] = max.x; + array[1] = max.y; + array[2] = max.z; + array[3] = min.x; + array[4] = max.y; + array[5] = max.z; + array[6] = min.x; + array[7] = min.y; + array[8] = max.z; + array[9] = max.x; + array[10] = min.y; + array[11] = max.z; + array[12] = max.x; + array[13] = max.y; + array[14] = min.z; + array[15] = min.x; + array[16] = max.y; + array[17] = min.z; + array[18] = min.x; + array[19] = min.y; + array[20] = min.z; + array[21] = max.x; + array[22] = min.y; + array[23] = min.z; + position.needsUpdate = true; + this.geometry.computeBoundingSphere(); + } + /** + * Updates the wireframe box for the passed object. + * + * @param {Object3D} object - The 3D object to create the helper for. + * @return {BoxHelper} A reference to this instance. + */ + setFromObject(object) { + this.object = object; + this.update(); + return this; + } + copy(source, recursive) { + super.copy(source, recursive); + this.object = source.object; + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +}; +var Box3Helper = class extends LineSegments { + /** + * Constructs a new box3 helper. + * + * @param {Box3} box - The box to visualize. + * @param {number|Color|string} [color=0xffff00] - The box's color. + */ + constructor(box, color = 16776960) { + const indices = 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]); + const positions = [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1]; + const geometry = new BufferGeometry(); + geometry.setIndex(new BufferAttribute(indices, 1)); + geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); + super(geometry, new LineBasicMaterial({ color, toneMapped: false })); + this.box = box; + this.type = "Box3Helper"; + this.geometry.computeBoundingSphere(); + } + updateMatrixWorld(force) { + const box = this.box; + if (box.isEmpty()) return; + box.getCenter(this.position); + box.getSize(this.scale); + this.scale.multiplyScalar(0.5); + super.updateMatrixWorld(force); + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +}; +var PlaneHelper = class extends Line { + /** + * Constructs a new plane helper. + * + * @param {Plane} plane - The plane to be visualized. + * @param {number} [size=1] - The side length of plane helper. + * @param {number|Color|string} [hex=0xffff00] - The helper's color. + */ + constructor(plane, size = 1, hex = 16776960) { + const color = hex; + const positions = [1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0]; + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute(positions, 3)); + geometry.computeBoundingSphere(); + super(geometry, new LineBasicMaterial({ color, toneMapped: false })); + this.type = "PlaneHelper"; + this.plane = plane; + this.size = size; + const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0]; + const geometry2 = new BufferGeometry(); + geometry2.setAttribute("position", new Float32BufferAttribute(positions2, 3)); + geometry2.computeBoundingSphere(); + this.add(new Mesh(geometry2, new MeshBasicMaterial({ color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false }))); + } + updateMatrixWorld(force) { + this.position.set(0, 0, 0); + this.scale.set(0.5 * this.size, 0.5 * this.size, 1); + this.lookAt(this.plane.normal); + this.translateZ(-this.plane.constant); + super.updateMatrixWorld(force); + } + /** + * Updates the helper to match the position and direction of the + * light being visualized. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + this.children[0].geometry.dispose(); + this.children[0].material.dispose(); + } +}; +var _axis = new Vector3(); +var _lineGeometry; +var _coneGeometry; +var ArrowHelper = class extends Object3D { + /** + * Constructs a new arrow helper. + * + * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector. + * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts. + * @param {number} [length=1] - Length of the arrow in world units. + * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow. + * @param {number} [headLength=length*0.2] - The length of the head of the arrow. + * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow. + */ + constructor(dir = new Vector3(0, 0, 1), origin = new Vector3(0, 0, 0), length = 1, color = 16776960, headLength = length * 0.2, headWidth = headLength * 0.2) { + super(); + this.type = "ArrowHelper"; + if (_lineGeometry === void 0) { + _lineGeometry = new BufferGeometry(); + _lineGeometry.setAttribute("position", new Float32BufferAttribute([0, 0, 0, 0, 1, 0], 3)); + _coneGeometry = new ConeGeometry(0.5, 1, 5, 1); + _coneGeometry.translate(0, -0.5, 0); + } + this.position.copy(origin); + this.line = new Line(_lineGeometry, new LineBasicMaterial({ color, toneMapped: false })); + this.line.matrixAutoUpdate = false; + this.add(this.line); + this.cone = new Mesh(_coneGeometry, new MeshBasicMaterial({ color, toneMapped: false })); + this.cone.matrixAutoUpdate = false; + this.add(this.cone); + this.setDirection(dir); + this.setLength(length, headLength, headWidth); + } + /** + * Sets the direction of the helper. + * + * @param {Vector3} dir - The normalized direction vector. + */ + setDirection(dir) { + if (dir.y > 0.99999) { + this.quaternion.set(0, 0, 0, 1); + } else if (dir.y < -0.99999) { + this.quaternion.set(1, 0, 0, 0); + } else { + _axis.set(dir.z, 0, -dir.x).normalize(); + const radians = Math.acos(dir.y); + this.quaternion.setFromAxisAngle(_axis, radians); + } + } + /** + * Sets the length of the helper. + * + * @param {number} length - Length of the arrow in world units. + * @param {number} [headLength=length*0.2] - The length of the head of the arrow. + * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow. + */ + setLength(length, headLength = length * 0.2, headWidth = headLength * 0.2) { + this.line.scale.set(1, Math.max(1e-4, length - headLength), 1); + this.line.updateMatrix(); + this.cone.scale.set(headWidth, headLength, headWidth); + this.cone.position.y = length; + this.cone.updateMatrix(); + } + /** + * Sets the color of the helper. + * + * @param {number|Color|string} color - The color to set. + */ + setColor(color) { + this.line.material.color.set(color); + this.cone.material.color.set(color); + } + copy(source) { + super.copy(source, false); + this.line.copy(source.line); + this.cone.copy(source.cone); + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.line.geometry.dispose(); + this.line.material.dispose(); + this.cone.geometry.dispose(); + this.cone.material.dispose(); + } +}; +var AxesHelper = class extends LineSegments { + /** + * Constructs a new axes helper. + * + * @param {number} [size=1] - Size of the lines representing the axes. + */ + constructor(size = 1) { + const vertices = [ + 0, + 0, + 0, + size, + 0, + 0, + 0, + 0, + 0, + 0, + size, + 0, + 0, + 0, + 0, + 0, + 0, + size + ]; + const colors = [ + 1, + 0, + 0, + 1, + 0.6, + 0, + 0, + 1, + 0, + 0.6, + 1, + 0, + 0, + 0, + 1, + 0, + 0.6, + 1 + ]; + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3)); + geometry.setAttribute("color", new Float32BufferAttribute(colors, 3)); + const material = new LineBasicMaterial({ vertexColors: true, toneMapped: false }); + super(geometry, material); + this.type = "AxesHelper"; + } + /** + * Defines the colors of the axes helper. + * + * @param {number|Color|string} xAxisColor - The color for the x axis. + * @param {number|Color|string} yAxisColor - The color for the y axis. + * @param {number|Color|string} zAxisColor - The color for the z axis. + * @return {AxesHelper} A reference to this axes helper. + */ + setColors(xAxisColor, yAxisColor, zAxisColor) { + const color = new Color(); + const array = this.geometry.attributes.color.array; + color.set(xAxisColor); + color.toArray(array, 0); + color.toArray(array, 3); + color.set(yAxisColor); + color.toArray(array, 6); + color.toArray(array, 9); + color.set(zAxisColor); + color.toArray(array, 12); + color.toArray(array, 15); + this.geometry.attributes.color.needsUpdate = true; + return this; + } + /** + * Frees the GPU-related resources allocated by this instance. Call this + * method whenever this instance is no longer used in your app. + */ + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } +}; +var ShapePath = class { + /** + * Constructs a new shape path. + */ + constructor() { + this.type = "ShapePath"; + this.color = new Color(); + this.subPaths = []; + this.currentPath = null; + } + /** + * Creates a new path and moves it current point to the given one. + * + * @param {number} x - The x coordinate. + * @param {number} y - The y coordinate. + * @return {ShapePath} A reference to this shape path. + */ + moveTo(x, y) { + this.currentPath = new Path(); + this.subPaths.push(this.currentPath); + this.currentPath.moveTo(x, y); + return this; + } + /** + * Adds an instance of {@link LineCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} x - The x coordinate of the end point. + * @param {number} y - The y coordinate of the end point. + * @return {ShapePath} A reference to this shape path. + */ + lineTo(x, y) { + this.currentPath.lineTo(x, y); + return this; + } + /** + * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} aCPx - The x coordinate of the control point. + * @param {number} aCPy - The y coordinate of the control point. + * @param {number} aX - The x coordinate of the end point. + * @param {number} aY - The y coordinate of the end point. + * @return {ShapePath} A reference to this shape path. + */ + quadraticCurveTo(aCPx, aCPy, aX, aY) { + this.currentPath.quadraticCurveTo(aCPx, aCPy, aX, aY); + return this; + } + /** + * Adds an instance of {@link CubicBezierCurve} to the path by connecting + * the current point with the given one. + * + * @param {number} aCP1x - The x coordinate of the first control point. + * @param {number} aCP1y - The y coordinate of the first control point. + * @param {number} aCP2x - The x coordinate of the second control point. + * @param {number} aCP2y - The y coordinate of the second control point. + * @param {number} aX - The x coordinate of the end point. + * @param {number} aY - The y coordinate of the end point. + * @return {ShapePath} A reference to this shape path. + */ + bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { + this.currentPath.bezierCurveTo(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY); + return this; + } + /** + * Adds an instance of {@link SplineCurve} to the path by connecting + * the current point with the given list of points. + * + * @param {Array} pts - An array of points in 2D space. + * @return {ShapePath} A reference to this shape path. + */ + splineThru(pts) { + this.currentPath.splineThru(pts); + return this; + } + /** + * Converts the paths into an array of shapes. + * + * @param {boolean} isCCW - By default solid shapes are defined clockwise (CW) and holes are defined counterclockwise (CCW). + * If this flag is set to `true`, then those are flipped. + * @return {Array} An array of shapes. + */ + toShapes(isCCW) { + function toShapesNoHoles(inSubpaths) { + const shapes2 = []; + for (let i = 0, l = inSubpaths.length; i < l; i++) { + const tmpPath2 = inSubpaths[i]; + const tmpShape2 = new Shape(); + tmpShape2.curves = tmpPath2.curves; + shapes2.push(tmpShape2); + } + return shapes2; + } + function isPointInsidePolygon(inPt, inPolygon) { + const polyLen = inPolygon.length; + let inside = false; + for (let p = polyLen - 1, q = 0; q < polyLen; p = q++) { + let edgeLowPt = inPolygon[p]; + let edgeHighPt = inPolygon[q]; + let edgeDx = edgeHighPt.x - edgeLowPt.x; + let edgeDy = edgeHighPt.y - edgeLowPt.y; + if (Math.abs(edgeDy) > Number.EPSILON) { + if (edgeDy < 0) { + edgeLowPt = inPolygon[q]; + edgeDx = -edgeDx; + edgeHighPt = inPolygon[p]; + edgeDy = -edgeDy; + } + if (inPt.y < edgeLowPt.y || inPt.y > edgeHighPt.y) continue; + if (inPt.y === edgeLowPt.y) { + if (inPt.x === edgeLowPt.x) return true; + } else { + const perpEdge = edgeDy * (inPt.x - edgeLowPt.x) - edgeDx * (inPt.y - edgeLowPt.y); + if (perpEdge === 0) return true; + if (perpEdge < 0) continue; + inside = !inside; + } + } else { + if (inPt.y !== edgeLowPt.y) continue; + if (edgeHighPt.x <= inPt.x && inPt.x <= edgeLowPt.x || edgeLowPt.x <= inPt.x && inPt.x <= edgeHighPt.x) return true; + } + } + return inside; + } + const isClockWise = ShapeUtils.isClockWise; + const subPaths = this.subPaths; + if (subPaths.length === 0) return []; + let solid, tmpPath, tmpShape; + const shapes = []; + if (subPaths.length === 1) { + tmpPath = subPaths[0]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push(tmpShape); + return shapes; + } + let holesFirst = !isClockWise(subPaths[0].getPoints()); + holesFirst = isCCW ? !holesFirst : holesFirst; + const betterShapeHoles = []; + const newShapes = []; + let newShapeHoles = []; + let mainIdx = 0; + let tmpPoints; + newShapes[mainIdx] = void 0; + newShapeHoles[mainIdx] = []; + for (let i = 0, l = subPaths.length; i < l; i++) { + tmpPath = subPaths[i]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise(tmpPoints); + solid = isCCW ? !solid : solid; + if (solid) { + if (!holesFirst && newShapes[mainIdx]) mainIdx++; + newShapes[mainIdx] = { s: new Shape(), p: tmpPoints }; + newShapes[mainIdx].s.curves = tmpPath.curves; + if (holesFirst) mainIdx++; + newShapeHoles[mainIdx] = []; + } else { + newShapeHoles[mainIdx].push({ h: tmpPath, p: tmpPoints[0] }); + } + } + if (!newShapes[0]) return toShapesNoHoles(subPaths); + if (newShapes.length > 1) { + let ambiguous = false; + let toChange = 0; + for (let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++) { + betterShapeHoles[sIdx] = []; + } + for (let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx++) { + const sho = newShapeHoles[sIdx]; + for (let hIdx = 0; hIdx < sho.length; hIdx++) { + const ho = sho[hIdx]; + let hole_unassigned = true; + for (let s2Idx = 0; s2Idx < newShapes.length; s2Idx++) { + if (isPointInsidePolygon(ho.p, newShapes[s2Idx].p)) { + if (sIdx !== s2Idx) toChange++; + if (hole_unassigned) { + hole_unassigned = false; + betterShapeHoles[s2Idx].push(ho); + } else { + ambiguous = true; + } + } + } + if (hole_unassigned) { + betterShapeHoles[sIdx].push(ho); + } + } + } + if (toChange > 0 && ambiguous === false) { + newShapeHoles = betterShapeHoles; + } + } + let tmpHoles; + for (let i = 0, il = newShapes.length; i < il; i++) { + tmpShape = newShapes[i].s; + shapes.push(tmpShape); + tmpHoles = newShapeHoles[i]; + for (let j = 0, jl = tmpHoles.length; j < jl; j++) { + tmpShape.holes.push(tmpHoles[j].h); + } + } + return shapes; + } +}; +var Controls = class extends EventDispatcher { + /** + * Constructs a new controls instance. + * + * @param {Object3D} object - The object that is managed by the controls. + * @param {?HTMLElement} domElement - The HTML element used for event listeners. + */ + constructor(object, domElement = null) { + super(); + this.object = object; + this.domElement = domElement; + this.enabled = true; + this.state = -1; + this.keys = {}; + this.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null }; + this.touches = { ONE: null, TWO: null }; + } + /** + * Connects the controls to the DOM. This method has so called "side effects" since + * it adds the module's event listeners to the DOM. + * + * @param {HTMLElement} element - The DOM element to connect to. + */ + connect(element) { + if (element === void 0) { + warn("Controls: connect() now requires an element."); + return; + } + if (this.domElement !== null) this.disconnect(); + this.domElement = element; + } + /** + * Disconnects the controls from the DOM. + */ + disconnect() { + } + /** + * Call this method if you no longer want use to the controls. It frees all internal + * resources and removes all event listeners. + */ + dispose() { + } + /** + * Controls should implement this method if they have to update their internal state + * per simulation step. + * + * @param {number} [delta] - The time delta in seconds. + */ + update() { + } +}; +function contain(texture, aspect2) { + const imageAspect = texture.image && texture.image.width ? texture.image.width / texture.image.height : 1; + if (imageAspect > aspect2) { + texture.repeat.x = 1; + texture.repeat.y = imageAspect / aspect2; + texture.offset.x = 0; + texture.offset.y = (1 - texture.repeat.y) / 2; + } else { + texture.repeat.x = aspect2 / imageAspect; + texture.repeat.y = 1; + texture.offset.x = (1 - texture.repeat.x) / 2; + texture.offset.y = 0; + } + return texture; +} +function cover(texture, aspect2) { + const imageAspect = texture.image && texture.image.width ? texture.image.width / texture.image.height : 1; + if (imageAspect > aspect2) { + texture.repeat.x = aspect2 / imageAspect; + texture.repeat.y = 1; + texture.offset.x = (1 - texture.repeat.x) / 2; + texture.offset.y = 0; + } else { + texture.repeat.x = 1; + texture.repeat.y = imageAspect / aspect2; + texture.offset.x = 0; + texture.offset.y = (1 - texture.repeat.y) / 2; + } + return texture; +} +function fill(texture) { + texture.repeat.x = 1; + texture.repeat.y = 1; + texture.offset.x = 0; + texture.offset.y = 0; + return texture; +} +function getByteLength(width, height, format, type) { + const typeByteLength = getTextureTypeByteLength(type); + switch (format) { + // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml + case AlphaFormat: + return width * height; + case RedFormat: + return width * height / typeByteLength.components * typeByteLength.byteLength; + case RedIntegerFormat: + return width * height / typeByteLength.components * typeByteLength.byteLength; + case RGFormat: + return width * height * 2 / typeByteLength.components * typeByteLength.byteLength; + case RGIntegerFormat: + return width * height * 2 / typeByteLength.components * typeByteLength.byteLength; + case RGBFormat: + return width * height * 3 / typeByteLength.components * typeByteLength.byteLength; + case RGBAFormat: + return width * height * 4 / typeByteLength.components * typeByteLength.byteLength; + case RGBAIntegerFormat: + return width * height * 4 / typeByteLength.components * typeByteLength.byteLength; + // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/ + case RGB_S3TC_DXT1_Format: + case RGBA_S3TC_DXT1_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; + case RGBA_S3TC_DXT3_Format: + case RGBA_S3TC_DXT5_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/ + case RGB_PVRTC_2BPPV1_Format: + case RGBA_PVRTC_2BPPV1_Format: + return Math.max(width, 16) * Math.max(height, 8) / 4; + case RGB_PVRTC_4BPPV1_Format: + case RGBA_PVRTC_4BPPV1_Format: + return Math.max(width, 8) * Math.max(height, 8) / 2; + // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/ + case RGB_ETC1_Format: + case RGB_ETC2_Format: + case R11_EAC_Format: + case SIGNED_R11_EAC_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; + case RGBA_ETC2_EAC_Format: + case RG11_EAC_Format: + case SIGNED_RG11_EAC_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/ + case RGBA_ASTC_4x4_Format: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + case RGBA_ASTC_5x4_Format: + return Math.floor((width + 4) / 5) * Math.floor((height + 3) / 4) * 16; + case RGBA_ASTC_5x5_Format: + return Math.floor((width + 4) / 5) * Math.floor((height + 4) / 5) * 16; + case RGBA_ASTC_6x5_Format: + return Math.floor((width + 5) / 6) * Math.floor((height + 4) / 5) * 16; + case RGBA_ASTC_6x6_Format: + return Math.floor((width + 5) / 6) * Math.floor((height + 5) / 6) * 16; + case RGBA_ASTC_8x5_Format: + return Math.floor((width + 7) / 8) * Math.floor((height + 4) / 5) * 16; + case RGBA_ASTC_8x6_Format: + return Math.floor((width + 7) / 8) * Math.floor((height + 5) / 6) * 16; + case RGBA_ASTC_8x8_Format: + return Math.floor((width + 7) / 8) * Math.floor((height + 7) / 8) * 16; + case RGBA_ASTC_10x5_Format: + return Math.floor((width + 9) / 10) * Math.floor((height + 4) / 5) * 16; + case RGBA_ASTC_10x6_Format: + return Math.floor((width + 9) / 10) * Math.floor((height + 5) / 6) * 16; + case RGBA_ASTC_10x8_Format: + return Math.floor((width + 9) / 10) * Math.floor((height + 7) / 8) * 16; + case RGBA_ASTC_10x10_Format: + return Math.floor((width + 9) / 10) * Math.floor((height + 9) / 10) * 16; + case RGBA_ASTC_12x10_Format: + return Math.floor((width + 11) / 12) * Math.floor((height + 9) / 10) * 16; + case RGBA_ASTC_12x12_Format: + return Math.floor((width + 11) / 12) * Math.floor((height + 11) / 12) * 16; + // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/ + case RGBA_BPTC_Format: + case RGB_BPTC_SIGNED_Format: + case RGB_BPTC_UNSIGNED_Format: + return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; + // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/ + case RED_RGTC1_Format: + case SIGNED_RED_RGTC1_Format: + return Math.ceil(width / 4) * Math.ceil(height / 4) * 8; + case RED_GREEN_RGTC2_Format: + case SIGNED_RED_GREEN_RGTC2_Format: + return Math.ceil(width / 4) * Math.ceil(height / 4) * 16; + } + throw new Error( + `Unable to determine texture byte length for ${format} format.` + ); +} +function getTextureTypeByteLength(type) { + switch (type) { + case UnsignedByteType: + case ByteType: + return { byteLength: 1, components: 1 }; + case UnsignedShortType: + case ShortType: + case HalfFloatType: + return { byteLength: 2, components: 1 }; + case UnsignedShort4444Type: + case UnsignedShort5551Type: + return { byteLength: 2, components: 4 }; + case UnsignedIntType: + case IntType: + case FloatType: + return { byteLength: 4, components: 1 }; + case UnsignedInt5999Type: + case UnsignedInt101111Type: + return { byteLength: 4, components: 3 }; + } + throw new Error(`Unknown texture type ${type}.`); +} +var TextureUtils = class { + /** + * Scales the texture as large as possible within its surface without cropping + * or stretching the texture. The method preserves the original aspect ratio of + * the texture. Akin to CSS `object-fit: contain` + * + * @param {Texture} texture - The texture. + * @param {number} aspect - The texture's aspect ratio. + * @return {Texture} The updated texture. + */ + static contain(texture, aspect2) { + return contain(texture, aspect2); + } + /** + * Scales the texture to the smallest possible size to fill the surface, leaving + * no empty space. The method preserves the original aspect ratio of the texture. + * Akin to CSS `object-fit: cover`. + * + * @param {Texture} texture - The texture. + * @param {number} aspect - The texture's aspect ratio. + * @return {Texture} The updated texture. + */ + static cover(texture, aspect2) { + return cover(texture, aspect2); + } + /** + * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`. + * + * @param {Texture} texture - The texture. + * @return {Texture} The updated texture. + */ + static fill(texture) { + return fill(texture); + } + /** + * Determines how many bytes must be used to represent the texture. + * + * @param {number} width - The width of the texture. + * @param {number} height - The height of the texture. + * @param {number} format - The texture's format. + * @param {number} type - The texture's type. + * @return {number} The byte length. + */ + static getByteLength(width, height, format, type) { + return getByteLength(width, height, format, type); + } +}; +if (typeof __THREE_DEVTOOLS__ !== "undefined") { + __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register", { detail: { + revision: REVISION + } })); +} +if (typeof window !== "undefined") { + if (window.__THREE__) { + warn("WARNING: Multiple instances of Three.js being imported."); + } else { + window.__THREE__ = REVISION; + } +} + +// node_modules/three/build/three.module.js +function WebGLAnimation() { + let context = null; + let isAnimating = false; + let animationLoop = null; + let requestId = null; + function onAnimationFrame(time, frame) { + animationLoop(time, frame); + requestId = context.requestAnimationFrame(onAnimationFrame); + } + return { + start: function() { + if (isAnimating === true) return; + if (animationLoop === null) return; + requestId = context.requestAnimationFrame(onAnimationFrame); + isAnimating = true; + }, + stop: function() { + context.cancelAnimationFrame(requestId); + isAnimating = false; + }, + setAnimationLoop: function(callback) { + animationLoop = callback; + }, + setContext: function(value) { + context = value; + } + }; +} +function WebGLAttributes(gl) { + const buffers = /* @__PURE__ */ new WeakMap(); + function createBuffer(attribute, bufferType) { + const array = attribute.array; + const usage = attribute.usage; + const size = array.byteLength; + const buffer = gl.createBuffer(); + gl.bindBuffer(bufferType, buffer); + gl.bufferData(bufferType, array, usage); + attribute.onUploadCallback(); + let type; + if (array instanceof Float32Array) { + type = gl.FLOAT; + } else if (typeof Float16Array !== "undefined" && array instanceof Float16Array) { + type = gl.HALF_FLOAT; + } else if (array instanceof Uint16Array) { + if (attribute.isFloat16BufferAttribute) { + type = gl.HALF_FLOAT; + } else { + type = gl.UNSIGNED_SHORT; + } + } else if (array instanceof Int16Array) { + type = gl.SHORT; + } else if (array instanceof Uint32Array) { + type = gl.UNSIGNED_INT; + } else if (array instanceof Int32Array) { + type = gl.INT; + } else if (array instanceof Int8Array) { + type = gl.BYTE; + } else if (array instanceof Uint8Array) { + type = gl.UNSIGNED_BYTE; + } else if (array instanceof Uint8ClampedArray) { + type = gl.UNSIGNED_BYTE; + } else { + throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: " + array); + } + return { + buffer, + type, + bytesPerElement: array.BYTES_PER_ELEMENT, + version: attribute.version, + size + }; + } + function updateBuffer(buffer, attribute, bufferType) { + const array = attribute.array; + const updateRanges = attribute.updateRanges; + gl.bindBuffer(bufferType, buffer); + if (updateRanges.length === 0) { + gl.bufferSubData(bufferType, 0, array); + } else { + updateRanges.sort((a, b) => a.start - b.start); + let mergeIndex = 0; + for (let i = 1; i < updateRanges.length; i++) { + const previousRange = updateRanges[mergeIndex]; + const range = updateRanges[i]; + if (range.start <= previousRange.start + previousRange.count + 1) { + previousRange.count = Math.max( + previousRange.count, + range.start + range.count - previousRange.start + ); + } else { + ++mergeIndex; + updateRanges[mergeIndex] = range; + } + } + updateRanges.length = mergeIndex + 1; + for (let i = 0, l = updateRanges.length; i < l; i++) { + const range = updateRanges[i]; + gl.bufferSubData( + bufferType, + range.start * array.BYTES_PER_ELEMENT, + array, + range.start, + range.count + ); + } + attribute.clearUpdateRanges(); + } + attribute.onUploadCallback(); + } + function get(attribute) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; + return buffers.get(attribute); + } + function remove(attribute) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; + const data = buffers.get(attribute); + if (data) { + gl.deleteBuffer(data.buffer); + buffers.delete(attribute); + } + } + function update(attribute, bufferType) { + if (attribute.isInterleavedBufferAttribute) attribute = attribute.data; + if (attribute.isGLBufferAttribute) { + const cached = buffers.get(attribute); + if (!cached || cached.version < attribute.version) { + buffers.set(attribute, { + buffer: attribute.buffer, + type: attribute.type, + bytesPerElement: attribute.elementSize, + version: attribute.version + }); + } + return; + } + const data = buffers.get(attribute); + if (data === void 0) { + buffers.set(attribute, createBuffer(attribute, bufferType)); + } else if (data.version < attribute.version) { + if (data.size !== attribute.array.byteLength) { + throw new Error("THREE.WebGLAttributes: The size of the buffer attribute's array buffer does not match the original size. Resizing buffer attributes is not supported."); + } + updateBuffer(data.buffer, attribute, bufferType); + data.version = attribute.version; + } + } + return { + get, + remove, + update + }; +} +var alphahash_fragment = "#ifdef USE_ALPHAHASH\n if ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif"; +var alphahash_pars_fragment = "#ifdef USE_ALPHAHASH\n const float ALPHA_HASH_SCALE = 0.05;\n float hash2D( vec2 value ) {\n return fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n }\n float hash3D( vec3 value ) {\n return hash2D( vec2( hash2D( value.xy ), value.z ) );\n }\n float getAlphaHashThreshold( vec3 position ) {\n float maxDeriv = max(\n length( dFdx( position.xyz ) ),\n length( dFdy( position.xyz ) )\n );\n float pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n vec2 pixScales = vec2(\n exp2( floor( log2( pixScale ) ) ),\n exp2( ceil( log2( pixScale ) ) )\n );\n vec2 alpha = vec2(\n hash3D( floor( pixScales.x * position.xyz ) ),\n hash3D( floor( pixScales.y * position.xyz ) )\n );\n float lerpFactor = fract( log2( pixScale ) );\n float x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n float a = min( lerpFactor, 1.0 - lerpFactor );\n vec3 cases = vec3(\n x * x / ( 2.0 * a * ( 1.0 - a ) ),\n ( x - 0.5 * a ) / ( 1.0 - a ),\n 1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n );\n float threshold = ( x < ( 1.0 - a ) )\n ? ( ( x < a ) ? cases.x : cases.y )\n : cases.z;\n return clamp( threshold , 1.0e-6, 1.0 );\n }\n#endif"; +var alphamap_fragment = "#ifdef USE_ALPHAMAP\n diffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif"; +var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n uniform sampler2D alphaMap;\n#endif"; +var alphatest_fragment = "#ifdef USE_ALPHATEST\n #ifdef ALPHA_TO_COVERAGE\n diffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\n if ( diffuseColor.a == 0.0 ) discard;\n #else\n if ( diffuseColor.a < alphaTest ) discard;\n #endif\n#endif"; +var alphatest_pars_fragment = "#ifdef USE_ALPHATEST\n uniform float alphaTest;\n#endif"; +var aomap_fragment = "#ifdef USE_AOMAP\n float ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n reflectedLight.indirectDiffuse *= ambientOcclusion;\n #if defined( USE_CLEARCOAT ) \n clearcoatSpecularIndirect *= ambientOcclusion;\n #endif\n #if defined( USE_SHEEN ) \n sheenSpecularIndirect *= ambientOcclusion;\n #endif\n #if defined( USE_ENVMAP ) && defined( STANDARD )\n float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n #endif\n#endif"; +var aomap_pars_fragment = "#ifdef USE_AOMAP\n uniform sampler2D aoMap;\n uniform float aoMapIntensity;\n#endif"; +var batching_pars_vertex = "#ifdef USE_BATCHING\n #if ! defined( GL_ANGLE_multi_draw )\n #define gl_DrawID _gl_DrawID\n uniform int _gl_DrawID;\n #endif\n uniform highp sampler2D batchingTexture;\n uniform highp usampler2D batchingIdTexture;\n mat4 getBatchingMatrix( const in float i ) {\n int size = textureSize( batchingTexture, 0 ).x;\n int j = int( i ) * 4;\n int x = j % size;\n int y = j / size;\n vec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n vec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n vec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n vec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n return mat4( v1, v2, v3, v4 );\n }\n float getIndirectIndex( const in int i ) {\n int size = textureSize( batchingIdTexture, 0 ).x;\n int x = i % size;\n int y = i / size;\n return float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n }\n#endif\n#ifdef USE_BATCHING_COLOR\n uniform sampler2D batchingColorTexture;\n vec3 getBatchingColor( const in float i ) {\n int size = textureSize( batchingColorTexture, 0 ).x;\n int j = int( i );\n int x = j % size;\n int y = j / size;\n return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n }\n#endif"; +var batching_vertex = "#ifdef USE_BATCHING\n mat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif"; +var begin_vertex = "vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n vPosition = vec3( position );\n#endif"; +var beginnormal_vertex = "vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n vec3 objectTangent = vec3( tangent.xyz );\n#endif"; +var bsdfs = "float G_BlinnPhong_Implicit( ) {\n return 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n return RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( specularColor, 1.0, dotVH );\n float G = G_BlinnPhong_Implicit( );\n float D = D_BlinnPhong( shininess, dotNH );\n return F * ( G * D );\n} // validated"; +var iridescence_fragment = "#ifdef USE_IRIDESCENCE\n const mat3 XYZ_TO_REC709 = mat3(\n 3.2404542, -0.9692660, 0.0556434,\n -1.5371385, 1.8760108, -0.2040259,\n -0.4985314, 0.0415560, 1.0572252\n );\n vec3 Fresnel0ToIor( vec3 fresnel0 ) {\n vec3 sqrtF0 = sqrt( fresnel0 );\n return ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n }\n vec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n return pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n }\n float IorToFresnel0( float transmittedIor, float incidentIor ) {\n return pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n }\n vec3 evalSensitivity( float OPD, vec3 shift ) {\n float phase = 2.0 * PI * OPD * 1.0e-9;\n vec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n vec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n vec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n vec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n xyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n xyz /= 1.0685e-7;\n vec3 rgb = XYZ_TO_REC709 * xyz;\n return rgb;\n }\n vec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n vec3 I;\n float iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n float sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n float cosTheta2Sq = 1.0 - sinTheta2Sq;\n if ( cosTheta2Sq < 0.0 ) {\n return vec3( 1.0 );\n }\n float cosTheta2 = sqrt( cosTheta2Sq );\n float R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n float R12 = F_Schlick( R0, 1.0, cosTheta1 );\n float T121 = 1.0 - R12;\n float phi12 = 0.0;\n if ( iridescenceIOR < outsideIOR ) phi12 = PI;\n float phi21 = PI - phi12;\n vec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) ); vec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n vec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n vec3 phi23 = vec3( 0.0 );\n if ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n if ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n if ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n float OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n vec3 phi = vec3( phi21 ) + phi23;\n vec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n vec3 r123 = sqrt( R123 );\n vec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n vec3 C0 = R12 + Rs;\n I = C0;\n vec3 Cm = Rs - T121;\n for ( int m = 1; m <= 2; ++ m ) {\n Cm *= r123;\n vec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n I += Cm * Sm;\n }\n return max( I, vec3( 0.0 ) );\n }\n#endif"; +var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n uniform sampler2D bumpMap;\n uniform float bumpScale;\n vec2 dHdxy_fwd() {\n vec2 dSTdx = dFdx( vBumpMapUv );\n vec2 dSTdy = dFdy( vBumpMapUv );\n float Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n float dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n float dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\n return vec2( dBx, dBy );\n }\n vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n vec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n vec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n vec3 vN = surf_norm;\n vec3 R1 = cross( vSigmaY, vN );\n vec3 R2 = cross( vN, vSigmaX );\n float fDet = dot( vSigmaX, R1 ) * faceDirection;\n vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n return normalize( abs( fDet ) * surf_norm - vGrad );\n }\n#endif"; +var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n vec4 plane;\n #ifdef ALPHA_TO_COVERAGE\n float distanceToPlane, distanceGradient;\n float clipOpacity = 1.0;\n #pragma unroll_loop_start\n for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n distanceGradient = fwidth( distanceToPlane ) / 2.0;\n clipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n if ( clipOpacity == 0.0 ) discard;\n }\n #pragma unroll_loop_end\n #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n float unionClipOpacity = 1.0;\n #pragma unroll_loop_start\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n distanceGradient = fwidth( distanceToPlane ) / 2.0;\n unionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n }\n #pragma unroll_loop_end\n clipOpacity *= 1.0 - unionClipOpacity;\n #endif\n diffuseColor.a *= clipOpacity;\n if ( diffuseColor.a == 0.0 ) discard;\n #else\n #pragma unroll_loop_start\n for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n }\n #pragma unroll_loop_end\n #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n #pragma unroll_loop_start\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n }\n #pragma unroll_loop_end\n if ( clipped ) discard;\n #endif\n #endif\n#endif"; +var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n varying vec3 vClipPosition;\n uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif"; +var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0\n varying vec3 vClipPosition;\n#endif"; +var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0\n vClipPosition = - mvPosition.xyz;\n#endif"; +var color_fragment = "#if defined( USE_COLOR_ALPHA )\n diffuseColor *= vColor;\n#elif defined( USE_COLOR )\n diffuseColor.rgb *= vColor;\n#endif"; +var color_pars_fragment = "#if defined( USE_COLOR_ALPHA )\n varying vec4 vColor;\n#elif defined( USE_COLOR )\n varying vec3 vColor;\n#endif"; +var color_pars_vertex = "#if defined( USE_COLOR_ALPHA )\n varying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n varying vec3 vColor;\n#endif"; +var color_vertex = "#if defined( USE_COLOR_ALPHA )\n vColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n vColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n vColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n vColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n vColor.xyz *= batchingColor.xyz;\n#endif"; +var 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; }\nvec3 pow2( const in vec3 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 max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n const highp float a = 12.9898, b = 78.233, c = 43758.5453;\n highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n return fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n float precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n float precisionSafeLength( vec3 v ) {\n float maxComponent = max3( abs( v ) );\n return length( v / maxComponent ) * maxComponent;\n }\n#endif\nstruct IncidentLight {\n vec3 color;\n vec3 direction;\n bool visible;\n};\nstruct ReflectedLight {\n vec3 directDiffuse;\n vec3 directSpecular;\n vec3 indirectDiffuse;\n vec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n varying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n return m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n return vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n return RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated"; +var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n #define cubeUV_minMipLevel 4.0\n #define cubeUV_minTileSize 16.0\n float getFace( vec3 direction ) {\n vec3 absDirection = abs( direction );\n float face = - 1.0;\n if ( absDirection.x > absDirection.z ) {\n if ( absDirection.x > absDirection.y )\n face = direction.x > 0.0 ? 0.0 : 3.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n } else {\n if ( absDirection.z > absDirection.y )\n face = direction.z > 0.0 ? 2.0 : 5.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n }\n return face;\n }\n vec2 getUV( vec3 direction, float face ) {\n vec2 uv;\n if ( face == 0.0 ) {\n uv = vec2( direction.z, direction.y ) / abs( direction.x );\n } else if ( face == 1.0 ) {\n uv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n } else if ( face == 2.0 ) {\n uv = vec2( - direction.x, direction.y ) / abs( direction.z );\n } else if ( face == 3.0 ) {\n uv = vec2( - direction.z, direction.y ) / abs( direction.x );\n } else if ( face == 4.0 ) {\n uv = vec2( - direction.x, direction.z ) / abs( direction.y );\n } else {\n uv = vec2( direction.x, direction.y ) / abs( direction.z );\n }\n return 0.5 * ( uv + 1.0 );\n }\n vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n float face = getFace( direction );\n float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n mipInt = max( mipInt, cubeUV_minMipLevel );\n float faceSize = exp2( mipInt );\n highp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n if ( face > 2.0 ) {\n uv.y += faceSize;\n face -= 3.0;\n }\n uv.x += face * faceSize;\n uv.x += filterInt * 3.0 * cubeUV_minTileSize;\n uv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n uv.x *= CUBEUV_TEXEL_WIDTH;\n uv.y *= CUBEUV_TEXEL_HEIGHT;\n #ifdef texture2DGradEXT\n return texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n #else\n return texture2D( envMap, uv ).rgb;\n #endif\n }\n #define cubeUV_r0 1.0\n #define cubeUV_m0 - 2.0\n #define cubeUV_r1 0.8\n #define cubeUV_m1 - 1.0\n #define cubeUV_r4 0.4\n #define cubeUV_m4 2.0\n #define cubeUV_r5 0.305\n #define cubeUV_m5 3.0\n #define cubeUV_r6 0.21\n #define cubeUV_m6 4.0\n float roughnessToMip( float roughness ) {\n float mip = 0.0;\n if ( roughness >= cubeUV_r1 ) {\n mip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n } else if ( roughness >= cubeUV_r4 ) {\n mip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n } else if ( roughness >= cubeUV_r5 ) {\n mip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n } else if ( roughness >= cubeUV_r6 ) {\n mip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n } else {\n mip = - 2.0 * log2( 1.16 * roughness ); }\n return mip;\n }\n vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n float mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n float mipF = fract( mip );\n float mipInt = floor( mip );\n vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n if ( mipF == 0.0 ) {\n return vec4( color0, 1.0 );\n } else {\n vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n return vec4( mix( color0, color1, mipF ), 1.0 );\n }\n }\n#endif"; +var defaultnormal_vertex = "vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n vec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n mat3 bm = mat3( batchingMatrix );\n transformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n transformedNormal = bm * transformedNormal;\n #ifdef USE_TANGENT\n transformedTangent = bm * transformedTangent;\n #endif\n#endif\n#ifdef USE_INSTANCING\n mat3 im = mat3( instanceMatrix );\n transformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n transformedNormal = im * transformedNormal;\n #ifdef USE_TANGENT\n transformedTangent = im * transformedTangent;\n #endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n transformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n transformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n #ifdef FLIP_SIDED\n transformedTangent = - transformedTangent;\n #endif\n#endif"; +var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n uniform sampler2D displacementMap;\n uniform float displacementScale;\n uniform float displacementBias;\n#endif"; +var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif"; +var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n emissiveColor = sRGBTransferEOTF( emissiveColor );\n #endif\n totalEmissiveRadiance *= emissiveColor.rgb;\n#endif"; +var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n uniform sampler2D emissiveMap;\n#endif"; +var colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );"; +var colorspace_pars_fragment = "vec4 LinearTransferOETF( in vec4 value ) {\n return value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}"; +var envmap_fragment = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vec3 cameraToFrag;\n if ( isOrthographic ) {\n cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToFrag = normalize( vWorldPosition - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vec3 reflectVec = reflect( cameraToFrag, worldNormal );\n #else\n vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n #endif\n #else\n vec3 reflectVec = vReflect;\n #endif\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n #else\n vec4 envColor = vec4( 0.0 );\n #endif\n #ifdef ENVMAP_BLENDING_MULTIPLY\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_MIX )\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_ADD )\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n #endif\n#endif"; +var envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n uniform float envMapIntensity;\n uniform float flipEnvMap;\n uniform mat3 envMapRotation;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n#endif"; +var envmap_pars_fragment = "#ifdef USE_ENVMAP\n uniform float reflectivity;\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n #define ENV_WORLDPOS\n #endif\n #ifdef ENV_WORLDPOS\n varying vec3 vWorldPosition;\n uniform float refractionRatio;\n #else\n varying vec3 vReflect;\n #endif\n#endif"; +var envmap_pars_vertex = "#ifdef USE_ENVMAP\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n #define ENV_WORLDPOS\n #endif\n #ifdef ENV_WORLDPOS\n \n varying vec3 vWorldPosition;\n #else\n varying vec3 vReflect;\n uniform float refractionRatio;\n #endif\n#endif"; +var envmap_vertex = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vWorldPosition = worldPosition.xyz;\n #else\n vec3 cameraToVertex;\n if ( isOrthographic ) {\n cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vReflect = reflect( cameraToVertex, worldNormal );\n #else\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n #endif\n #endif\n#endif"; +var fog_vertex = "#ifdef USE_FOG\n vFogDepth = - mvPosition.z;\n#endif"; +var fog_pars_vertex = "#ifdef USE_FOG\n varying float vFogDepth;\n#endif"; +var fog_fragment = "#ifdef USE_FOG\n #ifdef FOG_EXP2\n float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n #else\n float fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n #endif\n gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"; +var fog_pars_fragment = "#ifdef USE_FOG\n uniform vec3 fogColor;\n varying float vFogDepth;\n #ifdef FOG_EXP2\n uniform float fogDensity;\n #else\n uniform float fogNear;\n uniform float fogFar;\n #endif\n#endif"; +var gradientmap_pars_fragment = "#ifdef USE_GRADIENTMAP\n uniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n float dotNL = dot( normal, lightDirection );\n vec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n #ifdef USE_GRADIENTMAP\n return vec3( texture2D( gradientMap, coord ).r );\n #else\n vec2 fw = fwidth( coord ) * 0.5;\n return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n #endif\n}"; +var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n uniform sampler2D lightMap;\n uniform float lightMapIntensity;\n#endif"; +var lights_lambert_fragment = "LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;"; +var lights_lambert_pars_fragment = "varying vec3 vViewPosition;\nstruct LambertMaterial {\n vec3 diffuseColor;\n float specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_Lambert\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert"; +var lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n uniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n float x = normal.x, y = normal.y, z = normal.z;\n vec3 result = shCoefficients[ 0 ] * 0.886227;\n result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n return result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n return irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n vec3 irradiance = ambientLightColor;\n return irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n if ( cutoffDistance > 0.0 ) {\n distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n }\n return distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n return smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n struct DirectionalLight {\n vec3 direction;\n vec3 color;\n };\n uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n void getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n light.color = directionalLight.color;\n light.direction = directionalLight.direction;\n light.visible = true;\n }\n#endif\n#if NUM_POINT_LIGHTS > 0\n struct PointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n uniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n void getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = pointLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float lightDistance = length( lVector );\n light.color = pointLight.color;\n light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n }\n#endif\n#if NUM_SPOT_LIGHTS > 0\n struct SpotLight {\n vec3 position;\n vec3 direction;\n vec3 color;\n float distance;\n float decay;\n float coneCos;\n float penumbraCos;\n };\n uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n void getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = spotLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float angleCos = dot( light.direction, spotLight.direction );\n float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n if ( spotAttenuation > 0.0 ) {\n float lightDistance = length( lVector );\n light.color = spotLight.color * spotAttenuation;\n light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n } else {\n light.color = vec3( 0.0 );\n light.visible = false;\n }\n }\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n struct RectAreaLight {\n vec3 color;\n vec3 position;\n vec3 halfWidth;\n vec3 halfHeight;\n };\n uniform sampler2D ltc_1; uniform sampler2D ltc_2;\n uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n struct HemisphereLight {\n vec3 direction;\n vec3 skyColor;\n vec3 groundColor;\n };\n uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n float dotNL = dot( normal, hemiLight.direction );\n float hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n return irradiance;\n }\n#endif"; +var envmap_physical_pars_fragment = "#ifdef USE_ENVMAP\n vec3 getIBLIrradiance( const in vec3 normal ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n return PI * envMapColor.rgb * envMapIntensity;\n #else\n return vec3( 0.0 );\n #endif\n }\n vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 reflectVec = reflect( - viewDir, normal );\n reflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\n reflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n return envMapColor.rgb * envMapIntensity;\n #else\n return vec3( 0.0 );\n #endif\n }\n #ifdef USE_ANISOTROPY\n vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 bentNormal = cross( bitangent, viewDir );\n bentNormal = normalize( cross( bentNormal, bitangent ) );\n bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n return getIBLRadiance( viewDir, bentNormal, roughness );\n #else\n return vec3( 0.0 );\n #endif\n }\n #endif\n#endif"; +var lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;"; +var lights_toon_pars_fragment = "varying vec3 vViewPosition;\nstruct ToonMaterial {\n vec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_Toon\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon"; +var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;"; +var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n vec3 diffuseColor;\n vec3 specularColor;\n float specularShininess;\n float specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_BlinnPhong\n#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong"; +var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = metalnessFactor;\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n material.ior = ior;\n #ifdef USE_SPECULAR\n float specularIntensityFactor = specularIntensity;\n vec3 specularColorFactor = specularColor;\n #ifdef USE_SPECULAR_COLORMAP\n specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n #endif\n #ifdef USE_SPECULAR_INTENSITYMAP\n specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n #endif\n material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n #else\n float specularIntensityFactor = 1.0;\n vec3 specularColorFactor = vec3( 1.0 );\n material.specularF90 = 1.0;\n #endif\n material.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n material.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n material.specularColor = vec3( 0.04 );\n material.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n material.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n material.clearcoat = clearcoat;\n material.clearcoatRoughness = clearcoatRoughness;\n material.clearcoatF0 = vec3( 0.04 );\n material.clearcoatF90 = 1.0;\n #ifdef USE_CLEARCOATMAP\n material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n #endif\n #ifdef USE_CLEARCOAT_ROUGHNESSMAP\n material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n #endif\n material.clearcoat = saturate( material.clearcoat ); material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n material.clearcoatRoughness += geometryRoughness;\n material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n material.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n material.iridescence = iridescence;\n material.iridescenceIOR = iridescenceIOR;\n #ifdef USE_IRIDESCENCEMAP\n material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n #endif\n #ifdef USE_IRIDESCENCE_THICKNESSMAP\n material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n #else\n material.iridescenceThickness = iridescenceThicknessMaximum;\n #endif\n#endif\n#ifdef USE_SHEEN\n material.sheenColor = sheenColor;\n #ifdef USE_SHEEN_COLORMAP\n material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n #endif\n material.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\n #ifdef USE_SHEEN_ROUGHNESSMAP\n material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n #endif\n#endif\n#ifdef USE_ANISOTROPY\n #ifdef USE_ANISOTROPYMAP\n mat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n vec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n vec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n #else\n vec2 anisotropyV = anisotropyVector;\n #endif\n material.anisotropy = length( anisotropyV );\n if( material.anisotropy == 0.0 ) {\n anisotropyV = vec2( 1.0, 0.0 );\n } else {\n anisotropyV /= material.anisotropy;\n material.anisotropy = saturate( material.anisotropy );\n }\n material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif"; +var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n vec3 diffuseColor;\n vec3 diffuseContribution;\n vec3 specularColor;\n vec3 specularColorBlended;\n float roughness;\n float metalness;\n float specularF90;\n float dispersion;\n #ifdef USE_CLEARCOAT\n float clearcoat;\n float clearcoatRoughness;\n vec3 clearcoatF0;\n float clearcoatF90;\n #endif\n #ifdef USE_IRIDESCENCE\n float iridescence;\n float iridescenceIOR;\n float iridescenceThickness;\n vec3 iridescenceFresnel;\n vec3 iridescenceF0;\n vec3 iridescenceFresnelDielectric;\n vec3 iridescenceFresnelMetallic;\n #endif\n #ifdef USE_SHEEN\n vec3 sheenColor;\n float sheenRoughness;\n #endif\n #ifdef IOR\n float ior;\n #endif\n #ifdef USE_TRANSMISSION\n float transmission;\n float transmissionAlpha;\n float thickness;\n float attenuationDistance;\n vec3 attenuationColor;\n #endif\n #ifdef USE_ANISOTROPY\n float anisotropy;\n float alphaT;\n vec3 anisotropyT;\n vec3 anisotropyB;\n #endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n float a2 = pow2( alpha );\n float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n return 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n float a2 = pow2( alpha );\n float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n return RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n float V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n float v = 0.5 / ( gv + gl );\n return v;\n }\n float D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n float a2 = alphaT * alphaB;\n highp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n highp float v2 = dot( v, v );\n float w2 = a2 / v2;\n return RECIPROCAL_PI * a2 * pow2 ( w2 );\n }\n#endif\n#ifdef USE_CLEARCOAT\n vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n vec3 f0 = material.clearcoatF0;\n float f90 = material.clearcoatF90;\n float roughness = material.clearcoatRoughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n return F * ( V * D );\n }\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n vec3 f0 = material.specularColorBlended;\n float f90 = material.specularF90;\n float roughness = material.roughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n #ifdef USE_IRIDESCENCE\n F = mix( F, material.iridescenceFresnel, material.iridescence );\n #endif\n #ifdef USE_ANISOTROPY\n float dotTL = dot( material.anisotropyT, lightDir );\n float dotTV = dot( material.anisotropyT, viewDir );\n float dotTH = dot( material.anisotropyT, halfDir );\n float dotBL = dot( material.anisotropyB, lightDir );\n float dotBV = dot( material.anisotropyB, viewDir );\n float dotBH = dot( material.anisotropyB, halfDir );\n float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n #else\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n #endif\n return F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n const float LUT_SIZE = 64.0;\n const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n const float LUT_BIAS = 0.5 / LUT_SIZE;\n float dotNV = saturate( dot( N, V ) );\n vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n uv = uv * LUT_SCALE + LUT_BIAS;\n return uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n float l = length( f );\n return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n float x = dot( v1, v2 );\n float y = abs( x );\n float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n float b = 3.4175940 + ( 4.1616724 + y ) * y;\n float v = a / b;\n float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n return 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 vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n vec3 lightNormal = cross( v1, v2 );\n if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n vec3 T1, T2;\n T1 = normalize( V - N * dot( V, N ) );\n T2 = - cross( N, T1 );\n mat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n vec3 coords[ 4 ];\n coords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n coords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n coords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n coords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n coords[ 0 ] = normalize( coords[ 0 ] );\n coords[ 1 ] = normalize( coords[ 1 ] );\n coords[ 2 ] = normalize( coords[ 2 ] );\n coords[ 3 ] = normalize( coords[ 3 ] );\n vec3 vectorFormFactor = vec3( 0.0 );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n float result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n return vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n float alpha = pow2( roughness );\n float invAlpha = 1.0 / alpha;\n float cos2h = dotNH * dotNH;\n float sin2h = max( 1.0 - cos2h, 0.0078125 );\n return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float D = D_Charlie( sheenRoughness, dotNH );\n float V = V_Neubelt( dotNV, dotNL );\n return sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n float r2 = roughness * roughness;\n float rInv = 1.0 / ( roughness + 0.1 );\n float a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n float b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n float DG = exp( a * dotNV + b );\n return saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n return specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n #ifdef USE_IRIDESCENCE\n vec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n #else\n vec3 Fr = specularColor;\n #endif\n vec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n float Ess = fab.x + fab.y;\n float Ems = 1.0 - Ess;\n vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n singleScatter += FssEss;\n multiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n vec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n vec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n vec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n vec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n float Ess_V = dfgV.x + dfgV.y;\n float Ess_L = dfgL.x + dfgL.y;\n float Ems_V = 1.0 - Ess_V;\n float Ems_L = 1.0 - Ess_L;\n vec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n float compensationFactor = Ems_V * Ems_L;\n vec3 multiScatter = Fms * compensationFactor;\n return singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 normal = geometryNormal;\n vec3 viewDir = geometryViewDir;\n vec3 position = geometryPosition;\n vec3 lightPos = rectAreaLight.position;\n vec3 halfWidth = rectAreaLight.halfWidth;\n vec3 halfHeight = rectAreaLight.halfHeight;\n vec3 lightColor = rectAreaLight.color;\n float roughness = material.roughness;\n vec3 rectCoords[ 4 ];\n rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n rectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n rectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n vec2 uv = LTC_Uv( normal, viewDir, roughness );\n vec4 t1 = texture2D( ltc_1, uv );\n vec4 t2 = texture2D( ltc_2, uv );\n mat3 mInv = mat3(\n vec3( t1.x, 0, t1.y ),\n vec3( 0, 1, 0 ),\n vec3( t1.z, 0, t1.w )\n );\n vec3 fresnel = ( material.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\n reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n reflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n }\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n #ifdef USE_CLEARCOAT\n float dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n vec3 ccIrradiance = dotNLcc * directLight.color;\n clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n #endif\n #ifdef USE_SHEEN\n \n sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n float sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n irradiance *= sheenEnergyComp;\n \n #endif\n reflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n #ifdef USE_SHEEN\n float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n diffuse *= sheenEnergyComp;\n #endif\n reflectedLight.indirectDiffuse += diffuse;\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n #ifdef USE_CLEARCOAT\n clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n #endif\n #ifdef USE_SHEEN\n sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\n #endif\n vec3 singleScatteringDielectric = vec3( 0.0 );\n vec3 multiScatteringDielectric = vec3( 0.0 );\n vec3 singleScatteringMetallic = vec3( 0.0 );\n vec3 multiScatteringMetallic = vec3( 0.0 );\n #ifdef USE_IRIDESCENCE\n computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n #else\n computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n computeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n #endif\n vec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n vec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n vec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n vec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n vec3 indirectSpecular = radiance * singleScattering;\n indirectSpecular += multiScattering * cosineWeightedIrradiance;\n vec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n #ifdef USE_SHEEN\n float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n indirectSpecular *= sheenEnergyComp;\n indirectDiffuse *= sheenEnergyComp;\n #endif\n reflectedLight.indirectSpecular += indirectSpecular;\n reflectedLight.indirectDiffuse += indirectDiffuse;\n}\n#define RE_Direct RE_Direct_Physical\n#define RE_Direct_RectArea RE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular RE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; +var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n geometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n float dotNVi = saturate( dot( normal, geometryViewDir ) );\n if ( material.iridescenceThickness == 0.0 ) {\n material.iridescence = 0.0;\n } else {\n material.iridescence = saturate( material.iridescence );\n }\n if ( material.iridescence > 0.0 ) {\n material.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n material.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n material.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n }\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n pointLight = pointLights[ i ];\n getPointLightInfo( pointLight, geometryPosition, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n SpotLight spotLight;\n vec4 spotColor;\n vec3 spotLightCoord;\n bool inSpotLightMap;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n spotLight = spotLights[ i ];\n getSpotLightInfo( spotLight, geometryPosition, directLight );\n #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n #else\n #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #endif\n #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n #endif\n #undef SPOT_LIGHT_MAP_INDEX\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n directionalLight = directionalLights[ i ];\n getDirectionalLightInfo( directionalLight, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n RectAreaLight rectAreaLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n rectAreaLight = rectAreaLights[ i ];\n RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n vec3 iblIrradiance = vec3( 0.0 );\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n #if defined( USE_LIGHT_PROBES )\n irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n #endif\n #if ( NUM_HEMI_LIGHTS > 0 )\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if defined( RE_IndirectSpecular )\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; +var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n #ifdef USE_LIGHTMAP\n vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n irradiance += lightMapIrradiance;\n #endif\n #if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n iblIrradiance += getIBLIrradiance( geometryNormal );\n #endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n #ifdef USE_ANISOTROPY\n radiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n #else\n radiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n #endif\n #ifdef USE_CLEARCOAT\n clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n #endif\n#endif"; +var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif"; +var logdepthbuf_fragment = "#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif"; +var logdepthbuf_pars_fragment = "#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n uniform float logDepthBufFC;\n varying float vFragDepth;\n varying float vIsPerspective;\n#endif"; +var logdepthbuf_pars_vertex = "#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n varying float vFragDepth;\n varying float vIsPerspective;\n#endif"; +var logdepthbuf_vertex = "#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n vFragDepth = 1.0 + gl_Position.w;\n vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif"; +var map_fragment = "#ifdef USE_MAP\n vec4 sampledDiffuseColor = texture2D( map, vMapUv );\n #ifdef DECODE_VIDEO_TEXTURE\n sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n #endif\n diffuseColor *= sampledDiffuseColor;\n#endif"; +var map_pars_fragment = "#ifdef USE_MAP\n uniform sampler2D map;\n#endif"; +var map_particle_fragment = "#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n #if defined( USE_POINTS_UV )\n vec2 uv = vUv;\n #else\n vec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n #endif\n#endif\n#ifdef USE_MAP\n diffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n diffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif"; +var map_particle_pars_fragment = "#if defined( USE_POINTS_UV )\n varying vec2 vUv;\n#else\n #if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n uniform mat3 uvTransform;\n #endif\n#endif\n#ifdef USE_MAP\n uniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n uniform sampler2D alphaMap;\n#endif"; +var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n metalnessFactor *= texelMetalness.b;\n#endif"; +var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n uniform sampler2D metalnessMap;\n#endif"; +var morphinstance_vertex = "#ifdef USE_INSTANCING_MORPH\n float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n }\n#endif"; +var morphcolor_vertex = "#if defined( USE_MORPHCOLORS )\n vColor *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n #if defined( USE_COLOR_ALPHA )\n if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n #elif defined( USE_COLOR )\n if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n #endif\n }\n#endif"; +var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n objectNormal *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n }\n#endif"; +var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n #ifndef USE_INSTANCING_MORPH\n uniform float morphTargetBaseInfluence;\n uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n #endif\n uniform sampler2DArray morphTargetsTexture;\n uniform ivec2 morphTargetsTextureSize;\n vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n int y = texelIndex / morphTargetsTextureSize.x;\n int x = texelIndex - y * morphTargetsTextureSize.x;\n ivec3 morphUV = ivec3( x, y, morphTargetIndex );\n return texelFetch( morphTargetsTexture, morphUV, 0 );\n }\n#endif"; +var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n transformed *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n }\n#endif"; +var normal_fragment_begin = "float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n#else\n vec3 normal = normalize( vNormal );\n #ifdef DOUBLE_SIDED\n normal *= faceDirection;\n #endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n #ifdef USE_TANGENT\n mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n #else\n mat3 tbn = getTangentFrame( - vViewPosition, normal,\n #if defined( USE_NORMALMAP )\n vNormalMapUv\n #elif defined( USE_CLEARCOAT_NORMALMAP )\n vClearcoatNormalMapUv\n #else\n vUv\n #endif\n );\n #endif\n #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n tbn[0] *= faceDirection;\n tbn[1] *= faceDirection;\n #endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n #ifdef USE_TANGENT\n mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n #else\n mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n #endif\n #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n tbn2[0] *= faceDirection;\n tbn2[1] *= faceDirection;\n #endif\n#endif\nvec3 nonPerturbedNormal = normal;"; +var normal_fragment_maps = "#ifdef USE_NORMALMAP_OBJECTSPACE\n normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n #ifdef FLIP_SIDED\n normal = - normal;\n #endif\n #ifdef DOUBLE_SIDED\n normal = normal * faceDirection;\n #endif\n normal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n mapN.xy *= normalScale;\n normal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif"; +var normal_pars_fragment = "#ifndef FLAT_SHADED\n varying vec3 vNormal;\n #ifdef USE_TANGENT\n varying vec3 vTangent;\n varying vec3 vBitangent;\n #endif\n#endif"; +var normal_pars_vertex = "#ifndef FLAT_SHADED\n varying vec3 vNormal;\n #ifdef USE_TANGENT\n varying vec3 vTangent;\n varying vec3 vBitangent;\n #endif\n#endif"; +var normal_vertex = "#ifndef FLAT_SHADED\n vNormal = normalize( transformedNormal );\n #ifdef USE_TANGENT\n vTangent = normalize( transformedTangent );\n vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n #endif\n#endif"; +var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n uniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n vec3 q0 = dFdx( eye_pos.xyz );\n vec3 q1 = dFdy( eye_pos.xyz );\n vec2 st0 = dFdx( uv.st );\n vec2 st1 = dFdy( uv.st );\n vec3 N = surf_norm;\n vec3 q1perp = cross( q1, N );\n vec3 q0perp = cross( N, q0 );\n vec3 T = q1perp * st0.x + q0perp * st1.x;\n vec3 B = q1perp * st0.y + q0perp * st1.y;\n float det = max( dot( T, T ), dot( B, B ) );\n float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n return mat3( T * scale, B * scale, N );\n }\n#endif"; +var clearcoat_normal_fragment_begin = "#ifdef USE_CLEARCOAT\n vec3 clearcoatNormal = nonPerturbedNormal;\n#endif"; +var clearcoat_normal_fragment_maps = "#ifdef USE_CLEARCOAT_NORMALMAP\n vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n clearcoatMapN.xy *= clearcoatNormalScale;\n clearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif"; +var clearcoat_pars_fragment = "#ifdef USE_CLEARCOATMAP\n uniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n uniform sampler2D clearcoatNormalMap;\n uniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n uniform sampler2D clearcoatRoughnessMap;\n#endif"; +var iridescence_pars_fragment = "#ifdef USE_IRIDESCENCEMAP\n uniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n uniform sampler2D iridescenceThicknessMap;\n#endif"; +var opaque_fragment = "#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );"; +var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n if( v <= 0.0 )\n return vec4( 0., 0., 0., 0. );\n if( v >= 1.0 )\n return vec4( 1., 1., 1., 1. );\n float vuf;\n float af = modf( v * PackFactors.a, vuf );\n float bf = modf( vuf * ShiftRight8, vuf );\n float gf = modf( vuf * ShiftRight8, vuf );\n return vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n if( v <= 0.0 )\n return vec3( 0., 0., 0. );\n if( v >= 1.0 )\n return vec3( 1., 1., 1. );\n float vuf;\n float bf = modf( v * PackFactors.b, vuf );\n float gf = modf( vuf * ShiftRight8, vuf );\n return vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n if( v <= 0.0 )\n return vec2( 0., 0. );\n if( v >= 1.0 )\n return vec2( 1., 1. );\n float vuf;\n float gf = modf( v * 256., vuf );\n return vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n return dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n return dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n return v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n vec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n return vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n return 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 return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n return depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n return ( near * far ) / ( ( far - near ) * depth - far );\n}"; +var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif"; +var project_vertex = "vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n mvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n mvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;"; +var dithering_fragment = "#ifdef DITHERING\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif"; +var dithering_pars_fragment = "#ifdef DITHERING\n vec3 dithering( vec3 color ) {\n float grid_position = rand( gl_FragCoord.xy );\n vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n return color + dither_shift_RGB;\n }\n#endif"; +var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n roughnessFactor *= texelRoughness.g;\n#endif"; +var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n uniform sampler2D roughnessMap;\n#endif"; +var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n #if defined( SHADOWMAP_TYPE_PCF )\n uniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n #else\n uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n struct DirectionalLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n #if defined( SHADOWMAP_TYPE_PCF )\n uniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n #else\n uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n struct SpotLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #if defined( SHADOWMAP_TYPE_PCF )\n uniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n #elif defined( SHADOWMAP_TYPE_BASIC )\n uniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n struct PointLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n float shadowCameraNear;\n float shadowCameraFar;\n };\n uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n #if defined( SHADOWMAP_TYPE_PCF )\n float interleavedGradientNoise( vec2 position ) {\n return fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n }\n vec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n const float goldenAngle = 2.399963229728653;\n float r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n float theta = float( sampleIndex ) * goldenAngle + phi;\n return vec2( cos( theta ), sin( theta ) ) * r;\n }\n #endif\n #if defined( SHADOWMAP_TYPE_PCF )\n float getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n float shadow = 1.0;\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if ( frustumTest ) {\n vec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n float radius = shadowRadius * texelSize.x;\n float phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n shadow = (\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n ) * 0.2;\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #elif defined( SHADOWMAP_TYPE_VSM )\n float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n float shadow = 1.0;\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if ( frustumTest ) {\n vec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n float mean = distribution.x;\n float variance = distribution.y * distribution.y;\n #ifdef USE_REVERSED_DEPTH_BUFFER\n float hard_shadow = step( mean, shadowCoord.z );\n #else\n float hard_shadow = step( shadowCoord.z, mean );\n #endif\n if ( hard_shadow == 1.0 ) {\n shadow = 1.0;\n } else {\n variance = max( variance, 0.0000001 );\n float d = shadowCoord.z - mean;\n float p_max = variance / ( variance + d * d );\n p_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n shadow = max( hard_shadow, p_max );\n }\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #else\n float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n float shadow = 1.0;\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if ( frustumTest ) {\n float depth = texture2D( shadowMap, shadowCoord.xy ).r;\n #ifdef USE_REVERSED_DEPTH_BUFFER\n shadow = step( depth, shadowCoord.z );\n #else\n shadow = step( shadowCoord.z, depth );\n #endif\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #if defined( SHADOWMAP_TYPE_PCF )\n float getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n float shadow = 1.0;\n vec3 lightToPosition = shadowCoord.xyz;\n vec3 bd3D = normalize( lightToPosition );\n vec3 absVec = abs( lightToPosition );\n float viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n if ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n dp += shadowBias;\n float texelSize = shadowRadius / shadowMapSize.x;\n vec3 absDir = abs( bd3D );\n vec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n tangent = normalize( cross( bd3D, tangent ) );\n vec3 bitangent = cross( bd3D, tangent );\n float phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n shadow = (\n texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) +\n texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) +\n texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) +\n texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) +\n texture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).y ) * texelSize, dp ) )\n ) * 0.2;\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #elif defined( SHADOWMAP_TYPE_BASIC )\n float getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n float shadow = 1.0;\n vec3 lightToPosition = shadowCoord.xyz;\n vec3 bd3D = normalize( lightToPosition );\n vec3 absVec = abs( lightToPosition );\n float viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n if ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n dp += shadowBias;\n float depth = textureCube( shadowMap, bd3D ).r;\n #ifdef USE_REVERSED_DEPTH_BUFFER\n shadow = step( depth, dp );\n #else\n shadow = step( dp, depth );\n #endif\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #endif\n #endif\n#endif"; +var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n struct DirectionalLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n struct SpotLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n struct PointLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n float shadowCameraNear;\n float shadowCameraFar;\n };\n uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n#endif"; +var shadowmap_vertex = "#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n vec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n #if NUM_DIR_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n shadowWorldPosition = worldPosition;\n #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n #endif\n vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n#endif"; +var shadowmask_pars_fragment = "float getShadowMask() {\n float shadow = 1.0;\n #ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n directionalLight = directionalLightShadows[ i ];\n shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n spotLight = spotLightShadows[ i ];\n shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n PointLightShadow pointLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n pointLight = pointLightShadows[ i ];\n shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #endif\n return shadow;\n}"; +var skinbase_vertex = "#ifdef USE_SKINNING\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; +var skinning_pars_vertex = "#ifdef USE_SKINNING\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n uniform highp sampler2D boneTexture;\n mat4 getBoneMatrix( const in float i ) {\n int size = textureSize( boneTexture, 0 ).x;\n int j = int( i ) * 4;\n int x = j % size;\n int y = j / size;\n vec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n vec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n vec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n return mat4( v1, v2, v3, v4 );\n }\n#endif"; +var skinning_vertex = "#ifdef USE_SKINNING\n vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n vec4 skinned = vec4( 0.0 );\n skinned += boneMatX * skinVertex * skinWeight.x;\n skinned += boneMatY * skinVertex * skinWeight.y;\n skinned += boneMatZ * skinVertex * skinWeight.z;\n skinned += boneMatW * skinVertex * skinWeight.w;\n transformed = ( bindMatrixInverse * skinned ).xyz;\n#endif"; +var skinnormal_vertex = "#ifdef USE_SKINNING\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n objectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n #ifdef USE_TANGENT\n objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n #endif\n#endif"; +var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n specularStrength = texelSpecular.r;\n#else\n specularStrength = 1.0;\n#endif"; +var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n uniform sampler2D specularMap;\n#endif"; +var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif"; +var 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 return saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n color = max( vec3( 0.0 ), color - 0.004 );\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n vec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n vec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n return a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n const mat3 ACESInputMat = mat3(\n vec3( 0.59719, 0.07600, 0.02840 ), vec3( 0.35458, 0.90834, 0.13383 ),\n vec3( 0.04823, 0.01566, 0.83777 )\n );\n const mat3 ACESOutputMat = mat3(\n vec3( 1.60475, -0.10208, -0.00327 ), vec3( -0.53108, 1.10813, -0.07276 ),\n vec3( -0.07367, -0.00605, 1.07602 )\n );\n color *= toneMappingExposure / 0.6;\n color = ACESInputMat * color;\n color = RRTAndODTFit( color );\n color = ACESOutputMat * color;\n return saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n vec3( 1.6605, - 0.1246, - 0.0182 ),\n vec3( - 0.5876, 1.1329, - 0.1006 ),\n vec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n vec3( 0.6274, 0.0691, 0.0164 ),\n vec3( 0.3293, 0.9195, 0.0880 ),\n vec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n vec3 x2 = x * x;\n vec3 x4 = x2 * x2;\n return + 15.5 * x4 * x2\n - 40.14 * x4 * x\n + 31.96 * x4\n - 6.868 * x2 * x\n + 0.4298 * x2\n + 0.1191 * x\n - 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n const mat3 AgXInsetMatrix = mat3(\n vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n );\n const mat3 AgXOutsetMatrix = mat3(\n vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n );\n const float AgxMinEv = - 12.47393; const float AgxMaxEv = 4.026069;\n color *= toneMappingExposure;\n color = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n color = AgXInsetMatrix * color;\n color = max( color, 1e-10 ); color = log2( color );\n color = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n color = clamp( color, 0.0, 1.0 );\n color = agxDefaultContrastApprox( color );\n color = AgXOutsetMatrix * color;\n color = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n color = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n color = clamp( color, 0.0, 1.0 );\n return color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n const float StartCompression = 0.8 - 0.04;\n const float Desaturation = 0.15;\n color *= toneMappingExposure;\n float x = min( color.r, min( color.g, color.b ) );\n float offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n color -= offset;\n float peak = max( color.r, max( color.g, color.b ) );\n if ( peak < StartCompression ) return color;\n float d = 1. - StartCompression;\n float newPeak = 1. - d * d / ( peak + d - StartCompression );\n color *= newPeak / peak;\n float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n return mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }"; +var transmission_fragment = "#ifdef USE_TRANSMISSION\n material.transmission = transmission;\n material.transmissionAlpha = 1.0;\n material.thickness = thickness;\n material.attenuationDistance = attenuationDistance;\n material.attenuationColor = attenuationColor;\n #ifdef USE_TRANSMISSIONMAP\n material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n #endif\n #ifdef USE_THICKNESSMAP\n material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n #endif\n vec3 pos = vWorldPosition;\n vec3 v = normalize( cameraPosition - pos );\n vec3 n = inverseTransformDirection( normal, viewMatrix );\n vec4 transmitted = getIBLVolumeRefraction(\n n, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,\n pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n material.attenuationColor, material.attenuationDistance );\n material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif"; +var transmission_pars_fragment = "#ifdef USE_TRANSMISSION\n uniform float transmission;\n uniform float thickness;\n uniform float attenuationDistance;\n uniform vec3 attenuationColor;\n #ifdef USE_TRANSMISSIONMAP\n uniform sampler2D transmissionMap;\n #endif\n #ifdef USE_THICKNESSMAP\n uniform sampler2D thicknessMap;\n #endif\n uniform vec2 transmissionSamplerSize;\n uniform sampler2D transmissionSamplerMap;\n uniform mat4 modelMatrix;\n uniform mat4 projectionMatrix;\n varying vec3 vWorldPosition;\n float w0( float a ) {\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n }\n float w1( float a ) {\n return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n }\n float w2( float a ){\n return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n }\n float w3( float a ) {\n return ( 1.0 / 6.0 ) * ( a * a * a );\n }\n float g0( float a ) {\n return w0( a ) + w1( a );\n }\n float g1( float a ) {\n return w2( a ) + w3( a );\n }\n float h0( float a ) {\n return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n }\n float h1( float a ) {\n return 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n }\n vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n uv = uv * texelSize.zw + 0.5;\n vec2 iuv = floor( uv );\n vec2 fuv = fract( uv );\n float g0x = g0( fuv.x );\n float g1x = g1( fuv.x );\n float h0x = h0( fuv.x );\n float h1x = h1( fuv.x );\n float h0y = h0( fuv.y );\n float h1y = h1( fuv.y );\n vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n }\n vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n vec2 fLodSizeInv = 1.0 / fLodSize;\n vec2 cLodSizeInv = 1.0 / cLodSize;\n vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n return mix( fSample, cSample, fract( lod ) );\n }\n vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n vec3 modelScale;\n modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n return normalize( refractionVector ) * thickness * modelScale;\n }\n float applyIorToRoughness( const in float roughness, const in float ior ) {\n return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n }\n vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n }\n vec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n if ( isinf( attenuationDistance ) ) {\n return vec3( 1.0 );\n } else {\n vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); return transmittance;\n }\n }\n vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n const in vec3 attenuationColor, const in float attenuationDistance ) {\n vec4 transmittedLight;\n vec3 transmittance;\n #ifdef USE_DISPERSION\n float halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n vec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n for ( int i = 0; i < 3; i ++ ) {\n vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n vec3 refractedRayExit = position + transmissionRay;\n vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n vec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n transmittedLight[ i ] = transmissionSample[ i ];\n transmittedLight.a += transmissionSample.a;\n transmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n }\n transmittedLight.a /= 3.0;\n #else\n vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n vec3 refractedRayExit = position + transmissionRay;\n vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n vec2 refractionCoords = ndcPos.xy / ndcPos.w;\n refractionCoords += 1.0;\n refractionCoords /= 2.0;\n transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n #endif\n vec3 attenuatedColor = transmittance * transmittedLight.rgb;\n vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n }\n#endif"; +var uv_pars_fragment = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n varying vec2 vUv;\n#endif\n#ifdef USE_MAP\n varying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n varying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n varying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n varying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n varying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n varying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n varying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n varying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n varying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n varying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n varying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n varying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n varying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n varying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n varying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n varying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n varying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n varying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n varying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n varying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n uniform mat3 transmissionMapTransform;\n varying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n uniform mat3 thicknessMapTransform;\n varying vec2 vThicknessMapUv;\n#endif"; +var uv_pars_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n varying vec2 vUv;\n#endif\n#ifdef USE_MAP\n uniform mat3 mapTransform;\n varying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n uniform mat3 alphaMapTransform;\n varying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n uniform mat3 lightMapTransform;\n varying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n uniform mat3 aoMapTransform;\n varying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n uniform mat3 bumpMapTransform;\n varying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n uniform mat3 normalMapTransform;\n varying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n uniform mat3 displacementMapTransform;\n varying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n uniform mat3 emissiveMapTransform;\n varying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n uniform mat3 metalnessMapTransform;\n varying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n uniform mat3 roughnessMapTransform;\n varying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n uniform mat3 anisotropyMapTransform;\n varying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n uniform mat3 clearcoatMapTransform;\n varying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n uniform mat3 clearcoatNormalMapTransform;\n varying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n uniform mat3 clearcoatRoughnessMapTransform;\n varying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n uniform mat3 sheenColorMapTransform;\n varying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n uniform mat3 sheenRoughnessMapTransform;\n varying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n uniform mat3 iridescenceMapTransform;\n varying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n uniform mat3 iridescenceThicknessMapTransform;\n varying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n uniform mat3 specularMapTransform;\n varying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n uniform mat3 specularColorMapTransform;\n varying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n uniform mat3 specularIntensityMapTransform;\n varying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n uniform mat3 transmissionMapTransform;\n varying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n uniform mat3 thicknessMapTransform;\n varying vec2 vThicknessMapUv;\n#endif"; +var uv_vertex = "#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n vUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n vMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n vAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n vLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n vAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n vBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n vNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n vDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n vEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n vMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n vRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n vAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n vClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n vClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n vClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n vIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n vIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n vSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n vSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n vSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n vSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n vSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n vTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif"; +var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n vec4 worldPosition = vec4( transformed, 1.0 );\n #ifdef USE_BATCHING\n worldPosition = batchingMatrix * worldPosition;\n #endif\n #ifdef USE_INSTANCING\n worldPosition = instanceMatrix * worldPosition;\n #endif\n worldPosition = modelMatrix * worldPosition;\n#endif"; +var vertex$h = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n vUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n gl_Position = vec4( position.xy, 1.0, 1.0 );\n}"; +var fragment$h = "uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n vec4 texColor = texture2D( t2D, vUv );\n #ifdef DECODE_VIDEO_TEXTURE\n texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include \n #include \n}"; +var vertex$g = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n gl_Position.z = gl_Position.w;\n}"; +var fragment$g = "#ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n uniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n #ifdef ENVMAP_TYPE_CUBE\n vec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n #elif defined( ENVMAP_TYPE_CUBE_UV )\n vec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n #else\n vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include \n #include \n}"; +var vertex$f = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n gl_Position.z = gl_Position.w;\n}"; +var fragment$f = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n vec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n gl_FragColor = texColor;\n gl_FragColor.a *= opacity;\n #include \n #include \n}"; +var vertex$e = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n #include \n #include \n #include \n #include \n #ifdef USE_DISPLACEMENTMAP\n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vHighPrecisionZW = gl_Position.zw;\n}"; +var fragment$e = "#if DEPTH_PACKING == 3200\n uniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n vec4 diffuseColor = vec4( 1.0 );\n #include \n #if DEPTH_PACKING == 3200\n diffuseColor.a = opacity;\n #endif\n #include \n #include \n #include \n #include \n #include \n #ifdef USE_REVERSED_DEPTH_BUFFER\n float fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n #else\n float fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n #endif\n #if DEPTH_PACKING == 3200\n gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n #elif DEPTH_PACKING == 3201\n gl_FragColor = packDepthToRGBA( fragCoordZ );\n #elif DEPTH_PACKING == 3202\n gl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n #elif DEPTH_PACKING == 3203\n gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n #endif\n}"; +var vertex$d = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #ifdef USE_DISPLACEMENTMAP\n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vWorldPosition = worldPosition.xyz;\n}"; +var fragment$d = "#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 \n#include \nvoid main () {\n vec4 diffuseColor = vec4( 1.0 );\n #include \n #include \n #include \n #include \n #include \n float dist = length( vWorldPosition - referencePosition );\n dist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n dist = saturate( dist );\n gl_FragColor = vec4( dist, 0.0, 0.0, 1.0 );\n}"; +var vertex$c = "varying vec3 vWorldDirection;\n#include \nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include \n #include \n}"; +var fragment$c = "uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n vec3 direction = normalize( vWorldDirection );\n vec2 sampleUV = equirectUv( direction );\n gl_FragColor = texture2D( tEquirect, sampleUV );\n #include \n #include \n}"; +var vertex$b = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vLineDistance = scale * lineDistance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +var fragment$b = "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 \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n if ( mod( vLineDistance, totalSize ) > dashSize ) {\n discard;\n }\n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n #include \n}"; +var vertex$a = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n #include \n #include \n #include \n #include \n #if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n #include \n #include \n #include \n #include \n #include \n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +var fragment$a = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n varying 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 vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n #ifdef USE_LIGHTMAP\n vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n #else\n reflectedLight.indirectDiffuse += vec3( 1.0 );\n #endif\n #include \n reflectedLight.indirectDiffuse *= diffuseColor.rgb;\n vec3 outgoingLight = reflectedLight.indirectDiffuse;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +var vertex$9 = "#define LAMBERT\nvarying vec3 vViewPosition;\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 #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 vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n #include \n}"; +var fragment$9 = "#define LAMBERT\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 \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\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 vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +var vertex$8 = "#define MATCAP\nvarying vec3 vViewPosition;\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 #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 vViewPosition = - mvPosition.xyz;\n}"; +var fragment$8 = "#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\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 vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n #include \n vec3 viewDir = normalize( vViewPosition );\n vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n vec3 y = cross( viewDir, x );\n vec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n #ifdef USE_MATCAP\n vec4 matcapColor = texture2D( matcap, uv );\n #else\n vec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n #endif\n vec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n #include \n #include \n #include \n #include \n #include \n #include \n}"; +var vertex$7 = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n varying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n vViewPosition = - mvPosition.xyz;\n#endif\n}"; +var fragment$7 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n varying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n #include \n #include \n #include \n #include \n gl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );\n #ifdef OPAQUE\n gl_FragColor.a = 1.0;\n #endif\n}"; +var vertex$6 = "#define PHONG\nvarying vec3 vViewPosition;\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 #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 vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n #include \n}"; +var fragment$6 = "#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 vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\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 vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n #include \n}"; +var vertex$5 = "#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n varying vec3 vWorldPosition;\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 #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 vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n#ifdef USE_TRANSMISSION\n vWorldPosition = worldPosition.xyz;\n#endif\n}"; +var fragment$5 = "#define STANDARD\n#ifdef PHYSICAL\n #define IOR\n #define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n uniform float ior;\n#endif\n#ifdef USE_SPECULAR\n uniform float specularIntensity;\n uniform vec3 specularColor;\n #ifdef USE_SPECULAR_COLORMAP\n uniform sampler2D specularColorMap;\n #endif\n #ifdef USE_SPECULAR_INTENSITYMAP\n uniform sampler2D specularIntensityMap;\n #endif\n#endif\n#ifdef USE_CLEARCOAT\n uniform float clearcoat;\n uniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n uniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n uniform float iridescence;\n uniform float iridescenceIOR;\n uniform float iridescenceThicknessMinimum;\n uniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n uniform vec3 sheenColor;\n uniform float sheenRoughness;\n #ifdef USE_SHEEN_COLORMAP\n uniform sampler2D sheenColorMap;\n #endif\n #ifdef USE_SHEEN_ROUGHNESSMAP\n uniform sampler2D sheenRoughnessMap;\n #endif\n#endif\n#ifdef USE_ANISOTROPY\n uniform vec2 anisotropyVector;\n #ifdef USE_ANISOTROPYMAP\n uniform sampler2D anisotropyMap;\n #endif\n#endif\nvarying vec3 vViewPosition;\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 \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\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 vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n #include \n vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n #ifdef USE_SHEEN\n \n outgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \n #endif\n #ifdef USE_CLEARCOAT\n float dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n}"; +var vertex$4 = "#define TOON\nvarying vec3 vViewPosition;\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 #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 vViewPosition = - mvPosition.xyz;\n #include \n #include \n #include \n}"; +var fragment$4 = "#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 \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n vec3 totalEmissiveRadiance = emissive;\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 vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n #include \n #include \n #include \n #include \n #include \n #include \n}"; +var vertex$3 = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n varying vec2 vUv;\n uniform mat3 uvTransform;\n#endif\nvoid main() {\n #ifdef USE_POINTS_UV\n vUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n #endif\n #include \n #include \n #include \n #include \n #include \n #include \n gl_PointSize = size;\n #ifdef USE_SIZEATTENUATION\n bool isPerspective = isPerspectiveMatrix( projectionMatrix );\n if ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n #endif\n #include \n #include \n #include \n #include \n}"; +var fragment$3 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n #include \n}"; +var vertex$2 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\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}"; +var fragment$2 = "uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n #include \n #include \n #include \n}"; +var vertex$1 = "uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n #include \n vec4 mvPosition = modelViewMatrix[ 3 ];\n vec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n #ifndef USE_SIZEATTENUATION\n bool isPerspective = isPerspectiveMatrix( projectionMatrix );\n if ( isPerspective ) scale *= - mvPosition.z;\n #endif\n vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n vec2 rotatedPosition;\n rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n mvPosition.xy += rotatedPosition;\n gl_Position = projectionMatrix * mvPosition;\n #include \n #include \n #include \n}"; +var fragment$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include \n vec3 outgoingLight = vec3( 0.0 );\n #include \n #include \n #include \n #include \n #include \n outgoingLight = diffuseColor.rgb;\n #include \n #include \n #include \n #include \n}"; +var ShaderChunk = { + alphahash_fragment, + alphahash_pars_fragment, + alphamap_fragment, + alphamap_pars_fragment, + alphatest_fragment, + alphatest_pars_fragment, + aomap_fragment, + aomap_pars_fragment, + batching_pars_vertex, + batching_vertex, + begin_vertex, + beginnormal_vertex, + bsdfs, + iridescence_fragment, + bumpmap_pars_fragment, + clipping_planes_fragment, + clipping_planes_pars_fragment, + clipping_planes_pars_vertex, + clipping_planes_vertex, + color_fragment, + color_pars_fragment, + color_pars_vertex, + color_vertex, + common, + cube_uv_reflection_fragment, + defaultnormal_vertex, + displacementmap_pars_vertex, + displacementmap_vertex, + emissivemap_fragment, + emissivemap_pars_fragment, + colorspace_fragment, + colorspace_pars_fragment, + envmap_fragment, + envmap_common_pars_fragment, + envmap_pars_fragment, + envmap_pars_vertex, + envmap_physical_pars_fragment, + envmap_vertex, + fog_vertex, + fog_pars_vertex, + fog_fragment, + fog_pars_fragment, + gradientmap_pars_fragment, + lightmap_pars_fragment, + lights_lambert_fragment, + lights_lambert_pars_fragment, + lights_pars_begin, + lights_toon_fragment, + lights_toon_pars_fragment, + lights_phong_fragment, + lights_phong_pars_fragment, + lights_physical_fragment, + lights_physical_pars_fragment, + lights_fragment_begin, + lights_fragment_maps, + lights_fragment_end, + logdepthbuf_fragment, + logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex, + logdepthbuf_vertex, + map_fragment, + map_pars_fragment, + map_particle_fragment, + map_particle_pars_fragment, + metalnessmap_fragment, + metalnessmap_pars_fragment, + morphinstance_vertex, + morphcolor_vertex, + morphnormal_vertex, + morphtarget_pars_vertex, + morphtarget_vertex, + normal_fragment_begin, + normal_fragment_maps, + normal_pars_fragment, + normal_pars_vertex, + normal_vertex, + normalmap_pars_fragment, + clearcoat_normal_fragment_begin, + clearcoat_normal_fragment_maps, + clearcoat_pars_fragment, + iridescence_pars_fragment, + opaque_fragment, + packing, + premultiplied_alpha_fragment, + project_vertex, + dithering_fragment, + dithering_pars_fragment, + roughnessmap_fragment, + roughnessmap_pars_fragment, + shadowmap_pars_fragment, + shadowmap_pars_vertex, + shadowmap_vertex, + shadowmask_pars_fragment, + skinbase_vertex, + skinning_pars_vertex, + skinning_vertex, + skinnormal_vertex, + specularmap_fragment, + specularmap_pars_fragment, + tonemapping_fragment, + tonemapping_pars_fragment, + transmission_fragment, + transmission_pars_fragment, + uv_pars_fragment, + uv_pars_vertex, + uv_vertex, + worldpos_vertex, + background_vert: vertex$h, + background_frag: fragment$h, + backgroundCube_vert: vertex$g, + backgroundCube_frag: fragment$g, + cube_vert: vertex$f, + cube_frag: fragment$f, + depth_vert: vertex$e, + depth_frag: fragment$e, + distance_vert: vertex$d, + distance_frag: fragment$d, + equirect_vert: vertex$c, + equirect_frag: fragment$c, + linedashed_vert: vertex$b, + linedashed_frag: fragment$b, + meshbasic_vert: vertex$a, + meshbasic_frag: fragment$a, + meshlambert_vert: vertex$9, + meshlambert_frag: fragment$9, + meshmatcap_vert: vertex$8, + meshmatcap_frag: fragment$8, + meshnormal_vert: vertex$7, + meshnormal_frag: fragment$7, + meshphong_vert: vertex$6, + meshphong_frag: fragment$6, + meshphysical_vert: vertex$5, + meshphysical_frag: fragment$5, + meshtoon_vert: vertex$4, + meshtoon_frag: fragment$4, + points_vert: vertex$3, + points_frag: fragment$3, + shadow_vert: vertex$2, + shadow_frag: fragment$2, + sprite_vert: vertex$1, + sprite_frag: fragment$1 +}; +var UniformsLib = { + common: { + diffuse: { value: new Color(16777215) }, + opacity: { value: 1 }, + map: { value: null }, + mapTransform: { value: new Matrix3() }, + alphaMap: { value: null }, + alphaMapTransform: { value: new Matrix3() }, + alphaTest: { value: 0 } + }, + specularmap: { + specularMap: { value: null }, + specularMapTransform: { value: new Matrix3() } + }, + envmap: { + envMap: { value: null }, + envMapRotation: { value: new Matrix3() }, + flipEnvMap: { value: -1 }, + reflectivity: { value: 1 }, + // basic, lambert, phong + ior: { value: 1.5 }, + // physical + refractionRatio: { value: 0.98 }, + // basic, lambert, phong + dfgLUT: { value: null } + // DFG LUT for physically-based rendering + }, + aomap: { + aoMap: { value: null }, + aoMapIntensity: { value: 1 }, + aoMapTransform: { value: new Matrix3() } + }, + lightmap: { + lightMap: { value: null }, + lightMapIntensity: { value: 1 }, + lightMapTransform: { value: new Matrix3() } + }, + bumpmap: { + bumpMap: { value: null }, + bumpMapTransform: { value: new Matrix3() }, + bumpScale: { value: 1 } + }, + normalmap: { + normalMap: { value: null }, + normalMapTransform: { value: new Matrix3() }, + normalScale: { value: new Vector2(1, 1) } + }, + displacementmap: { + displacementMap: { value: null }, + displacementMapTransform: { value: new Matrix3() }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + }, + emissivemap: { + emissiveMap: { value: null }, + emissiveMapTransform: { value: new Matrix3() } + }, + metalnessmap: { + metalnessMap: { value: null }, + metalnessMapTransform: { value: new Matrix3() } + }, + roughnessmap: { + roughnessMap: { value: null }, + roughnessMapTransform: { value: new Matrix3() } + }, + gradientmap: { + gradientMap: { value: null } + }, + fog: { + fogDensity: { value: 25e-5 }, + fogNear: { value: 1 }, + fogFar: { value: 2e3 }, + fogColor: { value: new Color(16777215) } + }, + lights: { + ambientLightColor: { value: [] }, + lightProbe: { value: [] }, + directionalLights: { value: [], properties: { + direction: {}, + color: {} + } }, + directionalLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {} + } }, + spotLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + spotLightMap: { value: [] }, + spotShadowMap: { value: [] }, + spotLightMatrix: { value: [] }, + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {} + } }, + pointLightShadows: { value: [], properties: { + shadowIntensity: 1, + shadowBias: {}, + shadowNormalBias: {}, + shadowRadius: {}, + shadowMapSize: {}, + shadowCameraNear: {}, + shadowCameraFar: {} + } }, + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } }, + // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src + rectAreaLights: { value: [], properties: { + color: {}, + position: {}, + width: {}, + height: {} + } }, + ltc_1: { value: null }, + ltc_2: { value: null } + }, + points: { + diffuse: { value: new Color(16777215) }, + opacity: { value: 1 }, + size: { value: 1 }, + scale: { value: 1 }, + map: { value: null }, + alphaMap: { value: null }, + alphaMapTransform: { value: new Matrix3() }, + alphaTest: { value: 0 }, + uvTransform: { value: new Matrix3() } + }, + sprite: { + diffuse: { value: new Color(16777215) }, + opacity: { value: 1 }, + center: { value: new Vector2(0.5, 0.5) }, + rotation: { value: 0 }, + map: { value: null }, + mapTransform: { value: new Matrix3() }, + alphaMap: { value: null }, + alphaMapTransform: { value: new Matrix3() }, + alphaTest: { value: 0 } + } +}; +var ShaderLib = { + basic: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.fog + ]), + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + }, + lambert: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color(0) } + } + ]), + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + }, + phong: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.specularmap, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color(0) }, + specular: { value: new Color(1118481) }, + shininess: { value: 30 } + } + ]), + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + }, + standard: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.envmap, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color(0) }, + roughness: { value: 1 }, + metalness: { value: 0 }, + envMapIntensity: { value: 1 } + } + ]), + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + }, + toon: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.gradientmap, + UniformsLib.fog, + UniformsLib.lights, + { + emissive: { value: new Color(0) } + } + ]), + vertexShader: ShaderChunk.meshtoon_vert, + fragmentShader: ShaderChunk.meshtoon_frag + }, + matcap: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + { + matcap: { value: null } + } + ]), + vertexShader: ShaderChunk.meshmatcap_vert, + fragmentShader: ShaderChunk.meshmatcap_frag + }, + points: { + uniforms: mergeUniforms([ + UniformsLib.points, + UniformsLib.fog + ]), + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + }, + dashed: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.fog, + { + scale: { value: 1 }, + dashSize: { value: 1 }, + totalSize: { value: 2 } + } + ]), + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + }, + depth: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.displacementmap + ]), + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + }, + normal: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + { + opacity: { value: 1 } + } + ]), + vertexShader: ShaderChunk.meshnormal_vert, + fragmentShader: ShaderChunk.meshnormal_frag + }, + sprite: { + uniforms: mergeUniforms([ + UniformsLib.sprite, + UniformsLib.fog + ]), + vertexShader: ShaderChunk.sprite_vert, + fragmentShader: ShaderChunk.sprite_frag + }, + background: { + uniforms: { + uvTransform: { value: new Matrix3() }, + t2D: { value: null }, + backgroundIntensity: { value: 1 } + }, + vertexShader: ShaderChunk.background_vert, + fragmentShader: ShaderChunk.background_frag + }, + backgroundCube: { + uniforms: { + envMap: { value: null }, + flipEnvMap: { value: -1 }, + backgroundBlurriness: { value: 0 }, + backgroundIntensity: { value: 1 }, + backgroundRotation: { value: new Matrix3() } + }, + vertexShader: ShaderChunk.backgroundCube_vert, + fragmentShader: ShaderChunk.backgroundCube_frag + }, + cube: { + uniforms: { + tCube: { value: null }, + tFlip: { value: -1 }, + opacity: { value: 1 } + }, + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + }, + equirect: { + uniforms: { + tEquirect: { value: null } + }, + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + }, + distance: { + uniforms: mergeUniforms([ + UniformsLib.common, + UniformsLib.displacementmap, + { + referencePosition: { value: new Vector3() }, + nearDistance: { value: 1 }, + farDistance: { value: 1e3 } + } + ]), + vertexShader: ShaderChunk.distance_vert, + fragmentShader: ShaderChunk.distance_frag + }, + shadow: { + uniforms: mergeUniforms([ + UniformsLib.lights, + UniformsLib.fog, + { + color: { value: new Color(0) }, + opacity: { value: 1 } + } + ]), + vertexShader: ShaderChunk.shadow_vert, + fragmentShader: ShaderChunk.shadow_frag + } +}; +ShaderLib.physical = { + uniforms: mergeUniforms([ + ShaderLib.standard.uniforms, + { + clearcoat: { value: 0 }, + clearcoatMap: { value: null }, + clearcoatMapTransform: { value: new Matrix3() }, + clearcoatNormalMap: { value: null }, + clearcoatNormalMapTransform: { value: new Matrix3() }, + clearcoatNormalScale: { value: new Vector2(1, 1) }, + clearcoatRoughness: { value: 0 }, + clearcoatRoughnessMap: { value: null }, + clearcoatRoughnessMapTransform: { value: new Matrix3() }, + dispersion: { value: 0 }, + iridescence: { value: 0 }, + iridescenceMap: { value: null }, + iridescenceMapTransform: { value: new Matrix3() }, + iridescenceIOR: { value: 1.3 }, + iridescenceThicknessMinimum: { value: 100 }, + iridescenceThicknessMaximum: { value: 400 }, + iridescenceThicknessMap: { value: null }, + iridescenceThicknessMapTransform: { value: new Matrix3() }, + sheen: { value: 0 }, + sheenColor: { value: new Color(0) }, + sheenColorMap: { value: null }, + sheenColorMapTransform: { value: new Matrix3() }, + sheenRoughness: { value: 1 }, + sheenRoughnessMap: { value: null }, + sheenRoughnessMapTransform: { value: new Matrix3() }, + transmission: { value: 0 }, + transmissionMap: { value: null }, + transmissionMapTransform: { value: new Matrix3() }, + transmissionSamplerSize: { value: new Vector2() }, + transmissionSamplerMap: { value: null }, + thickness: { value: 0 }, + thicknessMap: { value: null }, + thicknessMapTransform: { value: new Matrix3() }, + attenuationDistance: { value: 0 }, + attenuationColor: { value: new Color(0) }, + specularColor: { value: new Color(1, 1, 1) }, + specularColorMap: { value: null }, + specularColorMapTransform: { value: new Matrix3() }, + specularIntensity: { value: 1 }, + specularIntensityMap: { value: null }, + specularIntensityMapTransform: { value: new Matrix3() }, + anisotropyVector: { value: new Vector2() }, + anisotropyMap: { value: null }, + anisotropyMapTransform: { value: new Matrix3() } + } + ]), + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag +}; +var _rgb = { r: 0, b: 0, g: 0 }; +var _e1$1 = new Euler(); +var _m1$12 = new Matrix4(); +function WebGLBackground(renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha) { + const clearColor = new Color(0); + let clearAlpha = alpha === true ? 0 : 1; + let planeMesh; + let boxMesh; + let currentBackground = null; + let currentBackgroundVersion = 0; + let currentTonemapping = null; + function getBackground(scene) { + let background = scene.isScene === true ? scene.background : null; + if (background && background.isTexture) { + const usePMREM = scene.backgroundBlurriness > 0; + background = (usePMREM ? cubeuvmaps : cubemaps).get(background); + } + return background; + } + function render(scene) { + let forceClear = false; + const background = getBackground(scene); + if (background === null) { + setClear(clearColor, clearAlpha); + } else if (background && background.isColor) { + setClear(background, 1); + forceClear = true; + } + const environmentBlendMode = renderer.xr.getEnvironmentBlendMode(); + if (environmentBlendMode === "additive") { + state.buffers.color.setClear(0, 0, 0, 1, premultipliedAlpha); + } else if (environmentBlendMode === "alpha-blend") { + state.buffers.color.setClear(0, 0, 0, 0, premultipliedAlpha); + } + if (renderer.autoClear || forceClear) { + state.buffers.depth.setTest(true); + state.buffers.depth.setMask(true); + state.buffers.color.setMask(true); + renderer.clear(renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil); + } + } + function addToRenderList(renderList, scene) { + const background = getBackground(scene); + if (background && (background.isCubeTexture || background.mapping === CubeUVReflectionMapping)) { + if (boxMesh === void 0) { + boxMesh = new Mesh( + new BoxGeometry(1, 1, 1), + new ShaderMaterial({ + name: "BackgroundCubeMaterial", + uniforms: cloneUniforms(ShaderLib.backgroundCube.uniforms), + vertexShader: ShaderLib.backgroundCube.vertexShader, + fragmentShader: ShaderLib.backgroundCube.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false, + allowOverride: false + }) + ); + boxMesh.geometry.deleteAttribute("normal"); + boxMesh.geometry.deleteAttribute("uv"); + boxMesh.onBeforeRender = function(renderer2, scene2, camera) { + this.matrixWorld.copyPosition(camera.matrixWorld); + }; + Object.defineProperty(boxMesh.material, "envMap", { + get: function() { + return this.uniforms.envMap.value; + } + }); + objects.update(boxMesh); + } + _e1$1.copy(scene.backgroundRotation); + _e1$1.x *= -1; + _e1$1.y *= -1; + _e1$1.z *= -1; + if (background.isCubeTexture && background.isRenderTargetTexture === false) { + _e1$1.y *= -1; + _e1$1.z *= -1; + } + boxMesh.material.uniforms.envMap.value = background; + boxMesh.material.uniforms.flipEnvMap.value = background.isCubeTexture && background.isRenderTargetTexture === false ? -1 : 1; + boxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness; + boxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; + boxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4(_m1$12.makeRotationFromEuler(_e1$1)); + boxMesh.material.toneMapped = ColorManagement.getTransfer(background.colorSpace) !== SRGBTransfer; + if (currentBackground !== background || currentBackgroundVersion !== background.version || currentTonemapping !== renderer.toneMapping) { + boxMesh.material.needsUpdate = true; + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; + } + boxMesh.layers.enableAll(); + renderList.unshift(boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null); + } else if (background && background.isTexture) { + if (planeMesh === void 0) { + planeMesh = new Mesh( + new PlaneGeometry(2, 2), + new ShaderMaterial({ + name: "BackgroundMaterial", + uniforms: cloneUniforms(ShaderLib.background.uniforms), + vertexShader: ShaderLib.background.vertexShader, + fragmentShader: ShaderLib.background.fragmentShader, + side: FrontSide, + depthTest: false, + depthWrite: false, + fog: false, + allowOverride: false + }) + ); + planeMesh.geometry.deleteAttribute("normal"); + Object.defineProperty(planeMesh.material, "map", { + get: function() { + return this.uniforms.t2D.value; + } + }); + objects.update(planeMesh); + } + planeMesh.material.uniforms.t2D.value = background; + planeMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity; + planeMesh.material.toneMapped = ColorManagement.getTransfer(background.colorSpace) !== SRGBTransfer; + if (background.matrixAutoUpdate === true) { + background.updateMatrix(); + } + planeMesh.material.uniforms.uvTransform.value.copy(background.matrix); + if (currentBackground !== background || currentBackgroundVersion !== background.version || currentTonemapping !== renderer.toneMapping) { + planeMesh.material.needsUpdate = true; + currentBackground = background; + currentBackgroundVersion = background.version; + currentTonemapping = renderer.toneMapping; + } + planeMesh.layers.enableAll(); + renderList.unshift(planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null); + } + } + function setClear(color, alpha2) { + color.getRGB(_rgb, getUnlitUniformColorSpace(renderer)); + state.buffers.color.setClear(_rgb.r, _rgb.g, _rgb.b, alpha2, premultipliedAlpha); + } + function dispose() { + if (boxMesh !== void 0) { + boxMesh.geometry.dispose(); + boxMesh.material.dispose(); + boxMesh = void 0; + } + if (planeMesh !== void 0) { + planeMesh.geometry.dispose(); + planeMesh.material.dispose(); + planeMesh = void 0; + } + } + return { + getClearColor: function() { + return clearColor; + }, + setClearColor: function(color, alpha2 = 1) { + clearColor.set(color); + clearAlpha = alpha2; + setClear(clearColor, clearAlpha); + }, + getClearAlpha: function() { + return clearAlpha; + }, + setClearAlpha: function(alpha2) { + clearAlpha = alpha2; + setClear(clearColor, clearAlpha); + }, + render, + addToRenderList, + dispose + }; +} +function WebGLBindingStates(gl, attributes) { + const maxVertexAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); + const bindingStates = {}; + const defaultState = createBindingState(null); + let currentState = defaultState; + let forceUpdate = false; + function setup(object, material, program, geometry, index) { + let updateBuffers = false; + const state = getBindingState(geometry, program, material); + if (currentState !== state) { + currentState = state; + bindVertexArrayObject(currentState.object); + } + updateBuffers = needsUpdate(object, geometry, program, index); + if (updateBuffers) saveCache(object, geometry, program, index); + if (index !== null) { + attributes.update(index, gl.ELEMENT_ARRAY_BUFFER); + } + if (updateBuffers || forceUpdate) { + forceUpdate = false; + setupVertexAttributes(object, material, program, geometry); + if (index !== null) { + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, attributes.get(index).buffer); + } + } + } + function createVertexArrayObject() { + return gl.createVertexArray(); + } + function bindVertexArrayObject(vao) { + return gl.bindVertexArray(vao); + } + function deleteVertexArrayObject(vao) { + return gl.deleteVertexArray(vao); + } + function getBindingState(geometry, program, material) { + const wireframe = material.wireframe === true; + let programMap = bindingStates[geometry.id]; + if (programMap === void 0) { + programMap = {}; + bindingStates[geometry.id] = programMap; + } + let stateMap = programMap[program.id]; + if (stateMap === void 0) { + stateMap = {}; + programMap[program.id] = stateMap; + } + let state = stateMap[wireframe]; + if (state === void 0) { + state = createBindingState(createVertexArrayObject()); + stateMap[wireframe] = state; + } + return state; + } + function createBindingState(vao) { + const newAttributes = []; + const enabledAttributes = []; + const attributeDivisors = []; + for (let i = 0; i < maxVertexAttributes; i++) { + newAttributes[i] = 0; + enabledAttributes[i] = 0; + attributeDivisors[i] = 0; + } + return { + // for backward compatibility on non-VAO support browser + geometry: null, + program: null, + wireframe: false, + newAttributes, + enabledAttributes, + attributeDivisors, + object: vao, + attributes: {}, + index: null + }; + } + function needsUpdate(object, geometry, program, index) { + const cachedAttributes = currentState.attributes; + const geometryAttributes = geometry.attributes; + let attributesNum = 0; + const programAttributes = program.getAttributes(); + for (const name in programAttributes) { + const programAttribute = programAttributes[name]; + if (programAttribute.location >= 0) { + const cachedAttribute = cachedAttributes[name]; + let geometryAttribute = geometryAttributes[name]; + if (geometryAttribute === void 0) { + if (name === "instanceMatrix" && object.instanceMatrix) geometryAttribute = object.instanceMatrix; + if (name === "instanceColor" && object.instanceColor) geometryAttribute = object.instanceColor; + } + if (cachedAttribute === void 0) return true; + if (cachedAttribute.attribute !== geometryAttribute) return true; + if (geometryAttribute && cachedAttribute.data !== geometryAttribute.data) return true; + attributesNum++; + } + } + if (currentState.attributesNum !== attributesNum) return true; + if (currentState.index !== index) return true; + return false; + } + function saveCache(object, geometry, program, index) { + const cache = {}; + const attributes2 = geometry.attributes; + let attributesNum = 0; + const programAttributes = program.getAttributes(); + for (const name in programAttributes) { + const programAttribute = programAttributes[name]; + if (programAttribute.location >= 0) { + let attribute = attributes2[name]; + if (attribute === void 0) { + if (name === "instanceMatrix" && object.instanceMatrix) attribute = object.instanceMatrix; + if (name === "instanceColor" && object.instanceColor) attribute = object.instanceColor; + } + const data = {}; + data.attribute = attribute; + if (attribute && attribute.data) { + data.data = attribute.data; + } + cache[name] = data; + attributesNum++; + } + } + currentState.attributes = cache; + currentState.attributesNum = attributesNum; + currentState.index = index; + } + function initAttributes() { + const newAttributes = currentState.newAttributes; + for (let i = 0, il = newAttributes.length; i < il; i++) { + newAttributes[i] = 0; + } + } + function enableAttribute(attribute) { + enableAttributeAndDivisor(attribute, 0); + } + function enableAttributeAndDivisor(attribute, meshPerAttribute) { + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + const attributeDivisors = currentState.attributeDivisors; + newAttributes[attribute] = 1; + if (enabledAttributes[attribute] === 0) { + gl.enableVertexAttribArray(attribute); + enabledAttributes[attribute] = 1; + } + if (attributeDivisors[attribute] !== meshPerAttribute) { + gl.vertexAttribDivisor(attribute, meshPerAttribute); + attributeDivisors[attribute] = meshPerAttribute; + } + } + function disableUnusedAttributes() { + const newAttributes = currentState.newAttributes; + const enabledAttributes = currentState.enabledAttributes; + for (let i = 0, il = enabledAttributes.length; i < il; i++) { + if (enabledAttributes[i] !== newAttributes[i]) { + gl.disableVertexAttribArray(i); + enabledAttributes[i] = 0; + } + } + } + function vertexAttribPointer(index, size, type, normalized, stride, offset, integer) { + if (integer === true) { + gl.vertexAttribIPointer(index, size, type, stride, offset); + } else { + gl.vertexAttribPointer(index, size, type, normalized, stride, offset); + } + } + function setupVertexAttributes(object, material, program, geometry) { + initAttributes(); + const geometryAttributes = geometry.attributes; + const programAttributes = program.getAttributes(); + const materialDefaultAttributeValues = material.defaultAttributeValues; + for (const name in programAttributes) { + const programAttribute = programAttributes[name]; + if (programAttribute.location >= 0) { + let geometryAttribute = geometryAttributes[name]; + if (geometryAttribute === void 0) { + if (name === "instanceMatrix" && object.instanceMatrix) geometryAttribute = object.instanceMatrix; + if (name === "instanceColor" && object.instanceColor) geometryAttribute = object.instanceColor; + } + if (geometryAttribute !== void 0) { + const normalized = geometryAttribute.normalized; + const size = geometryAttribute.itemSize; + const attribute = attributes.get(geometryAttribute); + if (attribute === void 0) continue; + const buffer = attribute.buffer; + const type = attribute.type; + const bytesPerElement = attribute.bytesPerElement; + const integer = type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType; + if (geometryAttribute.isInterleavedBufferAttribute) { + const data = geometryAttribute.data; + const stride = data.stride; + const offset = geometryAttribute.offset; + if (data.isInstancedInterleavedBuffer) { + for (let i = 0; i < programAttribute.locationSize; i++) { + enableAttributeAndDivisor(programAttribute.location + i, data.meshPerAttribute); + } + if (object.isInstancedMesh !== true && geometry._maxInstanceCount === void 0) { + geometry._maxInstanceCount = data.meshPerAttribute * data.count; + } + } else { + for (let i = 0; i < programAttribute.locationSize; i++) { + enableAttribute(programAttribute.location + i); + } + } + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + for (let i = 0; i < programAttribute.locationSize; i++) { + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + stride * bytesPerElement, + (offset + size / programAttribute.locationSize * i) * bytesPerElement, + integer + ); + } + } else { + if (geometryAttribute.isInstancedBufferAttribute) { + for (let i = 0; i < programAttribute.locationSize; i++) { + enableAttributeAndDivisor(programAttribute.location + i, geometryAttribute.meshPerAttribute); + } + if (object.isInstancedMesh !== true && geometry._maxInstanceCount === void 0) { + geometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + } + } else { + for (let i = 0; i < programAttribute.locationSize; i++) { + enableAttribute(programAttribute.location + i); + } + } + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + for (let i = 0; i < programAttribute.locationSize; i++) { + vertexAttribPointer( + programAttribute.location + i, + size / programAttribute.locationSize, + type, + normalized, + size * bytesPerElement, + size / programAttribute.locationSize * i * bytesPerElement, + integer + ); + } + } + } else if (materialDefaultAttributeValues !== void 0) { + const value = materialDefaultAttributeValues[name]; + if (value !== void 0) { + switch (value.length) { + case 2: + gl.vertexAttrib2fv(programAttribute.location, value); + break; + case 3: + gl.vertexAttrib3fv(programAttribute.location, value); + break; + case 4: + gl.vertexAttrib4fv(programAttribute.location, value); + break; + default: + gl.vertexAttrib1fv(programAttribute.location, value); + } + } + } + } + } + disableUnusedAttributes(); + } + function dispose() { + reset(); + for (const geometryId in bindingStates) { + const programMap = bindingStates[geometryId]; + for (const programId in programMap) { + const stateMap = programMap[programId]; + for (const wireframe in stateMap) { + deleteVertexArrayObject(stateMap[wireframe].object); + delete stateMap[wireframe]; + } + delete programMap[programId]; + } + delete bindingStates[geometryId]; + } + } + function releaseStatesOfGeometry(geometry) { + if (bindingStates[geometry.id] === void 0) return; + const programMap = bindingStates[geometry.id]; + for (const programId in programMap) { + const stateMap = programMap[programId]; + for (const wireframe in stateMap) { + deleteVertexArrayObject(stateMap[wireframe].object); + delete stateMap[wireframe]; + } + delete programMap[programId]; + } + delete bindingStates[geometry.id]; + } + function releaseStatesOfProgram(program) { + for (const geometryId in bindingStates) { + const programMap = bindingStates[geometryId]; + if (programMap[program.id] === void 0) continue; + const stateMap = programMap[program.id]; + for (const wireframe in stateMap) { + deleteVertexArrayObject(stateMap[wireframe].object); + delete stateMap[wireframe]; + } + delete programMap[program.id]; + } + } + function reset() { + resetDefaultState(); + forceUpdate = true; + if (currentState === defaultState) return; + currentState = defaultState; + bindVertexArrayObject(currentState.object); + } + function resetDefaultState() { + defaultState.geometry = null; + defaultState.program = null; + defaultState.wireframe = false; + } + return { + setup, + reset, + resetDefaultState, + dispose, + releaseStatesOfGeometry, + releaseStatesOfProgram, + initAttributes, + enableAttribute, + disableUnusedAttributes + }; +} +function WebGLBufferRenderer(gl, extensions, info) { + let mode; + function setMode(value) { + mode = value; + } + function render(start, count) { + gl.drawArrays(mode, start, count); + info.update(count, mode, 1); + } + function renderInstances(start, count, primcount) { + if (primcount === 0) return; + gl.drawArraysInstanced(mode, start, count, primcount); + info.update(count, mode, primcount); + } + function renderMultiDraw(starts, counts, drawCount) { + if (drawCount === 0) return; + const extension = extensions.get("WEBGL_multi_draw"); + extension.multiDrawArraysWEBGL(mode, starts, 0, counts, 0, drawCount); + let elementCount = 0; + for (let i = 0; i < drawCount; i++) { + elementCount += counts[i]; + } + info.update(elementCount, mode, 1); + } + function renderMultiDrawInstances(starts, counts, drawCount, primcount) { + if (drawCount === 0) return; + const extension = extensions.get("WEBGL_multi_draw"); + if (extension === null) { + for (let i = 0; i < starts.length; i++) { + renderInstances(starts[i], counts[i], primcount[i]); + } + } else { + extension.multiDrawArraysInstancedWEBGL(mode, starts, 0, counts, 0, primcount, 0, drawCount); + let elementCount = 0; + for (let i = 0; i < drawCount; i++) { + elementCount += counts[i] * primcount[i]; + } + info.update(elementCount, mode, 1); + } + } + this.setMode = setMode; + this.render = render; + this.renderInstances = renderInstances; + this.renderMultiDraw = renderMultiDraw; + this.renderMultiDrawInstances = renderMultiDrawInstances; +} +function WebGLCapabilities(gl, extensions, parameters, utils) { + let maxAnisotropy; + function getMaxAnisotropy() { + if (maxAnisotropy !== void 0) return maxAnisotropy; + if (extensions.has("EXT_texture_filter_anisotropic") === true) { + const extension = extensions.get("EXT_texture_filter_anisotropic"); + maxAnisotropy = gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT); + } else { + maxAnisotropy = 0; + } + return maxAnisotropy; + } + function textureFormatReadable(textureFormat) { + if (textureFormat !== RGBAFormat && utils.convert(textureFormat) !== gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT)) { + return false; + } + return true; + } + function textureTypeReadable(textureType) { + const halfFloatSupportedByExt = textureType === HalfFloatType && (extensions.has("EXT_color_buffer_half_float") || extensions.has("EXT_color_buffer_float")); + if (textureType !== UnsignedByteType && utils.convert(textureType) !== gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_TYPE) && // Edge and Chrome Mac < 52 (#9513) + textureType !== FloatType && !halfFloatSupportedByExt) { + return false; + } + return true; + } + function getMaxPrecision(precision2) { + if (precision2 === "highp") { + if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision > 0) { + return "highp"; + } + precision2 = "mediump"; + } + if (precision2 === "mediump") { + if (gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision > 0 && gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision > 0) { + return "mediump"; + } + } + return "lowp"; + } + let precision = parameters.precision !== void 0 ? parameters.precision : "highp"; + const maxPrecision = getMaxPrecision(precision); + if (maxPrecision !== precision) { + warn("WebGLRenderer:", precision, "not supported, using", maxPrecision, "instead."); + precision = maxPrecision; + } + const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true; + const reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has("EXT_clip_control"); + const maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); + const maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS); + const maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + const maxCubemapSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE); + const maxAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); + const maxVertexUniforms = gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS); + const maxVaryings = gl.getParameter(gl.MAX_VARYING_VECTORS); + const maxFragmentUniforms = gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS); + const maxSamples = gl.getParameter(gl.MAX_SAMPLES); + const samples = gl.getParameter(gl.SAMPLES); + return { + isWebGL2: true, + // keeping this for backwards compatibility + getMaxAnisotropy, + getMaxPrecision, + textureFormatReadable, + textureTypeReadable, + precision, + logarithmicDepthBuffer, + reversedDepthBuffer, + maxTextures, + maxVertexTextures, + maxTextureSize, + maxCubemapSize, + maxAttributes, + maxVertexUniforms, + maxVaryings, + maxFragmentUniforms, + maxSamples, + samples + }; +} +function WebGLClipping(properties) { + const scope = this; + let globalState = null, numGlobalPlanes = 0, localClippingEnabled = false, renderingShadows = false; + const plane = new Plane(), viewNormalMatrix = new Matrix3(), uniform = { value: null, needsUpdate: false }; + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + this.init = function(planes, enableLocalClipping) { + const enabled = planes.length !== 0 || enableLocalClipping || // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || localClippingEnabled; + localClippingEnabled = enableLocalClipping; + numGlobalPlanes = planes.length; + return enabled; + }; + this.beginShadows = function() { + renderingShadows = true; + projectPlanes(null); + }; + this.endShadows = function() { + renderingShadows = false; + }; + this.setGlobalState = function(planes, camera) { + globalState = projectPlanes(planes, camera, 0); + }; + this.setState = function(material, camera, useCache) { + const planes = material.clippingPlanes, clipIntersection = material.clipIntersection, clipShadows = material.clipShadows; + const materialProperties = properties.get(material); + if (!localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && !clipShadows) { + if (renderingShadows) { + projectPlanes(null); + } else { + resetGlobalState(); + } + } else { + const nGlobal = renderingShadows ? 0 : numGlobalPlanes, lGlobal = nGlobal * 4; + let dstArray = materialProperties.clippingState || null; + uniform.value = dstArray; + dstArray = projectPlanes(planes, camera, lGlobal, useCache); + for (let i = 0; i !== lGlobal; ++i) { + dstArray[i] = globalState[i]; + } + materialProperties.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + } + }; + function resetGlobalState() { + if (uniform.value !== globalState) { + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + } + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + } + function projectPlanes(planes, camera, dstOffset, skipTransform) { + const nPlanes = planes !== null ? planes.length : 0; + let dstArray = null; + if (nPlanes !== 0) { + dstArray = uniform.value; + if (skipTransform !== true || dstArray === null) { + const flatSize = dstOffset + nPlanes * 4, viewMatrix = camera.matrixWorldInverse; + viewNormalMatrix.getNormalMatrix(viewMatrix); + if (dstArray === null || dstArray.length < flatSize) { + dstArray = new Float32Array(flatSize); + } + for (let i = 0, i4 = dstOffset; i !== nPlanes; ++i, i4 += 4) { + plane.copy(planes[i]).applyMatrix4(viewMatrix, viewNormalMatrix); + plane.normal.toArray(dstArray, i4); + dstArray[i4 + 3] = plane.constant; + } + } + uniform.value = dstArray; + uniform.needsUpdate = true; + } + scope.numPlanes = nPlanes; + scope.numIntersection = 0; + return dstArray; + } +} +function WebGLCubeMaps(renderer) { + let cubemaps = /* @__PURE__ */ new WeakMap(); + function mapTextureMapping(texture, mapping) { + if (mapping === EquirectangularReflectionMapping) { + texture.mapping = CubeReflectionMapping; + } else if (mapping === EquirectangularRefractionMapping) { + texture.mapping = CubeRefractionMapping; + } + return texture; + } + function get(texture) { + if (texture && texture.isTexture) { + const mapping = texture.mapping; + if (mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping) { + if (cubemaps.has(texture)) { + const cubemap = cubemaps.get(texture).texture; + return mapTextureMapping(cubemap, texture.mapping); + } else { + const image = texture.image; + if (image && image.height > 0) { + const renderTarget = new WebGLCubeRenderTarget(image.height); + renderTarget.fromEquirectangularTexture(renderer, texture); + cubemaps.set(texture, renderTarget); + texture.addEventListener("dispose", onTextureDispose); + return mapTextureMapping(renderTarget.texture, texture.mapping); + } else { + return null; + } + } + } + } + return texture; + } + function onTextureDispose(event) { + const texture = event.target; + texture.removeEventListener("dispose", onTextureDispose); + const cubemap = cubemaps.get(texture); + if (cubemap !== void 0) { + cubemaps.delete(texture); + cubemap.dispose(); + } + } + function dispose() { + cubemaps = /* @__PURE__ */ new WeakMap(); + } + return { + get, + dispose + }; +} +var LOD_MIN = 4; +var EXTRA_LOD_SIGMA = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582]; +var MAX_SAMPLES = 20; +var GGX_SAMPLES = 256; +var _flatCamera = new OrthographicCamera(); +var _clearColor = new Color(); +var _oldTarget = null; +var _oldActiveCubeFace = 0; +var _oldActiveMipmapLevel = 0; +var _oldXrEnabled = false; +var _origin = new Vector3(); +var PMREMGenerator = class { + /** + * Constructs a new PMREM generator. + * + * @param {WebGLRenderer} renderer - The renderer. + */ + constructor(renderer) { + this._renderer = renderer; + this._pingPongRenderTarget = null; + this._lodMax = 0; + this._cubeSize = 0; + this._sizeLods = []; + this._sigmas = []; + this._lodMeshes = []; + this._backgroundBox = null; + this._cubemapMaterial = null; + this._equirectMaterial = null; + this._blurMaterial = null; + this._ggxMaterial = null; + } + /** + * Generates a PMREM from a supplied Scene, which can be faster than using an + * image if networking bandwidth is low. Optional sigma specifies a blur radius + * in radians to be applied to the scene before PMREM generation. Optional near + * and far planes ensure the scene is rendered in its entirety. + * + * @param {Scene} scene - The scene to be captured. + * @param {number} [sigma=0] - The blur radius in radians. + * @param {number} [near=0.1] - The near plane distance. + * @param {number} [far=100] - The far plane distance. + * @param {Object} [options={}] - The configuration options. + * @param {number} [options.size=256] - The texture size of the PMREM. + * @param {Vector3} [options.position=origin] - The position of the internal cube camera that renders the scene. + * @return {WebGLRenderTarget} The resulting PMREM. + */ + fromScene(scene, sigma = 0, near = 0.1, far = 100, options = {}) { + const { + size = 256, + position = _origin + } = options; + _oldTarget = this._renderer.getRenderTarget(); + _oldActiveCubeFace = this._renderer.getActiveCubeFace(); + _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); + _oldXrEnabled = this._renderer.xr.enabled; + this._renderer.xr.enabled = false; + this._setSize(size); + const cubeUVRenderTarget = this._allocateTargets(); + cubeUVRenderTarget.depthBuffer = true; + this._sceneToCubeUV(scene, near, far, cubeUVRenderTarget, position); + if (sigma > 0) { + this._blur(cubeUVRenderTarget, 0, 0, sigma); + } + this._applyPMREM(cubeUVRenderTarget); + this._cleanup(cubeUVRenderTarget); + return cubeUVRenderTarget; + } + /** + * Generates a PMREM from an equirectangular texture, which can be either LDR + * or HDR. The ideal input image size is 1k (1024 x 512), + * as this matches best with the 256 x 256 cubemap output. + * + * @param {Texture} equirectangular - The equirectangular texture to be converted. + * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use. + * @return {WebGLRenderTarget} The resulting PMREM. + */ + fromEquirectangular(equirectangular, renderTarget = null) { + return this._fromTexture(equirectangular, renderTarget); + } + /** + * Generates a PMREM from an cubemap texture, which can be either LDR + * or HDR. The ideal input cube size is 256 x 256, + * as this matches best with the 256 x 256 cubemap output. + * + * @param {Texture} cubemap - The cubemap texture to be converted. + * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use. + * @return {WebGLRenderTarget} The resulting PMREM. + */ + fromCubemap(cubemap, renderTarget = null) { + return this._fromTexture(cubemap, renderTarget); + } + /** + * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileCubemapShader() { + if (this._cubemapMaterial === null) { + this._cubemapMaterial = _getCubemapMaterial(); + this._compileMaterial(this._cubemapMaterial); + } + } + /** + * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during + * your texture's network fetch for increased concurrency. + */ + compileEquirectangularShader() { + if (this._equirectMaterial === null) { + this._equirectMaterial = _getEquirectMaterial(); + this._compileMaterial(this._equirectMaterial); + } + } + /** + * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class, + * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on + * one of them will cause any others to also become unusable. + */ + dispose() { + this._dispose(); + if (this._cubemapMaterial !== null) this._cubemapMaterial.dispose(); + if (this._equirectMaterial !== null) this._equirectMaterial.dispose(); + if (this._backgroundBox !== null) { + this._backgroundBox.geometry.dispose(); + this._backgroundBox.material.dispose(); + } + } + // private interface + _setSize(cubeSize) { + this._lodMax = Math.floor(Math.log2(cubeSize)); + this._cubeSize = Math.pow(2, this._lodMax); + } + _dispose() { + if (this._blurMaterial !== null) this._blurMaterial.dispose(); + if (this._ggxMaterial !== null) this._ggxMaterial.dispose(); + if (this._pingPongRenderTarget !== null) this._pingPongRenderTarget.dispose(); + for (let i = 0; i < this._lodMeshes.length; i++) { + this._lodMeshes[i].geometry.dispose(); + } + } + _cleanup(outputTarget) { + this._renderer.setRenderTarget(_oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel); + this._renderer.xr.enabled = _oldXrEnabled; + outputTarget.scissorTest = false; + _setViewport(outputTarget, 0, 0, outputTarget.width, outputTarget.height); + } + _fromTexture(texture, renderTarget) { + if (texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping) { + this._setSize(texture.image.length === 0 ? 16 : texture.image[0].width || texture.image[0].image.width); + } else { + this._setSize(texture.image.width / 4); + } + _oldTarget = this._renderer.getRenderTarget(); + _oldActiveCubeFace = this._renderer.getActiveCubeFace(); + _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel(); + _oldXrEnabled = this._renderer.xr.enabled; + this._renderer.xr.enabled = false; + const cubeUVRenderTarget = renderTarget || this._allocateTargets(); + this._textureToCubeUV(texture, cubeUVRenderTarget); + this._applyPMREM(cubeUVRenderTarget); + this._cleanup(cubeUVRenderTarget); + return cubeUVRenderTarget; + } + _allocateTargets() { + const width = 3 * Math.max(this._cubeSize, 16 * 7); + const height = 4 * this._cubeSize; + const params = { + magFilter: LinearFilter, + minFilter: LinearFilter, + generateMipmaps: false, + type: HalfFloatType, + format: RGBAFormat, + colorSpace: LinearSRGBColorSpace, + depthBuffer: false + }; + const cubeUVRenderTarget = _createRenderTarget(width, height, params); + if (this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height) { + if (this._pingPongRenderTarget !== null) { + this._dispose(); + } + this._pingPongRenderTarget = _createRenderTarget(width, height, params); + const { _lodMax } = this; + ({ lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes(_lodMax)); + this._blurMaterial = _getBlurShader(_lodMax, width, height); + this._ggxMaterial = _getGGXShader(_lodMax, width, height); + } + return cubeUVRenderTarget; + } + _compileMaterial(material) { + const mesh = new Mesh(new BufferGeometry(), material); + this._renderer.compile(mesh, _flatCamera); + } + _sceneToCubeUV(scene, near, far, cubeUVRenderTarget, position) { + const fov2 = 90; + const aspect2 = 1; + const cubeCamera = new PerspectiveCamera(fov2, aspect2, near, far); + const upSign = [1, -1, 1, 1, 1, 1]; + const forwardSign = [1, 1, 1, -1, -1, -1]; + const renderer = this._renderer; + const originalAutoClear = renderer.autoClear; + const toneMapping = renderer.toneMapping; + renderer.getClearColor(_clearColor); + renderer.toneMapping = NoToneMapping; + renderer.autoClear = false; + const reversedDepthBuffer = renderer.state.buffers.depth.getReversed(); + if (reversedDepthBuffer) { + renderer.setRenderTarget(cubeUVRenderTarget); + renderer.clearDepth(); + renderer.setRenderTarget(null); + } + if (this._backgroundBox === null) { + this._backgroundBox = new Mesh( + new BoxGeometry(), + new MeshBasicMaterial({ + name: "PMREM.Background", + side: BackSide, + depthWrite: false, + depthTest: false + }) + ); + } + const backgroundBox = this._backgroundBox; + const backgroundMaterial = backgroundBox.material; + let useSolidColor = false; + const background = scene.background; + if (background) { + if (background.isColor) { + backgroundMaterial.color.copy(background); + scene.background = null; + useSolidColor = true; + } + } else { + backgroundMaterial.color.copy(_clearColor); + useSolidColor = true; + } + for (let i = 0; i < 6; i++) { + const col = i % 3; + if (col === 0) { + cubeCamera.up.set(0, upSign[i], 0); + cubeCamera.position.set(position.x, position.y, position.z); + cubeCamera.lookAt(position.x + forwardSign[i], position.y, position.z); + } else if (col === 1) { + cubeCamera.up.set(0, 0, upSign[i]); + cubeCamera.position.set(position.x, position.y, position.z); + cubeCamera.lookAt(position.x, position.y + forwardSign[i], position.z); + } else { + cubeCamera.up.set(0, upSign[i], 0); + cubeCamera.position.set(position.x, position.y, position.z); + cubeCamera.lookAt(position.x, position.y, position.z + forwardSign[i]); + } + const size = this._cubeSize; + _setViewport(cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size); + renderer.setRenderTarget(cubeUVRenderTarget); + if (useSolidColor) { + renderer.render(backgroundBox, cubeCamera); + } + renderer.render(scene, cubeCamera); + } + renderer.toneMapping = toneMapping; + renderer.autoClear = originalAutoClear; + scene.background = background; + } + _textureToCubeUV(texture, cubeUVRenderTarget) { + const renderer = this._renderer; + const isCubeTexture = texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping; + if (isCubeTexture) { + if (this._cubemapMaterial === null) { + this._cubemapMaterial = _getCubemapMaterial(); + } + this._cubemapMaterial.uniforms.flipEnvMap.value = texture.isRenderTargetTexture === false ? -1 : 1; + } else { + if (this._equirectMaterial === null) { + this._equirectMaterial = _getEquirectMaterial(); + } + } + const material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial; + const mesh = this._lodMeshes[0]; + mesh.material = material; + const uniforms = material.uniforms; + uniforms["envMap"].value = texture; + const size = this._cubeSize; + _setViewport(cubeUVRenderTarget, 0, 0, 3 * size, 2 * size); + renderer.setRenderTarget(cubeUVRenderTarget); + renderer.render(mesh, _flatCamera); + } + _applyPMREM(cubeUVRenderTarget) { + const renderer = this._renderer; + const autoClear = renderer.autoClear; + renderer.autoClear = false; + const n = this._lodMeshes.length; + for (let i = 1; i < n; i++) { + this._applyGGXFilter(cubeUVRenderTarget, i - 1, i); + } + renderer.autoClear = autoClear; + } + /** + * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map. + * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the + * GGX BRDF for physically-based rendering. Reads from the previous LOD level and + * applies incremental roughness filtering to avoid over-blurring. + * + * @private + * @param {WebGLRenderTarget} cubeUVRenderTarget + * @param {number} lodIn - Source LOD level to read from + * @param {number} lodOut - Target LOD level to write to + */ + _applyGGXFilter(cubeUVRenderTarget, lodIn, lodOut) { + const renderer = this._renderer; + const pingPongRenderTarget = this._pingPongRenderTarget; + const ggxMaterial = this._ggxMaterial; + const ggxMesh = this._lodMeshes[lodOut]; + ggxMesh.material = ggxMaterial; + const ggxUniforms = ggxMaterial.uniforms; + const targetRoughness = lodOut / (this._lodMeshes.length - 1); + const sourceRoughness = lodIn / (this._lodMeshes.length - 1); + const incrementalRoughness = Math.sqrt(targetRoughness * targetRoughness - sourceRoughness * sourceRoughness); + const blurStrength = 0 + targetRoughness * 1.25; + const adjustedRoughness = incrementalRoughness * blurStrength; + const { _lodMax } = this; + const outputSize = this._sizeLods[lodOut]; + const x = 3 * outputSize * (lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0); + const y = 4 * (this._cubeSize - outputSize); + ggxUniforms["envMap"].value = cubeUVRenderTarget.texture; + ggxUniforms["roughness"].value = adjustedRoughness; + ggxUniforms["mipInt"].value = _lodMax - lodIn; + _setViewport(pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize); + renderer.setRenderTarget(pingPongRenderTarget); + renderer.render(ggxMesh, _flatCamera); + ggxUniforms["envMap"].value = pingPongRenderTarget.texture; + ggxUniforms["roughness"].value = 0; + ggxUniforms["mipInt"].value = _lodMax - lodOut; + _setViewport(cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize); + renderer.setRenderTarget(cubeUVRenderTarget); + renderer.render(ggxMesh, _flatCamera); + } + /** + * This is a two-pass Gaussian blur for a cubemap. Normally this is done + * vertically and horizontally, but this breaks down on a cube. Here we apply + * the blur latitudinally (around the poles), and then longitudinally (towards + * the poles) to approximate the orthogonally-separable blur. It is least + * accurate at the poles, but still does a decent job. + * + * Used for initial scene blur in fromScene() method when sigma > 0. + * + * @private + * @param {WebGLRenderTarget} cubeUVRenderTarget + * @param {number} lodIn + * @param {number} lodOut + * @param {number} sigma + * @param {Vector3} [poleAxis] + */ + _blur(cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis) { + const pingPongRenderTarget = this._pingPongRenderTarget; + this._halfBlur( + cubeUVRenderTarget, + pingPongRenderTarget, + lodIn, + lodOut, + sigma, + "latitudinal", + poleAxis + ); + this._halfBlur( + pingPongRenderTarget, + cubeUVRenderTarget, + lodOut, + lodOut, + sigma, + "longitudinal", + poleAxis + ); + } + _halfBlur(targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis) { + const renderer = this._renderer; + const blurMaterial = this._blurMaterial; + if (direction !== "latitudinal" && direction !== "longitudinal") { + error( + "blur direction must be either latitudinal or longitudinal!" + ); + } + const STANDARD_DEVIATIONS = 3; + const blurMesh = this._lodMeshes[lodOut]; + blurMesh.material = blurMaterial; + const blurUniforms = blurMaterial.uniforms; + const pixels = this._sizeLods[lodIn] - 1; + const radiansPerPixel = isFinite(sigmaRadians) ? Math.PI / (2 * pixels) : 2 * Math.PI / (2 * MAX_SAMPLES - 1); + const sigmaPixels = sigmaRadians / radiansPerPixel; + const samples = isFinite(sigmaRadians) ? 1 + Math.floor(STANDARD_DEVIATIONS * sigmaPixels) : MAX_SAMPLES; + if (samples > MAX_SAMPLES) { + warn(`sigmaRadians, ${sigmaRadians}, is too large and will clip, as it requested ${samples} samples when the maximum is set to ${MAX_SAMPLES}`); + } + const weights = []; + let sum = 0; + for (let i = 0; i < MAX_SAMPLES; ++i) { + const x2 = i / sigmaPixels; + const weight = Math.exp(-x2 * x2 / 2); + weights.push(weight); + if (i === 0) { + sum += weight; + } else if (i < samples) { + sum += 2 * weight; + } + } + for (let i = 0; i < weights.length; i++) { + weights[i] = weights[i] / sum; + } + blurUniforms["envMap"].value = targetIn.texture; + blurUniforms["samples"].value = samples; + blurUniforms["weights"].value = weights; + blurUniforms["latitudinal"].value = direction === "latitudinal"; + if (poleAxis) { + blurUniforms["poleAxis"].value = poleAxis; + } + const { _lodMax } = this; + blurUniforms["dTheta"].value = radiansPerPixel; + blurUniforms["mipInt"].value = _lodMax - lodIn; + const outputSize = this._sizeLods[lodOut]; + const x = 3 * outputSize * (lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0); + const y = 4 * (this._cubeSize - outputSize); + _setViewport(targetOut, x, y, 3 * outputSize, 2 * outputSize); + renderer.setRenderTarget(targetOut); + renderer.render(blurMesh, _flatCamera); + } +}; +function _createPlanes(lodMax) { + const sizeLods = []; + const sigmas = []; + const lodMeshes = []; + let lod = lodMax; + const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length; + for (let i = 0; i < totalLods; i++) { + const sizeLod = Math.pow(2, lod); + sizeLods.push(sizeLod); + let sigma = 1 / sizeLod; + if (i > lodMax - LOD_MIN) { + sigma = EXTRA_LOD_SIGMA[i - lodMax + LOD_MIN - 1]; + } else if (i === 0) { + sigma = 0; + } + sigmas.push(sigma); + const texelSize = 1 / (sizeLod - 2); + const min = -texelSize; + const max = 1 + texelSize; + const uv1 = [min, min, max, min, max, max, min, min, max, max, min, max]; + const cubeFaces = 6; + const vertices = 6; + const positionSize = 3; + const uvSize = 2; + const faceIndexSize = 1; + const position = new Float32Array(positionSize * vertices * cubeFaces); + const uv = new Float32Array(uvSize * vertices * cubeFaces); + const faceIndex = new Float32Array(faceIndexSize * vertices * cubeFaces); + for (let face = 0; face < cubeFaces; face++) { + const x = face % 3 * 2 / 3 - 1; + const y = face > 2 ? 0 : -1; + const coordinates = [ + x, + y, + 0, + x + 2 / 3, + y, + 0, + x + 2 / 3, + y + 1, + 0, + x, + y, + 0, + x + 2 / 3, + y + 1, + 0, + x, + y + 1, + 0 + ]; + position.set(coordinates, positionSize * vertices * face); + uv.set(uv1, uvSize * vertices * face); + const fill2 = [face, face, face, face, face, face]; + faceIndex.set(fill2, faceIndexSize * vertices * face); + } + const planes = new BufferGeometry(); + planes.setAttribute("position", new BufferAttribute(position, positionSize)); + planes.setAttribute("uv", new BufferAttribute(uv, uvSize)); + planes.setAttribute("faceIndex", new BufferAttribute(faceIndex, faceIndexSize)); + lodMeshes.push(new Mesh(planes, null)); + if (lod > LOD_MIN) { + lod--; + } + } + return { lodMeshes, sizeLods, sigmas }; +} +function _createRenderTarget(width, height, params) { + const cubeUVRenderTarget = new WebGLRenderTarget(width, height, params); + cubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping; + cubeUVRenderTarget.texture.name = "PMREM.cubeUv"; + cubeUVRenderTarget.scissorTest = true; + return cubeUVRenderTarget; +} +function _setViewport(target, x, y, width, height) { + target.viewport.set(x, y, width, height); + target.scissor.set(x, y, width, height); +} +function _getGGXShader(lodMax, width, height) { + const shaderMaterial = new ShaderMaterial({ + name: "PMREMGGXConvolution", + defines: { + "GGX_SAMPLES": GGX_SAMPLES, + "CUBEUV_TEXEL_WIDTH": 1 / width, + "CUBEUV_TEXEL_HEIGHT": 1 / height, + "CUBEUV_MAX_MIP": `${lodMax}.0` + }, + uniforms: { + "envMap": { value: null }, + "roughness": { value: 0 }, + "mipInt": { value: 0 } + }, + vertexShader: _getCommonVertexShader(), + fragmentShader: ( + /* glsl */ + ` + + precision highp float; + precision highp int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform float roughness; + uniform float mipInt; + + #define ENVMAP_TYPE_CUBE_UV + #include + + #define PI 3.14159265359 + + // Van der Corput radical inverse + float radicalInverse_VdC(uint bits) { + bits = (bits << 16u) | (bits >> 16u); + bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); + bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); + bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); + bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); + return float(bits) * 2.3283064365386963e-10; // / 0x100000000 + } + + // Hammersley sequence + vec2 hammersley(uint i, uint N) { + return vec2(float(i) / float(N), radicalInverse_VdC(i)); + } + + // GGX VNDF importance sampling (Eric Heitz 2018) + // "Sampling the GGX Distribution of Visible Normals" + // https://jcgt.org/published/0007/04/01/ + vec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) { + float alpha = roughness * roughness; + + // Section 3.2: Transform view direction to hemisphere configuration + vec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z)); + + // Section 4.1: Orthonormal basis + float lensq = Vh.x * Vh.x + Vh.y * Vh.y; + vec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0); + vec3 T2 = cross(Vh, T1); + + // Section 4.2: Parameterization of projected area + float r = sqrt(Xi.x); + float phi = 2.0 * PI * Xi.y; + float t1 = r * cos(phi); + float t2 = r * sin(phi); + float s = 0.5 * (1.0 + Vh.z); + t2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2; + + // Section 4.3: Reprojection onto hemisphere + vec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh; + + // Section 3.4: Transform back to ellipsoid configuration + return normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z))); + } + + void main() { + vec3 N = normalize(vOutputDirection); + vec3 V = N; // Assume view direction equals normal for pre-filtering + + vec3 prefilteredColor = vec3(0.0); + float totalWeight = 0.0; + + // For very low roughness, just sample the environment directly + if (roughness < 0.001) { + gl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0); + return; + } + + // Tangent space basis for VNDF sampling + vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); + vec3 tangent = normalize(cross(up, N)); + vec3 bitangent = cross(N, tangent); + + for(uint i = 0u; i < uint(GGX_SAMPLES); i++) { + vec2 Xi = hammersley(i, uint(GGX_SAMPLES)); + + // For PMREM, V = N, so in tangent space V is always (0, 0, 1) + vec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness); + + // Transform H back to world space + vec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z); + vec3 L = normalize(2.0 * dot(V, H) * H - V); + + float NdotL = max(dot(N, L), 0.0); + + if(NdotL > 0.0) { + // Sample environment at fixed mip level + // VNDF importance sampling handles the distribution filtering + vec3 sampleColor = bilinearCubeUV(envMap, L, mipInt); + + // Weight by NdotL for the split-sum approximation + // VNDF PDF naturally accounts for the visible microfacet distribution + prefilteredColor += sampleColor * NdotL; + totalWeight += NdotL; + } + } + + if (totalWeight > 0.0) { + prefilteredColor = prefilteredColor / totalWeight; + } + + gl_FragColor = vec4(prefilteredColor, 1.0); + } + ` + ), + blending: NoBlending, + depthTest: false, + depthWrite: false + }); + return shaderMaterial; +} +function _getBlurShader(lodMax, width, height) { + const weights = new Float32Array(MAX_SAMPLES); + const poleAxis = new Vector3(0, 1, 0); + const shaderMaterial = new ShaderMaterial({ + name: "SphericalGaussianBlur", + defines: { + "n": MAX_SAMPLES, + "CUBEUV_TEXEL_WIDTH": 1 / width, + "CUBEUV_TEXEL_HEIGHT": 1 / height, + "CUBEUV_MAX_MIP": `${lodMax}.0` + }, + uniforms: { + "envMap": { value: null }, + "samples": { value: 1 }, + "weights": { value: weights }, + "latitudinal": { value: false }, + "dTheta": { value: 0 }, + "mipInt": { value: 0 }, + "poleAxis": { value: poleAxis } + }, + vertexShader: _getCommonVertexShader(), + fragmentShader: ( + /* glsl */ + ` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + uniform int samples; + uniform float weights[ n ]; + uniform bool latitudinal; + uniform float dTheta; + uniform float mipInt; + uniform vec3 poleAxis; + + #define ENVMAP_TYPE_CUBE_UV + #include + + vec3 getSample( float theta, vec3 axis ) { + + float cosTheta = cos( theta ); + // Rodrigues' axis-angle rotation + vec3 sampleDirection = vOutputDirection * cosTheta + + cross( axis, vOutputDirection ) * sin( theta ) + + axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta ); + + return bilinearCubeUV( envMap, sampleDirection, mipInt ); + + } + + void main() { + + vec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection ); + + if ( all( equal( axis, vec3( 0.0 ) ) ) ) { + + axis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x ); + + } + + axis = normalize( axis ); + + gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); + gl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis ); + + for ( int i = 1; i < n; i++ ) { + + if ( i >= samples ) { + + break; + + } + + float theta = dTheta * float( i ); + gl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis ); + gl_FragColor.rgb += weights[ i ] * getSample( theta, axis ); + + } + + } + ` + ), + blending: NoBlending, + depthTest: false, + depthWrite: false + }); + return shaderMaterial; +} +function _getEquirectMaterial() { + return new ShaderMaterial({ + name: "EquirectangularToCubeUV", + uniforms: { + "envMap": { value: null } + }, + vertexShader: _getCommonVertexShader(), + fragmentShader: ( + /* glsl */ + ` + + precision mediump float; + precision mediump int; + + varying vec3 vOutputDirection; + + uniform sampler2D envMap; + + #include + + void main() { + + vec3 outputDirection = normalize( vOutputDirection ); + vec2 uv = equirectUv( outputDirection ); + + gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); + + } + ` + ), + blending: NoBlending, + depthTest: false, + depthWrite: false + }); +} +function _getCubemapMaterial() { + return new ShaderMaterial({ + name: "CubemapToCubeUV", + uniforms: { + "envMap": { value: null }, + "flipEnvMap": { value: -1 } + }, + vertexShader: _getCommonVertexShader(), + fragmentShader: ( + /* glsl */ + ` + + precision mediump float; + precision mediump int; + + uniform float flipEnvMap; + + varying vec3 vOutputDirection; + + uniform samplerCube envMap; + + void main() { + + gl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) ); + + } + ` + ), + blending: NoBlending, + depthTest: false, + depthWrite: false + }); +} +function _getCommonVertexShader() { + return ( + /* glsl */ + ` + + precision mediump float; + precision mediump int; + + attribute float faceIndex; + + varying vec3 vOutputDirection; + + // RH coordinate system; PMREM face-indexing convention + vec3 getDirection( vec2 uv, float face ) { + + uv = 2.0 * uv - 1.0; + + vec3 direction = vec3( uv, 1.0 ); + + if ( face == 0.0 ) { + + direction = direction.zyx; // ( 1, v, u ) pos x + + } else if ( face == 1.0 ) { + + direction = direction.xzy; + direction.xz *= -1.0; // ( -u, 1, -v ) pos y + + } else if ( face == 2.0 ) { + + direction.x *= -1.0; // ( -u, v, 1 ) pos z + + } else if ( face == 3.0 ) { + + direction = direction.zyx; + direction.xz *= -1.0; // ( -1, v, -u ) neg x + + } else if ( face == 4.0 ) { + + direction = direction.xzy; + direction.xy *= -1.0; // ( -u, -1, v ) neg y + + } else if ( face == 5.0 ) { + + direction.z *= -1.0; // ( u, v, -1 ) neg z + + } + + return direction; + + } + + void main() { + + vOutputDirection = getDirection( uv, faceIndex ); + gl_Position = vec4( position, 1.0 ); + + } + ` + ); +} +function WebGLCubeUVMaps(renderer) { + let cubeUVmaps = /* @__PURE__ */ new WeakMap(); + let pmremGenerator = null; + function get(texture) { + if (texture && texture.isTexture) { + const mapping = texture.mapping; + const isEquirectMap = mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping; + const isCubeMap = mapping === CubeReflectionMapping || mapping === CubeRefractionMapping; + if (isEquirectMap || isCubeMap) { + let renderTarget = cubeUVmaps.get(texture); + const currentPMREMVersion = renderTarget !== void 0 ? renderTarget.texture.pmremVersion : 0; + if (texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion) { + if (pmremGenerator === null) pmremGenerator = new PMREMGenerator(renderer); + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular(texture, renderTarget) : pmremGenerator.fromCubemap(texture, renderTarget); + renderTarget.texture.pmremVersion = texture.pmremVersion; + cubeUVmaps.set(texture, renderTarget); + return renderTarget.texture; + } else { + if (renderTarget !== void 0) { + return renderTarget.texture; + } else { + const image = texture.image; + if (isEquirectMap && image && image.height > 0 || isCubeMap && image && isCubeTextureComplete(image)) { + if (pmremGenerator === null) pmremGenerator = new PMREMGenerator(renderer); + renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular(texture) : pmremGenerator.fromCubemap(texture); + renderTarget.texture.pmremVersion = texture.pmremVersion; + cubeUVmaps.set(texture, renderTarget); + texture.addEventListener("dispose", onTextureDispose); + return renderTarget.texture; + } else { + return null; + } + } + } + } + } + return texture; + } + function isCubeTextureComplete(image) { + let count = 0; + const length = 6; + for (let i = 0; i < length; i++) { + if (image[i] !== void 0) count++; + } + return count === length; + } + function onTextureDispose(event) { + const texture = event.target; + texture.removeEventListener("dispose", onTextureDispose); + const cubemapUV = cubeUVmaps.get(texture); + if (cubemapUV !== void 0) { + cubeUVmaps.delete(texture); + cubemapUV.dispose(); + } + } + function dispose() { + cubeUVmaps = /* @__PURE__ */ new WeakMap(); + if (pmremGenerator !== null) { + pmremGenerator.dispose(); + pmremGenerator = null; + } + } + return { + get, + dispose + }; +} +function WebGLExtensions(gl) { + const extensions = {}; + function getExtension(name) { + if (extensions[name] !== void 0) { + return extensions[name]; + } + const extension = gl.getExtension(name); + extensions[name] = extension; + return extension; + } + return { + has: function(name) { + return getExtension(name) !== null; + }, + init: function() { + getExtension("EXT_color_buffer_float"); + getExtension("WEBGL_clip_cull_distance"); + getExtension("OES_texture_float_linear"); + getExtension("EXT_color_buffer_half_float"); + getExtension("WEBGL_multisampled_render_to_texture"); + getExtension("WEBGL_render_shared_exponent"); + }, + get: function(name) { + const extension = getExtension(name); + if (extension === null) { + warnOnce("WebGLRenderer: " + name + " extension not supported."); + } + return extension; + } + }; +} +function WebGLGeometries(gl, attributes, info, bindingStates) { + const geometries = {}; + const wireframeAttributes = /* @__PURE__ */ new WeakMap(); + function onGeometryDispose(event) { + const geometry = event.target; + if (geometry.index !== null) { + attributes.remove(geometry.index); + } + for (const name in geometry.attributes) { + attributes.remove(geometry.attributes[name]); + } + geometry.removeEventListener("dispose", onGeometryDispose); + delete geometries[geometry.id]; + const attribute = wireframeAttributes.get(geometry); + if (attribute) { + attributes.remove(attribute); + wireframeAttributes.delete(geometry); + } + bindingStates.releaseStatesOfGeometry(geometry); + if (geometry.isInstancedBufferGeometry === true) { + delete geometry._maxInstanceCount; + } + info.memory.geometries--; + } + function get(object, geometry) { + if (geometries[geometry.id] === true) return geometry; + geometry.addEventListener("dispose", onGeometryDispose); + geometries[geometry.id] = true; + info.memory.geometries++; + return geometry; + } + function update(geometry) { + const geometryAttributes = geometry.attributes; + for (const name in geometryAttributes) { + attributes.update(geometryAttributes[name], gl.ARRAY_BUFFER); + } + } + function updateWireframeAttribute(geometry) { + const indices = []; + const geometryIndex = geometry.index; + const geometryPosition = geometry.attributes.position; + let version = 0; + if (geometryIndex !== null) { + const array = geometryIndex.array; + version = geometryIndex.version; + for (let i = 0, l = array.length; i < l; i += 3) { + const a = array[i + 0]; + const b = array[i + 1]; + const c = array[i + 2]; + indices.push(a, b, b, c, c, a); + } + } else if (geometryPosition !== void 0) { + const array = geometryPosition.array; + version = geometryPosition.version; + for (let i = 0, l = array.length / 3 - 1; i < l; i += 3) { + const a = i + 0; + const b = i + 1; + const c = i + 2; + indices.push(a, b, b, c, c, a); + } + } else { + return; + } + const attribute = new (arrayNeedsUint32(indices) ? Uint32BufferAttribute : Uint16BufferAttribute)(indices, 1); + attribute.version = version; + const previousAttribute = wireframeAttributes.get(geometry); + if (previousAttribute) attributes.remove(previousAttribute); + wireframeAttributes.set(geometry, attribute); + } + function getWireframeAttribute(geometry) { + const currentAttribute = wireframeAttributes.get(geometry); + if (currentAttribute) { + const geometryIndex = geometry.index; + if (geometryIndex !== null) { + if (currentAttribute.version < geometryIndex.version) { + updateWireframeAttribute(geometry); + } + } + } else { + updateWireframeAttribute(geometry); + } + return wireframeAttributes.get(geometry); + } + return { + get, + update, + getWireframeAttribute + }; +} +function WebGLIndexedBufferRenderer(gl, extensions, info) { + let mode; + function setMode(value) { + mode = value; + } + let type, bytesPerElement; + function setIndex(value) { + type = value.type; + bytesPerElement = value.bytesPerElement; + } + function render(start, count) { + gl.drawElements(mode, count, type, start * bytesPerElement); + info.update(count, mode, 1); + } + function renderInstances(start, count, primcount) { + if (primcount === 0) return; + gl.drawElementsInstanced(mode, count, type, start * bytesPerElement, primcount); + info.update(count, mode, primcount); + } + function renderMultiDraw(starts, counts, drawCount) { + if (drawCount === 0) return; + const extension = extensions.get("WEBGL_multi_draw"); + extension.multiDrawElementsWEBGL(mode, counts, 0, type, starts, 0, drawCount); + let elementCount = 0; + for (let i = 0; i < drawCount; i++) { + elementCount += counts[i]; + } + info.update(elementCount, mode, 1); + } + function renderMultiDrawInstances(starts, counts, drawCount, primcount) { + if (drawCount === 0) return; + const extension = extensions.get("WEBGL_multi_draw"); + if (extension === null) { + for (let i = 0; i < starts.length; i++) { + renderInstances(starts[i] / bytesPerElement, counts[i], primcount[i]); + } + } else { + extension.multiDrawElementsInstancedWEBGL(mode, counts, 0, type, starts, 0, primcount, 0, drawCount); + let elementCount = 0; + for (let i = 0; i < drawCount; i++) { + elementCount += counts[i] * primcount[i]; + } + info.update(elementCount, mode, 1); + } + } + this.setMode = setMode; + this.setIndex = setIndex; + this.render = render; + this.renderInstances = renderInstances; + this.renderMultiDraw = renderMultiDraw; + this.renderMultiDrawInstances = renderMultiDrawInstances; +} +function WebGLInfo(gl) { + const memory = { + geometries: 0, + textures: 0 + }; + const render = { + frame: 0, + calls: 0, + triangles: 0, + points: 0, + lines: 0 + }; + function update(count, mode, instanceCount) { + render.calls++; + switch (mode) { + case gl.TRIANGLES: + render.triangles += instanceCount * (count / 3); + break; + case gl.LINES: + render.lines += instanceCount * (count / 2); + break; + case gl.LINE_STRIP: + render.lines += instanceCount * (count - 1); + break; + case gl.LINE_LOOP: + render.lines += instanceCount * count; + break; + case gl.POINTS: + render.points += instanceCount * count; + break; + default: + error("WebGLInfo: Unknown draw mode:", mode); + break; + } + } + function reset() { + render.calls = 0; + render.triangles = 0; + render.points = 0; + render.lines = 0; + } + return { + memory, + render, + programs: null, + autoReset: true, + reset, + update + }; +} +function WebGLMorphtargets(gl, capabilities, textures) { + const morphTextures = /* @__PURE__ */ new WeakMap(); + const morph = new Vector4(); + function update(object, geometry, program) { + const objectInfluences = object.morphTargetInfluences; + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; + let entry = morphTextures.get(geometry); + if (entry === void 0 || entry.count !== morphTargetsCount) { + let disposeTexture = function() { + texture.dispose(); + morphTextures.delete(geometry); + geometry.removeEventListener("dispose", disposeTexture); + }; + if (entry !== void 0) entry.texture.dispose(); + const hasMorphPosition = geometry.morphAttributes.position !== void 0; + const hasMorphNormals = geometry.morphAttributes.normal !== void 0; + const hasMorphColors = geometry.morphAttributes.color !== void 0; + const morphTargets = geometry.morphAttributes.position || []; + const morphNormals = geometry.morphAttributes.normal || []; + const morphColors = geometry.morphAttributes.color || []; + let vertexDataCount = 0; + if (hasMorphPosition === true) vertexDataCount = 1; + if (hasMorphNormals === true) vertexDataCount = 2; + if (hasMorphColors === true) vertexDataCount = 3; + let width = geometry.attributes.position.count * vertexDataCount; + let height = 1; + if (width > capabilities.maxTextureSize) { + height = Math.ceil(width / capabilities.maxTextureSize); + width = capabilities.maxTextureSize; + } + const buffer = new Float32Array(width * height * 4 * morphTargetsCount); + const texture = new DataArrayTexture(buffer, width, height, morphTargetsCount); + texture.type = FloatType; + texture.needsUpdate = true; + const vertexDataStride = vertexDataCount * 4; + for (let i = 0; i < morphTargetsCount; i++) { + const morphTarget = morphTargets[i]; + const morphNormal = morphNormals[i]; + const morphColor = morphColors[i]; + const offset = width * height * 4 * i; + for (let j = 0; j < morphTarget.count; j++) { + const stride = j * vertexDataStride; + if (hasMorphPosition === true) { + morph.fromBufferAttribute(morphTarget, j); + buffer[offset + stride + 0] = morph.x; + buffer[offset + stride + 1] = morph.y; + buffer[offset + stride + 2] = morph.z; + buffer[offset + stride + 3] = 0; + } + if (hasMorphNormals === true) { + morph.fromBufferAttribute(morphNormal, j); + buffer[offset + stride + 4] = morph.x; + buffer[offset + stride + 5] = morph.y; + buffer[offset + stride + 6] = morph.z; + buffer[offset + stride + 7] = 0; + } + if (hasMorphColors === true) { + morph.fromBufferAttribute(morphColor, j); + buffer[offset + stride + 8] = morph.x; + buffer[offset + stride + 9] = morph.y; + buffer[offset + stride + 10] = morph.z; + buffer[offset + stride + 11] = morphColor.itemSize === 4 ? morph.w : 1; + } + } + } + entry = { + count: morphTargetsCount, + texture, + size: new Vector2(width, height) + }; + morphTextures.set(geometry, entry); + geometry.addEventListener("dispose", disposeTexture); + } + if (object.isInstancedMesh === true && object.morphTexture !== null) { + program.getUniforms().setValue(gl, "morphTexture", object.morphTexture, textures); + } else { + let morphInfluencesSum = 0; + for (let i = 0; i < objectInfluences.length; i++) { + morphInfluencesSum += objectInfluences[i]; + } + const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum; + program.getUniforms().setValue(gl, "morphTargetBaseInfluence", morphBaseInfluence); + program.getUniforms().setValue(gl, "morphTargetInfluences", objectInfluences); + } + program.getUniforms().setValue(gl, "morphTargetsTexture", entry.texture, textures); + program.getUniforms().setValue(gl, "morphTargetsTextureSize", entry.size); + } + return { + update + }; +} +function WebGLObjects(gl, geometries, attributes, info) { + let updateMap = /* @__PURE__ */ new WeakMap(); + function update(object) { + const frame = info.render.frame; + const geometry = object.geometry; + const buffergeometry = geometries.get(object, geometry); + if (updateMap.get(buffergeometry) !== frame) { + geometries.update(buffergeometry); + updateMap.set(buffergeometry, frame); + } + if (object.isInstancedMesh) { + if (object.hasEventListener("dispose", onInstancedMeshDispose) === false) { + object.addEventListener("dispose", onInstancedMeshDispose); + } + if (updateMap.get(object) !== frame) { + attributes.update(object.instanceMatrix, gl.ARRAY_BUFFER); + if (object.instanceColor !== null) { + attributes.update(object.instanceColor, gl.ARRAY_BUFFER); + } + updateMap.set(object, frame); + } + } + if (object.isSkinnedMesh) { + const skeleton = object.skeleton; + if (updateMap.get(skeleton) !== frame) { + skeleton.update(); + updateMap.set(skeleton, frame); + } + } + return buffergeometry; + } + function dispose() { + updateMap = /* @__PURE__ */ new WeakMap(); + } + function onInstancedMeshDispose(event) { + const instancedMesh = event.target; + instancedMesh.removeEventListener("dispose", onInstancedMeshDispose); + attributes.remove(instancedMesh.instanceMatrix); + if (instancedMesh.instanceColor !== null) attributes.remove(instancedMesh.instanceColor); + } + return { + update, + dispose + }; +} +var toneMappingMap = { + [LinearToneMapping]: "LINEAR_TONE_MAPPING", + [ReinhardToneMapping]: "REINHARD_TONE_MAPPING", + [CineonToneMapping]: "CINEON_TONE_MAPPING", + [ACESFilmicToneMapping]: "ACES_FILMIC_TONE_MAPPING", + [AgXToneMapping]: "AGX_TONE_MAPPING", + [NeutralToneMapping]: "NEUTRAL_TONE_MAPPING", + [CustomToneMapping]: "CUSTOM_TONE_MAPPING" +}; +function WebGLOutput(type, width, height, depth, stencil) { + const targetA = new WebGLRenderTarget(width, height, { + type, + depthBuffer: depth, + stencilBuffer: stencil + }); + const targetB = new WebGLRenderTarget(width, height, { + type: HalfFloatType, + depthBuffer: false, + stencilBuffer: false + }); + const geometry = new BufferGeometry(); + geometry.setAttribute("position", new Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)); + geometry.setAttribute("uv", new Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2)); + const material = new RawShaderMaterial({ + uniforms: { + tDiffuse: { value: null } + }, + vertexShader: ( + /* glsl */ + ` + precision highp float; + + uniform mat4 modelViewMatrix; + uniform mat4 projectionMatrix; + + attribute vec3 position; + attribute vec2 uv; + + varying vec2 vUv; + + void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); + }` + ), + fragmentShader: ( + /* glsl */ + ` + precision highp float; + + uniform sampler2D tDiffuse; + + varying vec2 vUv; + + #include + #include + + void main() { + gl_FragColor = texture2D( tDiffuse, vUv ); + + #ifdef LINEAR_TONE_MAPPING + gl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb ); + #elif defined( REINHARD_TONE_MAPPING ) + gl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb ); + #elif defined( CINEON_TONE_MAPPING ) + gl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb ); + #elif defined( ACES_FILMIC_TONE_MAPPING ) + gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb ); + #elif defined( AGX_TONE_MAPPING ) + gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb ); + #elif defined( NEUTRAL_TONE_MAPPING ) + gl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb ); + #elif defined( CUSTOM_TONE_MAPPING ) + gl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb ); + #endif + + #ifdef SRGB_TRANSFER + gl_FragColor = sRGBTransferOETF( gl_FragColor ); + #endif + }` + ), + depthTest: false, + depthWrite: false + }); + const mesh = new Mesh(geometry, material); + const camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1); + let _outputColorSpace = null; + let _outputToneMapping = null; + let _isCompositing = false; + let _savedToneMapping; + let _savedRenderTarget = null; + let _effects = []; + let _hasRenderPass = false; + this.setSize = function(width2, height2) { + targetA.setSize(width2, height2); + targetB.setSize(width2, height2); + for (let i = 0; i < _effects.length; i++) { + const effect = _effects[i]; + if (effect.setSize) effect.setSize(width2, height2); + } + }; + this.setEffects = function(effects) { + _effects = effects; + _hasRenderPass = _effects.length > 0 && _effects[0].isRenderPass === true; + const width2 = targetA.width; + const height2 = targetA.height; + for (let i = 0; i < _effects.length; i++) { + const effect = _effects[i]; + if (effect.setSize) effect.setSize(width2, height2); + } + }; + this.begin = function(renderer, renderTarget) { + if (_isCompositing) return false; + if (renderer.toneMapping === NoToneMapping && _effects.length === 0) return false; + _savedRenderTarget = renderTarget; + if (renderTarget !== null) { + const width2 = renderTarget.width; + const height2 = renderTarget.height; + if (targetA.width !== width2 || targetA.height !== height2) { + this.setSize(width2, height2); + } + } + if (_hasRenderPass === false) { + renderer.setRenderTarget(targetA); + } + _savedToneMapping = renderer.toneMapping; + renderer.toneMapping = NoToneMapping; + return true; + }; + this.hasRenderPass = function() { + return _hasRenderPass; + }; + this.end = function(renderer, deltaTime) { + renderer.toneMapping = _savedToneMapping; + _isCompositing = true; + let readBuffer = targetA; + let writeBuffer = targetB; + for (let i = 0; i < _effects.length; i++) { + const effect = _effects[i]; + if (effect.enabled === false) continue; + effect.render(renderer, writeBuffer, readBuffer, deltaTime); + if (effect.needsSwap !== false) { + const temp = readBuffer; + readBuffer = writeBuffer; + writeBuffer = temp; + } + } + if (_outputColorSpace !== renderer.outputColorSpace || _outputToneMapping !== renderer.toneMapping) { + _outputColorSpace = renderer.outputColorSpace; + _outputToneMapping = renderer.toneMapping; + material.defines = {}; + if (ColorManagement.getTransfer(_outputColorSpace) === SRGBTransfer) material.defines.SRGB_TRANSFER = ""; + const toneMapping = toneMappingMap[_outputToneMapping]; + if (toneMapping) material.defines[toneMapping] = ""; + material.needsUpdate = true; + } + material.uniforms.tDiffuse.value = readBuffer.texture; + renderer.setRenderTarget(_savedRenderTarget); + renderer.render(mesh, camera); + _savedRenderTarget = null; + _isCompositing = false; + }; + this.isCompositing = function() { + return _isCompositing; + }; + this.dispose = function() { + targetA.dispose(); + targetB.dispose(); + geometry.dispose(); + material.dispose(); + }; +} +var emptyTexture = new Texture(); +var emptyShadowTexture = new DepthTexture(1, 1); +var emptyArrayTexture = new DataArrayTexture(); +var empty3dTexture = new Data3DTexture(); +var emptyCubeTexture = new CubeTexture(); +var arrayCacheF32 = []; +var arrayCacheI32 = []; +var mat4array = new Float32Array(16); +var mat3array = new Float32Array(9); +var mat2array = new Float32Array(4); +function flatten(array, nBlocks, blockSize) { + const firstElem = array[0]; + if (firstElem <= 0 || firstElem > 0) return array; + const n = nBlocks * blockSize; + let r = arrayCacheF32[n]; + if (r === void 0) { + r = new Float32Array(n); + arrayCacheF32[n] = r; + } + if (nBlocks !== 0) { + firstElem.toArray(r, 0); + for (let i = 1, offset = 0; i !== nBlocks; ++i) { + offset += blockSize; + array[i].toArray(r, offset); + } + } + return r; +} +function arraysEqual(a, b) { + if (a.length !== b.length) return false; + for (let i = 0, l = a.length; i < l; i++) { + if (a[i] !== b[i]) return false; + } + return true; +} +function copyArray(a, b) { + for (let i = 0, l = b.length; i < l; i++) { + a[i] = b[i]; + } +} +function allocTexUnits(textures, n) { + let r = arrayCacheI32[n]; + if (r === void 0) { + r = new Int32Array(n); + arrayCacheI32[n] = r; + } + for (let i = 0; i !== n; ++i) { + r[i] = textures.allocateTextureUnit(); + } + return r; +} +function setValueV1f(gl, v) { + const cache = this.cache; + if (cache[0] === v) return; + gl.uniform1f(this.addr, v); + cache[0] = v; +} +function setValueV2f(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y) { + gl.uniform2f(this.addr, v.x, v.y); + cache[0] = v.x; + cache[1] = v.y; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform2fv(this.addr, v); + copyArray(cache, v); + } +} +function setValueV3f(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { + gl.uniform3f(this.addr, v.x, v.y, v.z); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + } + } else if (v.r !== void 0) { + if (cache[0] !== v.r || cache[1] !== v.g || cache[2] !== v.b) { + gl.uniform3f(this.addr, v.r, v.g, v.b); + cache[0] = v.r; + cache[1] = v.g; + cache[2] = v.b; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform3fv(this.addr, v); + copyArray(cache, v); + } +} +function setValueV4f(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { + gl.uniform4f(this.addr, v.x, v.y, v.z, v.w); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + cache[3] = v.w; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform4fv(this.addr, v); + copyArray(cache, v); + } +} +function setValueM2(gl, v) { + const cache = this.cache; + const elements = v.elements; + if (elements === void 0) { + if (arraysEqual(cache, v)) return; + gl.uniformMatrix2fv(this.addr, false, v); + copyArray(cache, v); + } else { + if (arraysEqual(cache, elements)) return; + mat2array.set(elements); + gl.uniformMatrix2fv(this.addr, false, mat2array); + copyArray(cache, elements); + } +} +function setValueM3(gl, v) { + const cache = this.cache; + const elements = v.elements; + if (elements === void 0) { + if (arraysEqual(cache, v)) return; + gl.uniformMatrix3fv(this.addr, false, v); + copyArray(cache, v); + } else { + if (arraysEqual(cache, elements)) return; + mat3array.set(elements); + gl.uniformMatrix3fv(this.addr, false, mat3array); + copyArray(cache, elements); + } +} +function setValueM4(gl, v) { + const cache = this.cache; + const elements = v.elements; + if (elements === void 0) { + if (arraysEqual(cache, v)) return; + gl.uniformMatrix4fv(this.addr, false, v); + copyArray(cache, v); + } else { + if (arraysEqual(cache, elements)) return; + mat4array.set(elements); + gl.uniformMatrix4fv(this.addr, false, mat4array); + copyArray(cache, elements); + } +} +function setValueV1i(gl, v) { + const cache = this.cache; + if (cache[0] === v) return; + gl.uniform1i(this.addr, v); + cache[0] = v; +} +function setValueV2i(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y) { + gl.uniform2i(this.addr, v.x, v.y); + cache[0] = v.x; + cache[1] = v.y; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform2iv(this.addr, v); + copyArray(cache, v); + } +} +function setValueV3i(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { + gl.uniform3i(this.addr, v.x, v.y, v.z); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform3iv(this.addr, v); + copyArray(cache, v); + } +} +function setValueV4i(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { + gl.uniform4i(this.addr, v.x, v.y, v.z, v.w); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + cache[3] = v.w; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform4iv(this.addr, v); + copyArray(cache, v); + } +} +function setValueV1ui(gl, v) { + const cache = this.cache; + if (cache[0] === v) return; + gl.uniform1ui(this.addr, v); + cache[0] = v; +} +function setValueV2ui(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y) { + gl.uniform2ui(this.addr, v.x, v.y); + cache[0] = v.x; + cache[1] = v.y; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform2uiv(this.addr, v); + copyArray(cache, v); + } +} +function setValueV3ui(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z) { + gl.uniform3ui(this.addr, v.x, v.y, v.z); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform3uiv(this.addr, v); + copyArray(cache, v); + } +} +function setValueV4ui(gl, v) { + const cache = this.cache; + if (v.x !== void 0) { + if (cache[0] !== v.x || cache[1] !== v.y || cache[2] !== v.z || cache[3] !== v.w) { + gl.uniform4ui(this.addr, v.x, v.y, v.z, v.w); + cache[0] = v.x; + cache[1] = v.y; + cache[2] = v.z; + cache[3] = v.w; + } + } else { + if (arraysEqual(cache, v)) return; + gl.uniform4uiv(this.addr, v); + copyArray(cache, v); + } +} +function setValueT1(gl, v, textures) { + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + if (cache[0] !== unit) { + gl.uniform1i(this.addr, unit); + cache[0] = unit; + } + let emptyTexture2D; + if (this.type === gl.SAMPLER_2D_SHADOW) { + emptyShadowTexture.compareFunction = textures.isReversedDepthBuffer() ? GreaterEqualCompare : LessEqualCompare; + emptyTexture2D = emptyShadowTexture; + } else { + emptyTexture2D = emptyTexture; + } + textures.setTexture2D(v || emptyTexture2D, unit); +} +function setValueT3D1(gl, v, textures) { + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + if (cache[0] !== unit) { + gl.uniform1i(this.addr, unit); + cache[0] = unit; + } + textures.setTexture3D(v || empty3dTexture, unit); +} +function setValueT6(gl, v, textures) { + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + if (cache[0] !== unit) { + gl.uniform1i(this.addr, unit); + cache[0] = unit; + } + textures.setTextureCube(v || emptyCubeTexture, unit); +} +function setValueT2DArray1(gl, v, textures) { + const cache = this.cache; + const unit = textures.allocateTextureUnit(); + if (cache[0] !== unit) { + gl.uniform1i(this.addr, unit); + cache[0] = unit; + } + textures.setTexture2DArray(v || emptyArrayTexture, unit); +} +function getSingularSetter(type) { + switch (type) { + case 5126: + return setValueV1f; + // FLOAT + case 35664: + return setValueV2f; + // _VEC2 + case 35665: + return setValueV3f; + // _VEC3 + case 35666: + return setValueV4f; + // _VEC4 + case 35674: + return setValueM2; + // _MAT2 + case 35675: + return setValueM3; + // _MAT3 + case 35676: + return setValueM4; + // _MAT4 + case 5124: + case 35670: + return setValueV1i; + // INT, BOOL + case 35667: + case 35671: + return setValueV2i; + // _VEC2 + case 35668: + case 35672: + return setValueV3i; + // _VEC3 + case 35669: + case 35673: + return setValueV4i; + // _VEC4 + case 5125: + return setValueV1ui; + // UINT + case 36294: + return setValueV2ui; + // _VEC2 + case 36295: + return setValueV3ui; + // _VEC3 + case 36296: + return setValueV4ui; + // _VEC4 + case 35678: + // SAMPLER_2D + case 36198: + // SAMPLER_EXTERNAL_OES + case 36298: + // INT_SAMPLER_2D + case 36306: + // UNSIGNED_INT_SAMPLER_2D + case 35682: + return setValueT1; + case 35679: + // SAMPLER_3D + case 36299: + // INT_SAMPLER_3D + case 36307: + return setValueT3D1; + case 35680: + // SAMPLER_CUBE + case 36300: + // INT_SAMPLER_CUBE + case 36308: + // UNSIGNED_INT_SAMPLER_CUBE + case 36293: + return setValueT6; + case 36289: + // SAMPLER_2D_ARRAY + case 36303: + // INT_SAMPLER_2D_ARRAY + case 36311: + // UNSIGNED_INT_SAMPLER_2D_ARRAY + case 36292: + return setValueT2DArray1; + } +} +function setValueV1fArray(gl, v) { + gl.uniform1fv(this.addr, v); +} +function setValueV2fArray(gl, v) { + const data = flatten(v, this.size, 2); + gl.uniform2fv(this.addr, data); +} +function setValueV3fArray(gl, v) { + const data = flatten(v, this.size, 3); + gl.uniform3fv(this.addr, data); +} +function setValueV4fArray(gl, v) { + const data = flatten(v, this.size, 4); + gl.uniform4fv(this.addr, data); +} +function setValueM2Array(gl, v) { + const data = flatten(v, this.size, 4); + gl.uniformMatrix2fv(this.addr, false, data); +} +function setValueM3Array(gl, v) { + const data = flatten(v, this.size, 9); + gl.uniformMatrix3fv(this.addr, false, data); +} +function setValueM4Array(gl, v) { + const data = flatten(v, this.size, 16); + gl.uniformMatrix4fv(this.addr, false, data); +} +function setValueV1iArray(gl, v) { + gl.uniform1iv(this.addr, v); +} +function setValueV2iArray(gl, v) { + gl.uniform2iv(this.addr, v); +} +function setValueV3iArray(gl, v) { + gl.uniform3iv(this.addr, v); +} +function setValueV4iArray(gl, v) { + gl.uniform4iv(this.addr, v); +} +function setValueV1uiArray(gl, v) { + gl.uniform1uiv(this.addr, v); +} +function setValueV2uiArray(gl, v) { + gl.uniform2uiv(this.addr, v); +} +function setValueV3uiArray(gl, v) { + gl.uniform3uiv(this.addr, v); +} +function setValueV4uiArray(gl, v) { + gl.uniform4uiv(this.addr, v); +} +function setValueT1Array(gl, v, textures) { + const cache = this.cache; + const n = v.length; + const units = allocTexUnits(textures, n); + if (!arraysEqual(cache, units)) { + gl.uniform1iv(this.addr, units); + copyArray(cache, units); + } + let emptyTexture2D; + if (this.type === gl.SAMPLER_2D_SHADOW) { + emptyTexture2D = emptyShadowTexture; + } else { + emptyTexture2D = emptyTexture; + } + for (let i = 0; i !== n; ++i) { + textures.setTexture2D(v[i] || emptyTexture2D, units[i]); + } +} +function setValueT3DArray(gl, v, textures) { + const cache = this.cache; + const n = v.length; + const units = allocTexUnits(textures, n); + if (!arraysEqual(cache, units)) { + gl.uniform1iv(this.addr, units); + copyArray(cache, units); + } + for (let i = 0; i !== n; ++i) { + textures.setTexture3D(v[i] || empty3dTexture, units[i]); + } +} +function setValueT6Array(gl, v, textures) { + const cache = this.cache; + const n = v.length; + const units = allocTexUnits(textures, n); + if (!arraysEqual(cache, units)) { + gl.uniform1iv(this.addr, units); + copyArray(cache, units); + } + for (let i = 0; i !== n; ++i) { + textures.setTextureCube(v[i] || emptyCubeTexture, units[i]); + } +} +function setValueT2DArrayArray(gl, v, textures) { + const cache = this.cache; + const n = v.length; + const units = allocTexUnits(textures, n); + if (!arraysEqual(cache, units)) { + gl.uniform1iv(this.addr, units); + copyArray(cache, units); + } + for (let i = 0; i !== n; ++i) { + textures.setTexture2DArray(v[i] || emptyArrayTexture, units[i]); + } +} +function getPureArraySetter(type) { + switch (type) { + case 5126: + return setValueV1fArray; + // FLOAT + case 35664: + return setValueV2fArray; + // _VEC2 + case 35665: + return setValueV3fArray; + // _VEC3 + case 35666: + return setValueV4fArray; + // _VEC4 + case 35674: + return setValueM2Array; + // _MAT2 + case 35675: + return setValueM3Array; + // _MAT3 + case 35676: + return setValueM4Array; + // _MAT4 + case 5124: + case 35670: + return setValueV1iArray; + // INT, BOOL + case 35667: + case 35671: + return setValueV2iArray; + // _VEC2 + case 35668: + case 35672: + return setValueV3iArray; + // _VEC3 + case 35669: + case 35673: + return setValueV4iArray; + // _VEC4 + case 5125: + return setValueV1uiArray; + // UINT + case 36294: + return setValueV2uiArray; + // _VEC2 + case 36295: + return setValueV3uiArray; + // _VEC3 + case 36296: + return setValueV4uiArray; + // _VEC4 + case 35678: + // SAMPLER_2D + case 36198: + // SAMPLER_EXTERNAL_OES + case 36298: + // INT_SAMPLER_2D + case 36306: + // UNSIGNED_INT_SAMPLER_2D + case 35682: + return setValueT1Array; + case 35679: + // SAMPLER_3D + case 36299: + // INT_SAMPLER_3D + case 36307: + return setValueT3DArray; + case 35680: + // SAMPLER_CUBE + case 36300: + // INT_SAMPLER_CUBE + case 36308: + // UNSIGNED_INT_SAMPLER_CUBE + case 36293: + return setValueT6Array; + case 36289: + // SAMPLER_2D_ARRAY + case 36303: + // INT_SAMPLER_2D_ARRAY + case 36311: + // UNSIGNED_INT_SAMPLER_2D_ARRAY + case 36292: + return setValueT2DArrayArray; + } +} +var SingleUniform = class { + constructor(id, activeInfo, addr) { + this.id = id; + this.addr = addr; + this.cache = []; + this.type = activeInfo.type; + this.setValue = getSingularSetter(activeInfo.type); + } +}; +var PureArrayUniform = class { + constructor(id, activeInfo, addr) { + this.id = id; + this.addr = addr; + this.cache = []; + this.type = activeInfo.type; + this.size = activeInfo.size; + this.setValue = getPureArraySetter(activeInfo.type); + } +}; +var StructuredUniform = class { + constructor(id) { + this.id = id; + this.seq = []; + this.map = {}; + } + setValue(gl, value, textures) { + const seq = this.seq; + for (let i = 0, n = seq.length; i !== n; ++i) { + const u = seq[i]; + u.setValue(gl, value[u.id], textures); + } + } +}; +var RePathPart = /(\w+)(\])?(\[|\.)?/g; +function addUniform(container, uniformObject) { + container.seq.push(uniformObject); + container.map[uniformObject.id] = uniformObject; +} +function parseUniform(activeInfo, addr, container) { + const path = activeInfo.name, pathLength = path.length; + RePathPart.lastIndex = 0; + while (true) { + const match = RePathPart.exec(path), matchEnd = RePathPart.lastIndex; + let id = match[1]; + const idIsIndex = match[2] === "]", subscript = match[3]; + if (idIsIndex) id = id | 0; + if (subscript === void 0 || subscript === "[" && matchEnd + 2 === pathLength) { + addUniform(container, subscript === void 0 ? new SingleUniform(id, activeInfo, addr) : new PureArrayUniform(id, activeInfo, addr)); + break; + } else { + const map = container.map; + let next = map[id]; + if (next === void 0) { + next = new StructuredUniform(id); + addUniform(container, next); + } + container = next; + } + } +} +var WebGLUniforms = class { + constructor(gl, program) { + this.seq = []; + this.map = {}; + const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); + for (let i = 0; i < n; ++i) { + const info = gl.getActiveUniform(program, i), addr = gl.getUniformLocation(program, info.name); + parseUniform(info, addr, this); + } + const shadowSamplers = []; + const otherUniforms = []; + for (const u of this.seq) { + if (u.type === gl.SAMPLER_2D_SHADOW || u.type === gl.SAMPLER_CUBE_SHADOW || u.type === gl.SAMPLER_2D_ARRAY_SHADOW) { + shadowSamplers.push(u); + } else { + otherUniforms.push(u); + } + } + if (shadowSamplers.length > 0) { + this.seq = shadowSamplers.concat(otherUniforms); + } + } + setValue(gl, name, value, textures) { + const u = this.map[name]; + if (u !== void 0) u.setValue(gl, value, textures); + } + setOptional(gl, object, name) { + const v = object[name]; + if (v !== void 0) this.setValue(gl, name, v); + } + static upload(gl, seq, values, textures) { + for (let i = 0, n = seq.length; i !== n; ++i) { + const u = seq[i], v = values[u.id]; + if (v.needsUpdate !== false) { + u.setValue(gl, v.value, textures); + } + } + } + static seqWithValue(seq, values) { + const r = []; + for (let i = 0, n = seq.length; i !== n; ++i) { + const u = seq[i]; + if (u.id in values) r.push(u); + } + return r; + } +}; +function WebGLShader(gl, type, string) { + const shader = gl.createShader(type); + gl.shaderSource(shader, string); + gl.compileShader(shader); + return shader; +} +var COMPLETION_STATUS_KHR = 37297; +var programIdCount = 0; +function handleSource(string, errorLine) { + const lines = string.split("\n"); + const lines2 = []; + const from = Math.max(errorLine - 6, 0); + const to = Math.min(errorLine + 6, lines.length); + for (let i = from; i < to; i++) { + const line = i + 1; + lines2.push(`${line === errorLine ? ">" : " "} ${line}: ${lines[i]}`); + } + return lines2.join("\n"); +} +var _m0 = new Matrix3(); +function getEncodingComponents(colorSpace) { + ColorManagement._getMatrix(_m0, ColorManagement.workingColorSpace, colorSpace); + const encodingMatrix = `mat3( ${_m0.elements.map((v) => v.toFixed(4))} )`; + switch (ColorManagement.getTransfer(colorSpace)) { + case LinearTransfer: + return [encodingMatrix, "LinearTransferOETF"]; + case SRGBTransfer: + return [encodingMatrix, "sRGBTransferOETF"]; + default: + warn("WebGLProgram: Unsupported color space: ", colorSpace); + return [encodingMatrix, "LinearTransferOETF"]; + } +} +function getShaderErrors(gl, shader, type) { + const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + const shaderInfoLog = gl.getShaderInfoLog(shader) || ""; + const errors = shaderInfoLog.trim(); + if (status && errors === "") return ""; + const errorMatches = /ERROR: 0:(\d+)/.exec(errors); + if (errorMatches) { + const errorLine = parseInt(errorMatches[1]); + return type.toUpperCase() + "\n\n" + errors + "\n\n" + handleSource(gl.getShaderSource(shader), errorLine); + } else { + return errors; + } +} +function getTexelEncodingFunction(functionName, colorSpace) { + const components = getEncodingComponents(colorSpace); + return [ + `vec4 ${functionName}( vec4 value ) {`, + ` return ${components[1]}( vec4( value.rgb * ${components[0]}, value.a ) );`, + "}" + ].join("\n"); +} +var toneMappingFunctions = { + [LinearToneMapping]: "Linear", + [ReinhardToneMapping]: "Reinhard", + [CineonToneMapping]: "Cineon", + [ACESFilmicToneMapping]: "ACESFilmic", + [AgXToneMapping]: "AgX", + [NeutralToneMapping]: "Neutral", + [CustomToneMapping]: "Custom" +}; +function getToneMappingFunction(functionName, toneMapping) { + const toneMappingName = toneMappingFunctions[toneMapping]; + if (toneMappingName === void 0) { + warn("WebGLProgram: Unsupported toneMapping:", toneMapping); + return "vec3 " + functionName + "( vec3 color ) { return LinearToneMapping( color ); }"; + } + return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; +} +var _v02 = new Vector3(); +function getLuminanceFunction() { + ColorManagement.getLuminanceCoefficients(_v02); + const r = _v02.x.toFixed(4); + const g = _v02.y.toFixed(4); + const b = _v02.z.toFixed(4); + return [ + "float luminance( const in vec3 rgb ) {", + ` const vec3 weights = vec3( ${r}, ${g}, ${b} );`, + " return dot( weights, rgb );", + "}" + ].join("\n"); +} +function generateVertexExtensions(parameters) { + const chunks = [ + parameters.extensionClipCullDistance ? "#extension GL_ANGLE_clip_cull_distance : require" : "", + parameters.extensionMultiDraw ? "#extension GL_ANGLE_multi_draw : require" : "" + ]; + return chunks.filter(filterEmptyLine).join("\n"); +} +function generateDefines(defines) { + const chunks = []; + for (const name in defines) { + const value = defines[name]; + if (value === false) continue; + chunks.push("#define " + name + " " + value); + } + return chunks.join("\n"); +} +function fetchAttributeLocations(gl, program) { + const attributes = {}; + const n = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + for (let i = 0; i < n; i++) { + const info = gl.getActiveAttrib(program, i); + const name = info.name; + let locationSize = 1; + if (info.type === gl.FLOAT_MAT2) locationSize = 2; + if (info.type === gl.FLOAT_MAT3) locationSize = 3; + if (info.type === gl.FLOAT_MAT4) locationSize = 4; + attributes[name] = { + type: info.type, + location: gl.getAttribLocation(program, name), + locationSize + }; + } + return attributes; +} +function filterEmptyLine(string) { + return string !== ""; +} +function replaceLightNums(string, parameters) { + const numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps; + return string.replace(/NUM_DIR_LIGHTS/g, parameters.numDirLights).replace(/NUM_SPOT_LIGHTS/g, parameters.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords).replace(/NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g, parameters.numPointLights).replace(/NUM_HEMI_LIGHTS/g, parameters.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows); +} +function replaceClippingPlaneNums(string, parameters) { + return string.replace(/NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g, parameters.numClippingPlanes - parameters.numClipIntersection); +} +var includePattern = /^[ \t]*#include +<([\w\d./]+)>/gm; +function resolveIncludes(string) { + return string.replace(includePattern, includeReplacer); +} +var shaderChunkMap = /* @__PURE__ */ new Map(); +function includeReplacer(match, include) { + let string = ShaderChunk[include]; + if (string === void 0) { + const newInclude = shaderChunkMap.get(include); + if (newInclude !== void 0) { + string = ShaderChunk[newInclude]; + warn('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.', include, newInclude); + } else { + throw new Error("Can not resolve #include <" + include + ">"); + } + } + return resolveIncludes(string); +} +var unrollLoopPattern = /#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 unrollLoops(string) { + return string.replace(unrollLoopPattern, loopReplacer); +} +function loopReplacer(match, start, end, snippet) { + let string = ""; + for (let i = parseInt(start); i < parseInt(end); i++) { + string += snippet.replace(/\[\s*i\s*\]/g, "[ " + i + " ]").replace(/UNROLLED_LOOP_INDEX/g, i); + } + return string; +} +function generatePrecision(parameters) { + let precisionstring = `precision ${parameters.precision} float; + precision ${parameters.precision} int; + precision ${parameters.precision} sampler2D; + precision ${parameters.precision} samplerCube; + precision ${parameters.precision} sampler3D; + precision ${parameters.precision} sampler2DArray; + precision ${parameters.precision} sampler2DShadow; + precision ${parameters.precision} samplerCubeShadow; + precision ${parameters.precision} sampler2DArrayShadow; + precision ${parameters.precision} isampler2D; + precision ${parameters.precision} isampler3D; + precision ${parameters.precision} isamplerCube; + precision ${parameters.precision} isampler2DArray; + precision ${parameters.precision} usampler2D; + precision ${parameters.precision} usampler3D; + precision ${parameters.precision} usamplerCube; + precision ${parameters.precision} usampler2DArray; + `; + if (parameters.precision === "highp") { + precisionstring += "\n#define HIGH_PRECISION"; + } else if (parameters.precision === "mediump") { + precisionstring += "\n#define MEDIUM_PRECISION"; + } else if (parameters.precision === "lowp") { + precisionstring += "\n#define LOW_PRECISION"; + } + return precisionstring; +} +var shadowMapTypeDefines = { + [PCFShadowMap]: "SHADOWMAP_TYPE_PCF", + [VSMShadowMap]: "SHADOWMAP_TYPE_VSM" +}; +function generateShadowMapTypeDefine(parameters) { + return shadowMapTypeDefines[parameters.shadowMapType] || "SHADOWMAP_TYPE_BASIC"; +} +var envMapTypeDefines = { + [CubeReflectionMapping]: "ENVMAP_TYPE_CUBE", + [CubeRefractionMapping]: "ENVMAP_TYPE_CUBE", + [CubeUVReflectionMapping]: "ENVMAP_TYPE_CUBE_UV" +}; +function generateEnvMapTypeDefine(parameters) { + if (parameters.envMap === false) return "ENVMAP_TYPE_CUBE"; + return envMapTypeDefines[parameters.envMapMode] || "ENVMAP_TYPE_CUBE"; +} +var envMapModeDefines = { + [CubeRefractionMapping]: "ENVMAP_MODE_REFRACTION" +}; +function generateEnvMapModeDefine(parameters) { + if (parameters.envMap === false) return "ENVMAP_MODE_REFLECTION"; + return envMapModeDefines[parameters.envMapMode] || "ENVMAP_MODE_REFLECTION"; +} +var envMapBlendingDefines = { + [MultiplyOperation]: "ENVMAP_BLENDING_MULTIPLY", + [MixOperation]: "ENVMAP_BLENDING_MIX", + [AddOperation]: "ENVMAP_BLENDING_ADD" +}; +function generateEnvMapBlendingDefine(parameters) { + if (parameters.envMap === false) return "ENVMAP_BLENDING_NONE"; + return envMapBlendingDefines[parameters.combine] || "ENVMAP_BLENDING_NONE"; +} +function generateCubeUVSize(parameters) { + const imageHeight = parameters.envMapCubeUVHeight; + if (imageHeight === null) return null; + const maxMip = Math.log2(imageHeight) - 2; + const texelHeight = 1 / imageHeight; + const texelWidth = 1 / (3 * Math.max(Math.pow(2, maxMip), 7 * 16)); + return { texelWidth, texelHeight, maxMip }; +} +function WebGLProgram(renderer, cacheKey, parameters, bindingStates) { + const gl = renderer.getContext(); + const defines = parameters.defines; + let vertexShader = parameters.vertexShader; + let fragmentShader = parameters.fragmentShader; + const shadowMapTypeDefine = generateShadowMapTypeDefine(parameters); + const envMapTypeDefine = generateEnvMapTypeDefine(parameters); + const envMapModeDefine = generateEnvMapModeDefine(parameters); + const envMapBlendingDefine = generateEnvMapBlendingDefine(parameters); + const envMapCubeUVSize = generateCubeUVSize(parameters); + const customVertexExtensions = generateVertexExtensions(parameters); + const customDefines = generateDefines(defines); + const program = gl.createProgram(); + let prefixVertex, prefixFragment; + let versionString = parameters.glslVersion ? "#version " + parameters.glslVersion + "\n" : ""; + if (parameters.isRawShaderMaterial) { + prefixVertex = [ + "#define SHADER_TYPE " + parameters.shaderType, + "#define SHADER_NAME " + parameters.shaderName, + customDefines + ].filter(filterEmptyLine).join("\n"); + if (prefixVertex.length > 0) { + prefixVertex += "\n"; + } + prefixFragment = [ + "#define SHADER_TYPE " + parameters.shaderType, + "#define SHADER_NAME " + parameters.shaderName, + customDefines + ].filter(filterEmptyLine).join("\n"); + if (prefixFragment.length > 0) { + prefixFragment += "\n"; + } + } else { + prefixVertex = [ + generatePrecision(parameters), + "#define SHADER_TYPE " + parameters.shaderType, + "#define SHADER_NAME " + parameters.shaderName, + customDefines, + parameters.extensionClipCullDistance ? "#define USE_CLIP_DISTANCE" : "", + parameters.batching ? "#define USE_BATCHING" : "", + parameters.batchingColor ? "#define USE_BATCHING_COLOR" : "", + parameters.instancing ? "#define USE_INSTANCING" : "", + parameters.instancingColor ? "#define USE_INSTANCING_COLOR" : "", + parameters.instancingMorph ? "#define USE_INSTANCING_MORPH" : "", + parameters.useFog && parameters.fog ? "#define USE_FOG" : "", + parameters.useFog && parameters.fogExp2 ? "#define FOG_EXP2" : "", + parameters.map ? "#define USE_MAP" : "", + parameters.envMap ? "#define USE_ENVMAP" : "", + parameters.envMap ? "#define " + envMapModeDefine : "", + parameters.lightMap ? "#define USE_LIGHTMAP" : "", + parameters.aoMap ? "#define USE_AOMAP" : "", + parameters.bumpMap ? "#define USE_BUMPMAP" : "", + parameters.normalMap ? "#define USE_NORMALMAP" : "", + parameters.normalMapObjectSpace ? "#define USE_NORMALMAP_OBJECTSPACE" : "", + parameters.normalMapTangentSpace ? "#define USE_NORMALMAP_TANGENTSPACE" : "", + parameters.displacementMap ? "#define USE_DISPLACEMENTMAP" : "", + parameters.emissiveMap ? "#define USE_EMISSIVEMAP" : "", + parameters.anisotropy ? "#define USE_ANISOTROPY" : "", + parameters.anisotropyMap ? "#define USE_ANISOTROPYMAP" : "", + parameters.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", + parameters.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", + parameters.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", + parameters.iridescenceMap ? "#define USE_IRIDESCENCEMAP" : "", + parameters.iridescenceThicknessMap ? "#define USE_IRIDESCENCE_THICKNESSMAP" : "", + parameters.specularMap ? "#define USE_SPECULARMAP" : "", + parameters.specularColorMap ? "#define USE_SPECULAR_COLORMAP" : "", + parameters.specularIntensityMap ? "#define USE_SPECULAR_INTENSITYMAP" : "", + parameters.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", + parameters.metalnessMap ? "#define USE_METALNESSMAP" : "", + parameters.alphaMap ? "#define USE_ALPHAMAP" : "", + parameters.alphaHash ? "#define USE_ALPHAHASH" : "", + parameters.transmission ? "#define USE_TRANSMISSION" : "", + parameters.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", + parameters.thicknessMap ? "#define USE_THICKNESSMAP" : "", + parameters.sheenColorMap ? "#define USE_SHEEN_COLORMAP" : "", + parameters.sheenRoughnessMap ? "#define USE_SHEEN_ROUGHNESSMAP" : "", + // + parameters.mapUv ? "#define MAP_UV " + parameters.mapUv : "", + parameters.alphaMapUv ? "#define ALPHAMAP_UV " + parameters.alphaMapUv : "", + parameters.lightMapUv ? "#define LIGHTMAP_UV " + parameters.lightMapUv : "", + parameters.aoMapUv ? "#define AOMAP_UV " + parameters.aoMapUv : "", + parameters.emissiveMapUv ? "#define EMISSIVEMAP_UV " + parameters.emissiveMapUv : "", + parameters.bumpMapUv ? "#define BUMPMAP_UV " + parameters.bumpMapUv : "", + parameters.normalMapUv ? "#define NORMALMAP_UV " + parameters.normalMapUv : "", + parameters.displacementMapUv ? "#define DISPLACEMENTMAP_UV " + parameters.displacementMapUv : "", + parameters.metalnessMapUv ? "#define METALNESSMAP_UV " + parameters.metalnessMapUv : "", + parameters.roughnessMapUv ? "#define ROUGHNESSMAP_UV " + parameters.roughnessMapUv : "", + parameters.anisotropyMapUv ? "#define ANISOTROPYMAP_UV " + parameters.anisotropyMapUv : "", + parameters.clearcoatMapUv ? "#define CLEARCOATMAP_UV " + parameters.clearcoatMapUv : "", + parameters.clearcoatNormalMapUv ? "#define CLEARCOAT_NORMALMAP_UV " + parameters.clearcoatNormalMapUv : "", + parameters.clearcoatRoughnessMapUv ? "#define CLEARCOAT_ROUGHNESSMAP_UV " + parameters.clearcoatRoughnessMapUv : "", + parameters.iridescenceMapUv ? "#define IRIDESCENCEMAP_UV " + parameters.iridescenceMapUv : "", + parameters.iridescenceThicknessMapUv ? "#define IRIDESCENCE_THICKNESSMAP_UV " + parameters.iridescenceThicknessMapUv : "", + parameters.sheenColorMapUv ? "#define SHEEN_COLORMAP_UV " + parameters.sheenColorMapUv : "", + parameters.sheenRoughnessMapUv ? "#define SHEEN_ROUGHNESSMAP_UV " + parameters.sheenRoughnessMapUv : "", + parameters.specularMapUv ? "#define SPECULARMAP_UV " + parameters.specularMapUv : "", + parameters.specularColorMapUv ? "#define SPECULAR_COLORMAP_UV " + parameters.specularColorMapUv : "", + parameters.specularIntensityMapUv ? "#define SPECULAR_INTENSITYMAP_UV " + parameters.specularIntensityMapUv : "", + parameters.transmissionMapUv ? "#define TRANSMISSIONMAP_UV " + parameters.transmissionMapUv : "", + parameters.thicknessMapUv ? "#define THICKNESSMAP_UV " + parameters.thicknessMapUv : "", + // + parameters.vertexTangents && parameters.flatShading === false ? "#define USE_TANGENT" : "", + parameters.vertexColors ? "#define USE_COLOR" : "", + parameters.vertexAlphas ? "#define USE_COLOR_ALPHA" : "", + parameters.vertexUv1s ? "#define USE_UV1" : "", + parameters.vertexUv2s ? "#define USE_UV2" : "", + parameters.vertexUv3s ? "#define USE_UV3" : "", + parameters.pointsUvs ? "#define USE_POINTS_UV" : "", + parameters.flatShading ? "#define FLAT_SHADED" : "", + parameters.skinning ? "#define USE_SKINNING" : "", + parameters.morphTargets ? "#define USE_MORPHTARGETS" : "", + parameters.morphNormals && parameters.flatShading === false ? "#define USE_MORPHNORMALS" : "", + parameters.morphColors ? "#define USE_MORPHCOLORS" : "", + parameters.morphTargetsCount > 0 ? "#define MORPHTARGETS_TEXTURE_STRIDE " + parameters.morphTextureStride : "", + parameters.morphTargetsCount > 0 ? "#define MORPHTARGETS_COUNT " + parameters.morphTargetsCount : "", + parameters.doubleSided ? "#define DOUBLE_SIDED" : "", + parameters.flipSided ? "#define FLIP_SIDED" : "", + parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", + parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "", + parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", + parameters.numLightProbes > 0 ? "#define USE_LIGHT_PROBES" : "", + parameters.logarithmicDepthBuffer ? "#define USE_LOGARITHMIC_DEPTH_BUFFER" : "", + parameters.reversedDepthBuffer ? "#define USE_REVERSED_DEPTH_BUFFER" : "", + "uniform mat4 modelMatrix;", + "uniform mat4 modelViewMatrix;", + "uniform mat4 projectionMatrix;", + "uniform mat4 viewMatrix;", + "uniform mat3 normalMatrix;", + "uniform vec3 cameraPosition;", + "uniform bool isOrthographic;", + "#ifdef USE_INSTANCING", + " attribute mat4 instanceMatrix;", + "#endif", + "#ifdef USE_INSTANCING_COLOR", + " attribute vec3 instanceColor;", + "#endif", + "#ifdef USE_INSTANCING_MORPH", + " uniform sampler2D morphTexture;", + "#endif", + "attribute vec3 position;", + "attribute vec3 normal;", + "attribute vec2 uv;", + "#ifdef USE_UV1", + " attribute vec2 uv1;", + "#endif", + "#ifdef USE_UV2", + " attribute vec2 uv2;", + "#endif", + "#ifdef USE_UV3", + " attribute vec2 uv3;", + "#endif", + "#ifdef USE_TANGENT", + " attribute vec4 tangent;", + "#endif", + "#if defined( USE_COLOR_ALPHA )", + " attribute vec4 color;", + "#elif defined( USE_COLOR )", + " attribute vec3 color;", + "#endif", + "#ifdef USE_SKINNING", + " attribute vec4 skinIndex;", + " attribute vec4 skinWeight;", + "#endif", + "\n" + ].filter(filterEmptyLine).join("\n"); + prefixFragment = [ + generatePrecision(parameters), + "#define SHADER_TYPE " + parameters.shaderType, + "#define SHADER_NAME " + parameters.shaderName, + customDefines, + parameters.useFog && parameters.fog ? "#define USE_FOG" : "", + parameters.useFog && parameters.fogExp2 ? "#define FOG_EXP2" : "", + parameters.alphaToCoverage ? "#define ALPHA_TO_COVERAGE" : "", + parameters.map ? "#define USE_MAP" : "", + parameters.matcap ? "#define USE_MATCAP" : "", + parameters.envMap ? "#define USE_ENVMAP" : "", + parameters.envMap ? "#define " + envMapTypeDefine : "", + parameters.envMap ? "#define " + envMapModeDefine : "", + parameters.envMap ? "#define " + envMapBlendingDefine : "", + envMapCubeUVSize ? "#define CUBEUV_TEXEL_WIDTH " + envMapCubeUVSize.texelWidth : "", + envMapCubeUVSize ? "#define CUBEUV_TEXEL_HEIGHT " + envMapCubeUVSize.texelHeight : "", + envMapCubeUVSize ? "#define CUBEUV_MAX_MIP " + envMapCubeUVSize.maxMip + ".0" : "", + parameters.lightMap ? "#define USE_LIGHTMAP" : "", + parameters.aoMap ? "#define USE_AOMAP" : "", + parameters.bumpMap ? "#define USE_BUMPMAP" : "", + parameters.normalMap ? "#define USE_NORMALMAP" : "", + parameters.normalMapObjectSpace ? "#define USE_NORMALMAP_OBJECTSPACE" : "", + parameters.normalMapTangentSpace ? "#define USE_NORMALMAP_TANGENTSPACE" : "", + parameters.emissiveMap ? "#define USE_EMISSIVEMAP" : "", + parameters.anisotropy ? "#define USE_ANISOTROPY" : "", + parameters.anisotropyMap ? "#define USE_ANISOTROPYMAP" : "", + parameters.clearcoat ? "#define USE_CLEARCOAT" : "", + parameters.clearcoatMap ? "#define USE_CLEARCOATMAP" : "", + parameters.clearcoatRoughnessMap ? "#define USE_CLEARCOAT_ROUGHNESSMAP" : "", + parameters.clearcoatNormalMap ? "#define USE_CLEARCOAT_NORMALMAP" : "", + parameters.dispersion ? "#define USE_DISPERSION" : "", + parameters.iridescence ? "#define USE_IRIDESCENCE" : "", + parameters.iridescenceMap ? "#define USE_IRIDESCENCEMAP" : "", + parameters.iridescenceThicknessMap ? "#define USE_IRIDESCENCE_THICKNESSMAP" : "", + parameters.specularMap ? "#define USE_SPECULARMAP" : "", + parameters.specularColorMap ? "#define USE_SPECULAR_COLORMAP" : "", + parameters.specularIntensityMap ? "#define USE_SPECULAR_INTENSITYMAP" : "", + parameters.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", + parameters.metalnessMap ? "#define USE_METALNESSMAP" : "", + parameters.alphaMap ? "#define USE_ALPHAMAP" : "", + parameters.alphaTest ? "#define USE_ALPHATEST" : "", + parameters.alphaHash ? "#define USE_ALPHAHASH" : "", + parameters.sheen ? "#define USE_SHEEN" : "", + parameters.sheenColorMap ? "#define USE_SHEEN_COLORMAP" : "", + parameters.sheenRoughnessMap ? "#define USE_SHEEN_ROUGHNESSMAP" : "", + parameters.transmission ? "#define USE_TRANSMISSION" : "", + parameters.transmissionMap ? "#define USE_TRANSMISSIONMAP" : "", + parameters.thicknessMap ? "#define USE_THICKNESSMAP" : "", + parameters.vertexTangents && parameters.flatShading === false ? "#define USE_TANGENT" : "", + parameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? "#define USE_COLOR" : "", + parameters.vertexAlphas ? "#define USE_COLOR_ALPHA" : "", + parameters.vertexUv1s ? "#define USE_UV1" : "", + parameters.vertexUv2s ? "#define USE_UV2" : "", + parameters.vertexUv3s ? "#define USE_UV3" : "", + parameters.pointsUvs ? "#define USE_POINTS_UV" : "", + parameters.gradientMap ? "#define USE_GRADIENTMAP" : "", + parameters.flatShading ? "#define FLAT_SHADED" : "", + parameters.doubleSided ? "#define DOUBLE_SIDED" : "", + parameters.flipSided ? "#define FLIP_SIDED" : "", + parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", + parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "", + parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : "", + parameters.numLightProbes > 0 ? "#define USE_LIGHT_PROBES" : "", + parameters.decodeVideoTexture ? "#define DECODE_VIDEO_TEXTURE" : "", + parameters.decodeVideoTextureEmissive ? "#define DECODE_VIDEO_TEXTURE_EMISSIVE" : "", + parameters.logarithmicDepthBuffer ? "#define USE_LOGARITHMIC_DEPTH_BUFFER" : "", + parameters.reversedDepthBuffer ? "#define USE_REVERSED_DEPTH_BUFFER" : "", + "uniform mat4 viewMatrix;", + "uniform vec3 cameraPosition;", + "uniform bool isOrthographic;", + parameters.toneMapping !== NoToneMapping ? "#define TONE_MAPPING" : "", + parameters.toneMapping !== NoToneMapping ? ShaderChunk["tonemapping_pars_fragment"] : "", + // this code is required here because it is used by the toneMapping() function defined below + parameters.toneMapping !== NoToneMapping ? getToneMappingFunction("toneMapping", parameters.toneMapping) : "", + parameters.dithering ? "#define DITHERING" : "", + parameters.opaque ? "#define OPAQUE" : "", + ShaderChunk["colorspace_pars_fragment"], + // this code is required here because it is used by the various encoding/decoding function defined below + getTexelEncodingFunction("linearToOutputTexel", parameters.outputColorSpace), + getLuminanceFunction(), + parameters.useDepthPacking ? "#define DEPTH_PACKING " + parameters.depthPacking : "", + "\n" + ].filter(filterEmptyLine).join("\n"); + } + vertexShader = resolveIncludes(vertexShader); + vertexShader = replaceLightNums(vertexShader, parameters); + vertexShader = replaceClippingPlaneNums(vertexShader, parameters); + fragmentShader = resolveIncludes(fragmentShader); + fragmentShader = replaceLightNums(fragmentShader, parameters); + fragmentShader = replaceClippingPlaneNums(fragmentShader, parameters); + vertexShader = unrollLoops(vertexShader); + fragmentShader = unrollLoops(fragmentShader); + if (parameters.isRawShaderMaterial !== true) { + versionString = "#version 300 es\n"; + prefixVertex = [ + customVertexExtensions, + "#define attribute in", + "#define varying out", + "#define texture2D texture" + ].join("\n") + "\n" + prefixVertex; + prefixFragment = [ + "#define varying in", + parameters.glslVersion === GLSL3 ? "" : "layout(location = 0) out highp vec4 pc_fragColor;", + parameters.glslVersion === GLSL3 ? "" : "#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" + prefixFragment; + } + const vertexGlsl = versionString + prefixVertex + vertexShader; + const fragmentGlsl = versionString + prefixFragment + fragmentShader; + const glVertexShader = WebGLShader(gl, gl.VERTEX_SHADER, vertexGlsl); + const glFragmentShader = WebGLShader(gl, gl.FRAGMENT_SHADER, fragmentGlsl); + gl.attachShader(program, glVertexShader); + gl.attachShader(program, glFragmentShader); + if (parameters.index0AttributeName !== void 0) { + gl.bindAttribLocation(program, 0, parameters.index0AttributeName); + } else if (parameters.morphTargets === true) { + gl.bindAttribLocation(program, 0, "position"); + } + gl.linkProgram(program); + function onFirstUse(self2) { + if (renderer.debug.checkShaderErrors) { + const programInfoLog = gl.getProgramInfoLog(program) || ""; + const vertexShaderInfoLog = gl.getShaderInfoLog(glVertexShader) || ""; + const fragmentShaderInfoLog = gl.getShaderInfoLog(glFragmentShader) || ""; + const programLog = programInfoLog.trim(); + const vertexLog = vertexShaderInfoLog.trim(); + const fragmentLog = fragmentShaderInfoLog.trim(); + let runnable = true; + let haveDiagnostics = true; + if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { + runnable = false; + if (typeof renderer.debug.onShaderError === "function") { + renderer.debug.onShaderError(gl, program, glVertexShader, glFragmentShader); + } else { + const vertexErrors = getShaderErrors(gl, glVertexShader, "vertex"); + const fragmentErrors = getShaderErrors(gl, glFragmentShader, "fragment"); + error( + "THREE.WebGLProgram: Shader Error " + gl.getError() + " - VALIDATE_STATUS " + gl.getProgramParameter(program, gl.VALIDATE_STATUS) + "\n\nMaterial Name: " + self2.name + "\nMaterial Type: " + self2.type + "\n\nProgram Info Log: " + programLog + "\n" + vertexErrors + "\n" + fragmentErrors + ); + } + } else if (programLog !== "") { + warn("WebGLProgram: Program Info Log:", programLog); + } else if (vertexLog === "" || fragmentLog === "") { + haveDiagnostics = false; + } + if (haveDiagnostics) { + self2.diagnostics = { + runnable, + programLog, + vertexShader: { + log: vertexLog, + prefix: prefixVertex + }, + fragmentShader: { + log: fragmentLog, + prefix: prefixFragment + } + }; + } + } + gl.deleteShader(glVertexShader); + gl.deleteShader(glFragmentShader); + cachedUniforms = new WebGLUniforms(gl, program); + cachedAttributes = fetchAttributeLocations(gl, program); + } + let cachedUniforms; + this.getUniforms = function() { + if (cachedUniforms === void 0) { + onFirstUse(this); + } + return cachedUniforms; + }; + let cachedAttributes; + this.getAttributes = function() { + if (cachedAttributes === void 0) { + onFirstUse(this); + } + return cachedAttributes; + }; + let programReady = parameters.rendererExtensionParallelShaderCompile === false; + this.isReady = function() { + if (programReady === false) { + programReady = gl.getProgramParameter(program, COMPLETION_STATUS_KHR); + } + return programReady; + }; + this.destroy = function() { + bindingStates.releaseStatesOfProgram(this); + gl.deleteProgram(program); + this.program = void 0; + }; + this.type = parameters.shaderType; + this.name = parameters.shaderName; + this.id = programIdCount++; + this.cacheKey = cacheKey; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + return this; +} +var _id2 = 0; +var WebGLShaderCache = class { + constructor() { + this.shaderCache = /* @__PURE__ */ new Map(); + this.materialCache = /* @__PURE__ */ new Map(); + } + update(material) { + const vertexShader = material.vertexShader; + const fragmentShader = material.fragmentShader; + const vertexShaderStage = this._getShaderStage(vertexShader); + const fragmentShaderStage = this._getShaderStage(fragmentShader); + const materialShaders = this._getShaderCacheForMaterial(material); + if (materialShaders.has(vertexShaderStage) === false) { + materialShaders.add(vertexShaderStage); + vertexShaderStage.usedTimes++; + } + if (materialShaders.has(fragmentShaderStage) === false) { + materialShaders.add(fragmentShaderStage); + fragmentShaderStage.usedTimes++; + } + return this; + } + remove(material) { + const materialShaders = this.materialCache.get(material); + for (const shaderStage of materialShaders) { + shaderStage.usedTimes--; + if (shaderStage.usedTimes === 0) this.shaderCache.delete(shaderStage.code); + } + this.materialCache.delete(material); + return this; + } + getVertexShaderID(material) { + return this._getShaderStage(material.vertexShader).id; + } + getFragmentShaderID(material) { + return this._getShaderStage(material.fragmentShader).id; + } + dispose() { + this.shaderCache.clear(); + this.materialCache.clear(); + } + _getShaderCacheForMaterial(material) { + const cache = this.materialCache; + let set = cache.get(material); + if (set === void 0) { + set = /* @__PURE__ */ new Set(); + cache.set(material, set); + } + return set; + } + _getShaderStage(code) { + const cache = this.shaderCache; + let stage = cache.get(code); + if (stage === void 0) { + stage = new WebGLShaderStage(code); + cache.set(code, stage); + } + return stage; + } +}; +var WebGLShaderStage = class { + constructor(code) { + this.id = _id2++; + this.code = code; + this.usedTimes = 0; + } +}; +function WebGLPrograms(renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping) { + const _programLayers = new Layers(); + const _customShaders = new WebGLShaderCache(); + const _activeChannels = /* @__PURE__ */ new Set(); + const programs = []; + const programsMap = /* @__PURE__ */ new Map(); + const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer; + let precision = capabilities.precision; + const shaderIDs = { + MeshDepthMaterial: "depth", + MeshDistanceMaterial: "distance", + 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" + }; + function getChannel(value) { + _activeChannels.add(value); + if (value === 0) return "uv"; + return `uv${value}`; + } + function getParameters(material, lights, shadows, scene, object) { + const fog = scene.fog; + const geometry = object.geometry; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + const envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || environment); + const envMapCubeUVHeight = !!envMap && envMap.mapping === CubeUVReflectionMapping ? envMap.image.height : null; + const shaderID = shaderIDs[material.type]; + if (material.precision !== null) { + precision = capabilities.getMaxPrecision(material.precision); + if (precision !== material.precision) { + warn("WebGLProgram.getParameters:", material.precision, "not supported, using", precision, "instead."); + } + } + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; + let morphTextureStride = 0; + if (geometry.morphAttributes.position !== void 0) morphTextureStride = 1; + if (geometry.morphAttributes.normal !== void 0) morphTextureStride = 2; + if (geometry.morphAttributes.color !== void 0) morphTextureStride = 3; + let vertexShader, fragmentShader; + let customVertexShaderID, customFragmentShaderID; + if (shaderID) { + const shader = ShaderLib[shaderID]; + vertexShader = shader.vertexShader; + fragmentShader = shader.fragmentShader; + } else { + vertexShader = material.vertexShader; + fragmentShader = material.fragmentShader; + _customShaders.update(material); + customVertexShaderID = _customShaders.getVertexShaderID(material); + customFragmentShaderID = _customShaders.getFragmentShaderID(material); + } + const currentRenderTarget = renderer.getRenderTarget(); + const reversedDepthBuffer = renderer.state.buffers.depth.getReversed(); + const IS_INSTANCEDMESH = object.isInstancedMesh === true; + const IS_BATCHEDMESH = object.isBatchedMesh === true; + const HAS_MAP = !!material.map; + const HAS_MATCAP = !!material.matcap; + const HAS_ENVMAP = !!envMap; + const HAS_AOMAP = !!material.aoMap; + const HAS_LIGHTMAP = !!material.lightMap; + const HAS_BUMPMAP = !!material.bumpMap; + const HAS_NORMALMAP = !!material.normalMap; + const HAS_DISPLACEMENTMAP = !!material.displacementMap; + const HAS_EMISSIVEMAP = !!material.emissiveMap; + const HAS_METALNESSMAP = !!material.metalnessMap; + const HAS_ROUGHNESSMAP = !!material.roughnessMap; + const HAS_ANISOTROPY = material.anisotropy > 0; + const HAS_CLEARCOAT = material.clearcoat > 0; + const HAS_DISPERSION = material.dispersion > 0; + const HAS_IRIDESCENCE = material.iridescence > 0; + const HAS_SHEEN = material.sheen > 0; + const HAS_TRANSMISSION = material.transmission > 0; + const HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !!material.anisotropyMap; + const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !!material.clearcoatMap; + const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !!material.clearcoatNormalMap; + const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !!material.clearcoatRoughnessMap; + const HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !!material.iridescenceMap; + const HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !!material.iridescenceThicknessMap; + const HAS_SHEEN_COLORMAP = HAS_SHEEN && !!material.sheenColorMap; + const HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !!material.sheenRoughnessMap; + const HAS_SPECULARMAP = !!material.specularMap; + const HAS_SPECULAR_COLORMAP = !!material.specularColorMap; + const HAS_SPECULAR_INTENSITYMAP = !!material.specularIntensityMap; + const HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !!material.transmissionMap; + const HAS_THICKNESSMAP = HAS_TRANSMISSION && !!material.thicknessMap; + const HAS_GRADIENTMAP = !!material.gradientMap; + const HAS_ALPHAMAP = !!material.alphaMap; + const HAS_ALPHATEST = material.alphaTest > 0; + const HAS_ALPHAHASH = !!material.alphaHash; + const HAS_EXTENSIONS = !!material.extensions; + let toneMapping = NoToneMapping; + if (material.toneMapped) { + if (currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true) { + toneMapping = renderer.toneMapping; + } + } + const parameters = { + shaderID, + shaderType: material.type, + shaderName: material.name, + vertexShader, + fragmentShader, + defines: material.defines, + customVertexShaderID, + customFragmentShaderID, + isRawShaderMaterial: material.isRawShaderMaterial === true, + glslVersion: material.glslVersion, + precision, + batching: IS_BATCHEDMESH, + batchingColor: IS_BATCHEDMESH && object._colorsTexture !== null, + instancing: IS_INSTANCEDMESH, + instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null, + instancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null, + outputColorSpace: currentRenderTarget === null ? renderer.outputColorSpace : currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace, + alphaToCoverage: !!material.alphaToCoverage, + map: HAS_MAP, + matcap: HAS_MATCAP, + envMap: HAS_ENVMAP, + envMapMode: HAS_ENVMAP && envMap.mapping, + envMapCubeUVHeight, + aoMap: HAS_AOMAP, + lightMap: HAS_LIGHTMAP, + bumpMap: HAS_BUMPMAP, + normalMap: HAS_NORMALMAP, + displacementMap: HAS_DISPLACEMENTMAP, + emissiveMap: HAS_EMISSIVEMAP, + normalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap, + normalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap, + metalnessMap: HAS_METALNESSMAP, + roughnessMap: HAS_ROUGHNESSMAP, + anisotropy: HAS_ANISOTROPY, + anisotropyMap: HAS_ANISOTROPYMAP, + clearcoat: HAS_CLEARCOAT, + clearcoatMap: HAS_CLEARCOATMAP, + clearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP, + clearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP, + dispersion: HAS_DISPERSION, + iridescence: HAS_IRIDESCENCE, + iridescenceMap: HAS_IRIDESCENCEMAP, + iridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP, + sheen: HAS_SHEEN, + sheenColorMap: HAS_SHEEN_COLORMAP, + sheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP, + specularMap: HAS_SPECULARMAP, + specularColorMap: HAS_SPECULAR_COLORMAP, + specularIntensityMap: HAS_SPECULAR_INTENSITYMAP, + transmission: HAS_TRANSMISSION, + transmissionMap: HAS_TRANSMISSIONMAP, + thicknessMap: HAS_THICKNESSMAP, + gradientMap: HAS_GRADIENTMAP, + opaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false, + alphaMap: HAS_ALPHAMAP, + alphaTest: HAS_ALPHATEST, + alphaHash: HAS_ALPHAHASH, + combine: material.combine, + // + mapUv: HAS_MAP && getChannel(material.map.channel), + aoMapUv: HAS_AOMAP && getChannel(material.aoMap.channel), + lightMapUv: HAS_LIGHTMAP && getChannel(material.lightMap.channel), + bumpMapUv: HAS_BUMPMAP && getChannel(material.bumpMap.channel), + normalMapUv: HAS_NORMALMAP && getChannel(material.normalMap.channel), + displacementMapUv: HAS_DISPLACEMENTMAP && getChannel(material.displacementMap.channel), + emissiveMapUv: HAS_EMISSIVEMAP && getChannel(material.emissiveMap.channel), + metalnessMapUv: HAS_METALNESSMAP && getChannel(material.metalnessMap.channel), + roughnessMapUv: HAS_ROUGHNESSMAP && getChannel(material.roughnessMap.channel), + anisotropyMapUv: HAS_ANISOTROPYMAP && getChannel(material.anisotropyMap.channel), + clearcoatMapUv: HAS_CLEARCOATMAP && getChannel(material.clearcoatMap.channel), + clearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel(material.clearcoatNormalMap.channel), + clearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel(material.clearcoatRoughnessMap.channel), + iridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel(material.iridescenceMap.channel), + iridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel(material.iridescenceThicknessMap.channel), + sheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel(material.sheenColorMap.channel), + sheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel(material.sheenRoughnessMap.channel), + specularMapUv: HAS_SPECULARMAP && getChannel(material.specularMap.channel), + specularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel(material.specularColorMap.channel), + specularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel(material.specularIntensityMap.channel), + transmissionMapUv: HAS_TRANSMISSIONMAP && getChannel(material.transmissionMap.channel), + thicknessMapUv: HAS_THICKNESSMAP && getChannel(material.thicknessMap.channel), + alphaMapUv: HAS_ALPHAMAP && getChannel(material.alphaMap.channel), + // + vertexTangents: !!geometry.attributes.tangent && (HAS_NORMALMAP || HAS_ANISOTROPY), + vertexColors: material.vertexColors, + vertexAlphas: material.vertexColors === true && !!geometry.attributes.color && geometry.attributes.color.itemSize === 4, + pointsUvs: object.isPoints === true && !!geometry.attributes.uv && (HAS_MAP || HAS_ALPHAMAP), + fog: !!fog, + useFog: material.fog === true, + fogExp2: !!fog && fog.isFogExp2, + flatShading: material.flatShading === true && material.wireframe === false, + sizeAttenuation: material.sizeAttenuation === true, + logarithmicDepthBuffer, + reversedDepthBuffer, + skinning: object.isSkinnedMesh === true, + morphTargets: geometry.morphAttributes.position !== void 0, + morphNormals: geometry.morphAttributes.normal !== void 0, + morphColors: geometry.morphAttributes.color !== void 0, + morphTargetsCount, + morphTextureStride, + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numSpotLightMaps: lights.spotLightMap.length, + numRectAreaLights: lights.rectArea.length, + numHemiLights: lights.hemi.length, + numDirLightShadows: lights.directionalShadowMap.length, + numPointLightShadows: lights.pointShadowMap.length, + numSpotLightShadows: lights.spotShadowMap.length, + numSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps, + numLightProbes: lights.numLightProbes, + numClippingPlanes: clipping.numPlanes, + numClipIntersection: clipping.numIntersection, + dithering: material.dithering, + shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + toneMapping, + decodeVideoTexture: HAS_MAP && material.map.isVideoTexture === true && ColorManagement.getTransfer(material.map.colorSpace) === SRGBTransfer, + decodeVideoTextureEmissive: HAS_EMISSIVEMAP && material.emissiveMap.isVideoTexture === true && ColorManagement.getTransfer(material.emissiveMap.colorSpace) === SRGBTransfer, + premultipliedAlpha: material.premultipliedAlpha, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + useDepthPacking: material.depthPacking >= 0, + depthPacking: material.depthPacking || 0, + index0AttributeName: material.index0AttributeName, + extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has("WEBGL_clip_cull_distance"), + extensionMultiDraw: (HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH) && extensions.has("WEBGL_multi_draw"), + rendererExtensionParallelShaderCompile: extensions.has("KHR_parallel_shader_compile"), + customProgramCacheKey: material.customProgramCacheKey() + }; + parameters.vertexUv1s = _activeChannels.has(1); + parameters.vertexUv2s = _activeChannels.has(2); + parameters.vertexUv3s = _activeChannels.has(3); + _activeChannels.clear(); + return parameters; + } + function getProgramCacheKey(parameters) { + const array = []; + if (parameters.shaderID) { + array.push(parameters.shaderID); + } else { + array.push(parameters.customVertexShaderID); + array.push(parameters.customFragmentShaderID); + } + if (parameters.defines !== void 0) { + for (const name in parameters.defines) { + array.push(name); + array.push(parameters.defines[name]); + } + } + if (parameters.isRawShaderMaterial === false) { + getProgramCacheKeyParameters(array, parameters); + getProgramCacheKeyBooleans(array, parameters); + array.push(renderer.outputColorSpace); + } + array.push(parameters.customProgramCacheKey); + return array.join(); + } + function getProgramCacheKeyParameters(array, parameters) { + array.push(parameters.precision); + array.push(parameters.outputColorSpace); + array.push(parameters.envMapMode); + array.push(parameters.envMapCubeUVHeight); + array.push(parameters.mapUv); + array.push(parameters.alphaMapUv); + array.push(parameters.lightMapUv); + array.push(parameters.aoMapUv); + array.push(parameters.bumpMapUv); + array.push(parameters.normalMapUv); + array.push(parameters.displacementMapUv); + array.push(parameters.emissiveMapUv); + array.push(parameters.metalnessMapUv); + array.push(parameters.roughnessMapUv); + array.push(parameters.anisotropyMapUv); + array.push(parameters.clearcoatMapUv); + array.push(parameters.clearcoatNormalMapUv); + array.push(parameters.clearcoatRoughnessMapUv); + array.push(parameters.iridescenceMapUv); + array.push(parameters.iridescenceThicknessMapUv); + array.push(parameters.sheenColorMapUv); + array.push(parameters.sheenRoughnessMapUv); + array.push(parameters.specularMapUv); + array.push(parameters.specularColorMapUv); + array.push(parameters.specularIntensityMapUv); + array.push(parameters.transmissionMapUv); + array.push(parameters.thicknessMapUv); + array.push(parameters.combine); + array.push(parameters.fogExp2); + array.push(parameters.sizeAttenuation); + array.push(parameters.morphTargetsCount); + array.push(parameters.morphAttributeCount); + array.push(parameters.numDirLights); + array.push(parameters.numPointLights); + array.push(parameters.numSpotLights); + array.push(parameters.numSpotLightMaps); + array.push(parameters.numHemiLights); + array.push(parameters.numRectAreaLights); + array.push(parameters.numDirLightShadows); + array.push(parameters.numPointLightShadows); + array.push(parameters.numSpotLightShadows); + array.push(parameters.numSpotLightShadowsWithMaps); + array.push(parameters.numLightProbes); + array.push(parameters.shadowMapType); + array.push(parameters.toneMapping); + array.push(parameters.numClippingPlanes); + array.push(parameters.numClipIntersection); + array.push(parameters.depthPacking); + } + function getProgramCacheKeyBooleans(array, parameters) { + _programLayers.disableAll(); + if (parameters.instancing) + _programLayers.enable(0); + if (parameters.instancingColor) + _programLayers.enable(1); + if (parameters.instancingMorph) + _programLayers.enable(2); + if (parameters.matcap) + _programLayers.enable(3); + if (parameters.envMap) + _programLayers.enable(4); + if (parameters.normalMapObjectSpace) + _programLayers.enable(5); + if (parameters.normalMapTangentSpace) + _programLayers.enable(6); + if (parameters.clearcoat) + _programLayers.enable(7); + if (parameters.iridescence) + _programLayers.enable(8); + if (parameters.alphaTest) + _programLayers.enable(9); + if (parameters.vertexColors) + _programLayers.enable(10); + if (parameters.vertexAlphas) + _programLayers.enable(11); + if (parameters.vertexUv1s) + _programLayers.enable(12); + if (parameters.vertexUv2s) + _programLayers.enable(13); + if (parameters.vertexUv3s) + _programLayers.enable(14); + if (parameters.vertexTangents) + _programLayers.enable(15); + if (parameters.anisotropy) + _programLayers.enable(16); + if (parameters.alphaHash) + _programLayers.enable(17); + if (parameters.batching) + _programLayers.enable(18); + if (parameters.dispersion) + _programLayers.enable(19); + if (parameters.batchingColor) + _programLayers.enable(20); + if (parameters.gradientMap) + _programLayers.enable(21); + array.push(_programLayers.mask); + _programLayers.disableAll(); + if (parameters.fog) + _programLayers.enable(0); + if (parameters.useFog) + _programLayers.enable(1); + if (parameters.flatShading) + _programLayers.enable(2); + if (parameters.logarithmicDepthBuffer) + _programLayers.enable(3); + if (parameters.reversedDepthBuffer) + _programLayers.enable(4); + if (parameters.skinning) + _programLayers.enable(5); + if (parameters.morphTargets) + _programLayers.enable(6); + if (parameters.morphNormals) + _programLayers.enable(7); + if (parameters.morphColors) + _programLayers.enable(8); + if (parameters.premultipliedAlpha) + _programLayers.enable(9); + if (parameters.shadowMapEnabled) + _programLayers.enable(10); + if (parameters.doubleSided) + _programLayers.enable(11); + if (parameters.flipSided) + _programLayers.enable(12); + if (parameters.useDepthPacking) + _programLayers.enable(13); + if (parameters.dithering) + _programLayers.enable(14); + if (parameters.transmission) + _programLayers.enable(15); + if (parameters.sheen) + _programLayers.enable(16); + if (parameters.opaque) + _programLayers.enable(17); + if (parameters.pointsUvs) + _programLayers.enable(18); + if (parameters.decodeVideoTexture) + _programLayers.enable(19); + if (parameters.decodeVideoTextureEmissive) + _programLayers.enable(20); + if (parameters.alphaToCoverage) + _programLayers.enable(21); + array.push(_programLayers.mask); + } + function getUniforms(material) { + const shaderID = shaderIDs[material.type]; + let uniforms; + if (shaderID) { + const shader = ShaderLib[shaderID]; + uniforms = UniformsUtils.clone(shader.uniforms); + } else { + uniforms = material.uniforms; + } + return uniforms; + } + function acquireProgram(parameters, cacheKey) { + let program = programsMap.get(cacheKey); + if (program !== void 0) { + ++program.usedTimes; + } else { + program = new WebGLProgram(renderer, cacheKey, parameters, bindingStates); + programs.push(program); + programsMap.set(cacheKey, program); + } + return program; + } + function releaseProgram(program) { + if (--program.usedTimes === 0) { + const i = programs.indexOf(program); + programs[i] = programs[programs.length - 1]; + programs.pop(); + programsMap.delete(program.cacheKey); + program.destroy(); + } + } + function releaseShaderCache(material) { + _customShaders.remove(material); + } + function dispose() { + _customShaders.dispose(); + } + return { + getParameters, + getProgramCacheKey, + getUniforms, + acquireProgram, + releaseProgram, + releaseShaderCache, + // Exposed for resource monitoring & error feedback via renderer.info: + programs, + dispose + }; +} +function WebGLProperties() { + let properties = /* @__PURE__ */ new WeakMap(); + function has(object) { + return properties.has(object); + } + function get(object) { + let map = properties.get(object); + if (map === void 0) { + map = {}; + properties.set(object, map); + } + return map; + } + function remove(object) { + properties.delete(object); + } + function update(object, key, value) { + properties.get(object)[key] = value; + } + function dispose() { + properties = /* @__PURE__ */ new WeakMap(); + } + return { + has, + get, + remove, + update, + dispose + }; +} +function painterSortStable(a, b) { + if (a.groupOrder !== b.groupOrder) { + return a.groupOrder - b.groupOrder; + } else if (a.renderOrder !== b.renderOrder) { + return a.renderOrder - b.renderOrder; + } else if (a.material.id !== b.material.id) { + return a.material.id - b.material.id; + } else if (a.z !== b.z) { + return a.z - b.z; + } else { + return a.id - b.id; + } +} +function reversePainterSortStable(a, b) { + if (a.groupOrder !== b.groupOrder) { + return a.groupOrder - b.groupOrder; + } else if (a.renderOrder !== b.renderOrder) { + return a.renderOrder - b.renderOrder; + } else if (a.z !== b.z) { + return b.z - a.z; + } else { + return a.id - b.id; + } +} +function WebGLRenderList() { + const renderItems = []; + let renderItemsIndex = 0; + const opaque = []; + const transmissive = []; + const transparent = []; + function init() { + renderItemsIndex = 0; + opaque.length = 0; + transmissive.length = 0; + transparent.length = 0; + } + function getNextRenderItem(object, geometry, material, groupOrder, z, group) { + let renderItem = renderItems[renderItemsIndex]; + if (renderItem === void 0) { + renderItem = { + id: object.id, + object, + geometry, + material, + groupOrder, + renderOrder: object.renderOrder, + z, + group + }; + renderItems[renderItemsIndex] = renderItem; + } else { + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.groupOrder = groupOrder; + renderItem.renderOrder = object.renderOrder; + renderItem.z = z; + renderItem.group = group; + } + renderItemsIndex++; + return renderItem; + } + function push(object, geometry, material, groupOrder, z, group) { + const renderItem = getNextRenderItem(object, geometry, material, groupOrder, z, group); + if (material.transmission > 0) { + transmissive.push(renderItem); + } else if (material.transparent === true) { + transparent.push(renderItem); + } else { + opaque.push(renderItem); + } + } + function unshift(object, geometry, material, groupOrder, z, group) { + const renderItem = getNextRenderItem(object, geometry, material, groupOrder, z, group); + if (material.transmission > 0) { + transmissive.unshift(renderItem); + } else if (material.transparent === true) { + transparent.unshift(renderItem); + } else { + opaque.unshift(renderItem); + } + } + function sort(customOpaqueSort, customTransparentSort) { + if (opaque.length > 1) opaque.sort(customOpaqueSort || painterSortStable); + if (transmissive.length > 1) transmissive.sort(customTransparentSort || reversePainterSortStable); + if (transparent.length > 1) transparent.sort(customTransparentSort || reversePainterSortStable); + } + function finish() { + for (let i = renderItemsIndex, il = renderItems.length; i < il; i++) { + const renderItem = renderItems[i]; + if (renderItem.id === null) break; + renderItem.id = null; + renderItem.object = null; + renderItem.geometry = null; + renderItem.material = null; + renderItem.group = null; + } + } + return { + opaque, + transmissive, + transparent, + init, + push, + unshift, + finish, + sort + }; +} +function WebGLRenderLists() { + let lists = /* @__PURE__ */ new WeakMap(); + function get(scene, renderCallDepth) { + const listArray = lists.get(scene); + let list; + if (listArray === void 0) { + list = new WebGLRenderList(); + lists.set(scene, [list]); + } else { + if (renderCallDepth >= listArray.length) { + list = new WebGLRenderList(); + listArray.push(list); + } else { + list = listArray[renderCallDepth]; + } + } + return list; + } + function dispose() { + lists = /* @__PURE__ */ new WeakMap(); + } + return { + get, + dispose + }; +} +function UniformsCache() { + const lights = {}; + return { + get: function(light) { + if (lights[light.id] !== void 0) { + return lights[light.id]; + } + let uniforms; + switch (light.type) { + case "DirectionalLight": + uniforms = { + direction: new Vector3(), + color: new Color() + }; + break; + case "SpotLight": + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0 + }; + break; + case "PointLight": + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0 + }; + break; + case "HemisphereLight": + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + case "RectAreaLight": + uniforms = { + color: new Color(), + position: new Vector3(), + halfWidth: new Vector3(), + halfHeight: new Vector3() + }; + break; + } + lights[light.id] = uniforms; + return uniforms; + } + }; +} +function ShadowUniformsCache() { + const lights = {}; + return { + get: function(light) { + if (lights[light.id] !== void 0) { + return lights[light.id]; + } + let uniforms; + switch (light.type) { + case "DirectionalLight": + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + case "SpotLight": + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + case "PointLight": + uniforms = { + shadowIntensity: 1, + shadowBias: 0, + shadowNormalBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2(), + shadowCameraNear: 1, + shadowCameraFar: 1e3 + }; + break; + } + lights[light.id] = uniforms; + return uniforms; + } + }; +} +var nextVersion = 0; +function shadowCastingAndTexturingLightsFirst(lightA, lightB) { + return (lightB.castShadow ? 2 : 0) - (lightA.castShadow ? 2 : 0) + (lightB.map ? 1 : 0) - (lightA.map ? 1 : 0); +} +function WebGLLights(extensions) { + const cache = new UniformsCache(); + const shadowCache = ShadowUniformsCache(); + const state = { + version: 0, + hash: { + directionalLength: -1, + pointLength: -1, + spotLength: -1, + rectAreaLength: -1, + hemiLength: -1, + numDirectionalShadows: -1, + numPointShadows: -1, + numSpotShadows: -1, + numSpotMaps: -1, + numLightProbes: -1 + }, + ambient: [0, 0, 0], + probe: [], + directional: [], + directionalShadow: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotLightMap: [], + spotShadow: [], + spotShadowMap: [], + spotLightMatrix: [], + rectArea: [], + rectAreaLTC1: null, + rectAreaLTC2: null, + point: [], + pointShadow: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + numSpotLightShadowsWithMaps: 0, + numLightProbes: 0 + }; + for (let i = 0; i < 9; i++) state.probe.push(new Vector3()); + const vector3 = new Vector3(); + const matrix4 = new Matrix4(); + const matrix42 = new Matrix4(); + function setup(lights) { + let r = 0, g = 0, b = 0; + for (let i = 0; i < 9; i++) state.probe[i].set(0, 0, 0); + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + let numDirectionalShadows = 0; + let numPointShadows = 0; + let numSpotShadows = 0; + let numSpotMaps = 0; + let numSpotShadowsWithMaps = 0; + let numLightProbes = 0; + lights.sort(shadowCastingAndTexturingLightsFirst); + for (let i = 0, l = lights.length; i < l; i++) { + const light = lights[i]; + const color = light.color; + const intensity = light.intensity; + const distance = light.distance; + let shadowMap = null; + if (light.shadow && light.shadow.map) { + if (light.shadow.map.texture.format === RGFormat) { + shadowMap = light.shadow.map.texture; + } else { + shadowMap = light.shadow.map.depthTexture || light.shadow.map.texture; + } + } + if (light.isAmbientLight) { + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + } else if (light.isLightProbe) { + for (let j = 0; j < 9; j++) { + state.probe[j].addScaledVector(light.sh.coefficients[j], intensity); + } + numLightProbes++; + } else if (light.isDirectionalLight) { + const uniforms = cache.get(light); + uniforms.color.copy(light.color).multiplyScalar(light.intensity); + if (light.castShadow) { + const shadow = light.shadow; + const shadowUniforms = shadowCache.get(light); + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + state.directionalShadow[directionalLength] = shadowUniforms; + state.directionalShadowMap[directionalLength] = shadowMap; + state.directionalShadowMatrix[directionalLength] = light.shadow.matrix; + numDirectionalShadows++; + } + state.directional[directionalLength] = uniforms; + directionalLength++; + } else if (light.isSpotLight) { + const uniforms = cache.get(light); + uniforms.position.setFromMatrixPosition(light.matrixWorld); + uniforms.color.copy(color).multiplyScalar(intensity); + uniforms.distance = distance; + uniforms.coneCos = Math.cos(light.angle); + uniforms.penumbraCos = Math.cos(light.angle * (1 - light.penumbra)); + uniforms.decay = light.decay; + state.spot[spotLength] = uniforms; + const shadow = light.shadow; + if (light.map) { + state.spotLightMap[numSpotMaps] = light.map; + numSpotMaps++; + shadow.updateMatrices(light); + if (light.castShadow) numSpotShadowsWithMaps++; + } + state.spotLightMatrix[spotLength] = shadow.matrix; + if (light.castShadow) { + const shadowUniforms = shadowCache.get(light); + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + state.spotShadow[spotLength] = shadowUniforms; + state.spotShadowMap[spotLength] = shadowMap; + numSpotShadows++; + } + spotLength++; + } else if (light.isRectAreaLight) { + const uniforms = cache.get(light); + uniforms.color.copy(color).multiplyScalar(intensity); + uniforms.halfWidth.set(light.width * 0.5, 0, 0); + uniforms.halfHeight.set(0, light.height * 0.5, 0); + state.rectArea[rectAreaLength] = uniforms; + rectAreaLength++; + } else if (light.isPointLight) { + const uniforms = cache.get(light); + uniforms.color.copy(light.color).multiplyScalar(light.intensity); + uniforms.distance = light.distance; + uniforms.decay = light.decay; + if (light.castShadow) { + const shadow = light.shadow; + const shadowUniforms = shadowCache.get(light); + shadowUniforms.shadowIntensity = shadow.intensity; + shadowUniforms.shadowBias = shadow.bias; + shadowUniforms.shadowNormalBias = shadow.normalBias; + shadowUniforms.shadowRadius = shadow.radius; + shadowUniforms.shadowMapSize = shadow.mapSize; + shadowUniforms.shadowCameraNear = shadow.camera.near; + shadowUniforms.shadowCameraFar = shadow.camera.far; + state.pointShadow[pointLength] = shadowUniforms; + state.pointShadowMap[pointLength] = shadowMap; + state.pointShadowMatrix[pointLength] = light.shadow.matrix; + numPointShadows++; + } + state.point[pointLength] = uniforms; + pointLength++; + } else if (light.isHemisphereLight) { + const uniforms = cache.get(light); + uniforms.skyColor.copy(light.color).multiplyScalar(intensity); + uniforms.groundColor.copy(light.groundColor).multiplyScalar(intensity); + state.hemi[hemiLength] = uniforms; + hemiLength++; + } + } + if (rectAreaLength > 0) { + if (extensions.has("OES_texture_float_linear") === true) { + state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1; + state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2; + } else { + state.rectAreaLTC1 = UniformsLib.LTC_HALF_1; + state.rectAreaLTC2 = UniformsLib.LTC_HALF_2; + } + } + state.ambient[0] = r; + state.ambient[1] = g; + state.ambient[2] = b; + const hash = state.hash; + if (hash.directionalLength !== directionalLength || hash.pointLength !== pointLength || hash.spotLength !== spotLength || hash.rectAreaLength !== rectAreaLength || hash.hemiLength !== hemiLength || hash.numDirectionalShadows !== numDirectionalShadows || hash.numPointShadows !== numPointShadows || hash.numSpotShadows !== numSpotShadows || hash.numSpotMaps !== numSpotMaps || hash.numLightProbes !== numLightProbes) { + state.directional.length = directionalLength; + state.spot.length = spotLength; + state.rectArea.length = rectAreaLength; + state.point.length = pointLength; + state.hemi.length = hemiLength; + state.directionalShadow.length = numDirectionalShadows; + state.directionalShadowMap.length = numDirectionalShadows; + state.pointShadow.length = numPointShadows; + state.pointShadowMap.length = numPointShadows; + state.spotShadow.length = numSpotShadows; + state.spotShadowMap.length = numSpotShadows; + state.directionalShadowMatrix.length = numDirectionalShadows; + state.pointShadowMatrix.length = numPointShadows; + state.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps; + state.spotLightMap.length = numSpotMaps; + state.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps; + state.numLightProbes = numLightProbes; + hash.directionalLength = directionalLength; + hash.pointLength = pointLength; + hash.spotLength = spotLength; + hash.rectAreaLength = rectAreaLength; + hash.hemiLength = hemiLength; + hash.numDirectionalShadows = numDirectionalShadows; + hash.numPointShadows = numPointShadows; + hash.numSpotShadows = numSpotShadows; + hash.numSpotMaps = numSpotMaps; + hash.numLightProbes = numLightProbes; + state.version = nextVersion++; + } + } + function setupView(lights, camera) { + let directionalLength = 0; + let pointLength = 0; + let spotLength = 0; + let rectAreaLength = 0; + let hemiLength = 0; + const viewMatrix = camera.matrixWorldInverse; + for (let i = 0, l = lights.length; i < l; i++) { + const light = lights[i]; + if (light.isDirectionalLight) { + const uniforms = state.directional[directionalLength]; + uniforms.direction.setFromMatrixPosition(light.matrixWorld); + vector3.setFromMatrixPosition(light.target.matrixWorld); + uniforms.direction.sub(vector3); + uniforms.direction.transformDirection(viewMatrix); + directionalLength++; + } else if (light.isSpotLight) { + const uniforms = state.spot[spotLength]; + uniforms.position.setFromMatrixPosition(light.matrixWorld); + uniforms.position.applyMatrix4(viewMatrix); + uniforms.direction.setFromMatrixPosition(light.matrixWorld); + vector3.setFromMatrixPosition(light.target.matrixWorld); + uniforms.direction.sub(vector3); + uniforms.direction.transformDirection(viewMatrix); + spotLength++; + } else if (light.isRectAreaLight) { + const uniforms = state.rectArea[rectAreaLength]; + uniforms.position.setFromMatrixPosition(light.matrixWorld); + uniforms.position.applyMatrix4(viewMatrix); + matrix42.identity(); + matrix4.copy(light.matrixWorld); + matrix4.premultiply(viewMatrix); + matrix42.extractRotation(matrix4); + uniforms.halfWidth.set(light.width * 0.5, 0, 0); + uniforms.halfHeight.set(0, light.height * 0.5, 0); + uniforms.halfWidth.applyMatrix4(matrix42); + uniforms.halfHeight.applyMatrix4(matrix42); + rectAreaLength++; + } else if (light.isPointLight) { + const uniforms = state.point[pointLength]; + uniforms.position.setFromMatrixPosition(light.matrixWorld); + uniforms.position.applyMatrix4(viewMatrix); + pointLength++; + } else if (light.isHemisphereLight) { + const uniforms = state.hemi[hemiLength]; + uniforms.direction.setFromMatrixPosition(light.matrixWorld); + uniforms.direction.transformDirection(viewMatrix); + hemiLength++; + } + } + } + return { + setup, + setupView, + state + }; +} +function WebGLRenderState(extensions) { + const lights = new WebGLLights(extensions); + const lightsArray = []; + const shadowsArray = []; + function init(camera) { + state.camera = camera; + lightsArray.length = 0; + shadowsArray.length = 0; + } + function pushLight(light) { + lightsArray.push(light); + } + function pushShadow(shadowLight) { + shadowsArray.push(shadowLight); + } + function setupLights() { + lights.setup(lightsArray); + } + function setupLightsView(camera) { + lights.setupView(lightsArray, camera); + } + const state = { + lightsArray, + shadowsArray, + camera: null, + lights, + transmissionRenderTarget: {} + }; + return { + init, + state, + setupLights, + setupLightsView, + pushLight, + pushShadow + }; +} +function WebGLRenderStates(extensions) { + let renderStates = /* @__PURE__ */ new WeakMap(); + function get(scene, renderCallDepth = 0) { + const renderStateArray = renderStates.get(scene); + let renderState; + if (renderStateArray === void 0) { + renderState = new WebGLRenderState(extensions); + renderStates.set(scene, [renderState]); + } else { + if (renderCallDepth >= renderStateArray.length) { + renderState = new WebGLRenderState(extensions); + renderStateArray.push(renderState); + } else { + renderState = renderStateArray[renderCallDepth]; + } + } + return renderState; + } + function dispose() { + renderStates = /* @__PURE__ */ new WeakMap(); + } + return { + get, + dispose + }; +} +var vertex = "void main() {\n gl_Position = vec4( position, 1.0 );\n}"; +var fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n const float samples = float( VSM_SAMPLES );\n float mean = 0.0;\n float squared_mean = 0.0;\n float uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n float uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n for ( float i = 0.0; i < samples; i ++ ) {\n float uvOffset = uvStart + i * uvStride;\n #ifdef HORIZONTAL_PASS\n vec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n mean += distribution.x;\n squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n #else\n float depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n mean += depth;\n squared_mean += depth * depth;\n #endif\n }\n mean = mean / samples;\n squared_mean = squared_mean / samples;\n float std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n gl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; +var _cubeDirections = [ + new Vector3(1, 0, 0), + new Vector3(-1, 0, 0), + new Vector3(0, 1, 0), + new Vector3(0, -1, 0), + new Vector3(0, 0, 1), + new Vector3(0, 0, -1) +]; +var _cubeUps = [ + new Vector3(0, -1, 0), + new Vector3(0, -1, 0), + new Vector3(0, 0, 1), + new Vector3(0, 0, -1), + new Vector3(0, -1, 0), + new Vector3(0, -1, 0) +]; +var _projScreenMatrix2 = new Matrix4(); +var _lightPositionWorld2 = new Vector3(); +var _lookTarget2 = new Vector3(); +function WebGLShadowMap(renderer, objects, capabilities) { + let _frustum2 = new Frustum(); + const _shadowMapSize = new Vector2(), _viewportSize = new Vector2(), _viewport = new Vector4(), _depthMaterial = new MeshDepthMaterial(), _distanceMaterial = new MeshDistanceMaterial(), _materialCache = {}, _maxTextureSize = capabilities.maxTextureSize; + const shadowSide = { [FrontSide]: BackSide, [BackSide]: FrontSide, [DoubleSide]: DoubleSide }; + const shadowMaterialVertical = new ShaderMaterial({ + defines: { + VSM_SAMPLES: 8 + }, + uniforms: { + shadow_pass: { value: null }, + resolution: { value: new Vector2() }, + radius: { value: 4 } + }, + vertexShader: vertex, + fragmentShader: fragment + }); + const shadowMaterialHorizontal = shadowMaterialVertical.clone(); + shadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1; + const fullScreenTri = new BufferGeometry(); + fullScreenTri.setAttribute( + "position", + new BufferAttribute( + new Float32Array([-1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5]), + 3 + ) + ); + const fullScreenMesh = new Mesh(fullScreenTri, shadowMaterialVertical); + const scope = this; + this.enabled = false; + this.autoUpdate = true; + this.needsUpdate = false; + this.type = PCFShadowMap; + let _previousType = this.type; + this.render = function(lights, scene, camera) { + if (scope.enabled === false) return; + if (scope.autoUpdate === false && scope.needsUpdate === false) return; + if (lights.length === 0) return; + if (lights.type === PCFSoftShadowMap) { + warn("WebGLShadowMap: PCFSoftShadowMap has been deprecated. Using PCFShadowMap instead."); + lights.type = PCFShadowMap; + } + const currentRenderTarget = renderer.getRenderTarget(); + const activeCubeFace = renderer.getActiveCubeFace(); + const activeMipmapLevel = renderer.getActiveMipmapLevel(); + const _state = renderer.state; + _state.setBlending(NoBlending); + if (_state.buffers.depth.getReversed() === true) { + _state.buffers.color.setClear(0, 0, 0, 0); + } else { + _state.buffers.color.setClear(1, 1, 1, 1); + } + _state.buffers.depth.setTest(true); + _state.setScissorTest(false); + const typeChanged = _previousType !== this.type; + if (typeChanged) { + scene.traverse(function(object) { + if (object.material) { + if (Array.isArray(object.material)) { + object.material.forEach((mat) => mat.needsUpdate = true); + } else { + object.material.needsUpdate = true; + } + } + }); + } + for (let i = 0, il = lights.length; i < il; i++) { + const light = lights[i]; + const shadow = light.shadow; + if (shadow === void 0) { + warn("WebGLShadowMap:", light, "has no shadow."); + continue; + } + if (shadow.autoUpdate === false && shadow.needsUpdate === false) continue; + _shadowMapSize.copy(shadow.mapSize); + const shadowFrameExtents = shadow.getFrameExtents(); + _shadowMapSize.multiply(shadowFrameExtents); + _viewportSize.copy(shadow.mapSize); + if (_shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize) { + if (_shadowMapSize.x > _maxTextureSize) { + _viewportSize.x = Math.floor(_maxTextureSize / shadowFrameExtents.x); + _shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x; + shadow.mapSize.x = _viewportSize.x; + } + if (_shadowMapSize.y > _maxTextureSize) { + _viewportSize.y = Math.floor(_maxTextureSize / shadowFrameExtents.y); + _shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y; + shadow.mapSize.y = _viewportSize.y; + } + } + if (shadow.map === null || typeChanged === true) { + if (shadow.map !== null) { + if (shadow.map.depthTexture !== null) { + shadow.map.depthTexture.dispose(); + shadow.map.depthTexture = null; + } + shadow.map.dispose(); + } + if (this.type === VSMShadowMap) { + if (light.isPointLight) { + warn("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead."); + continue; + } + shadow.map = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, { + format: RGFormat, + type: HalfFloatType, + minFilter: LinearFilter, + magFilter: LinearFilter, + generateMipmaps: false + }); + shadow.map.texture.name = light.name + ".shadowMap"; + shadow.map.depthTexture = new DepthTexture(_shadowMapSize.x, _shadowMapSize.y, FloatType); + shadow.map.depthTexture.name = light.name + ".shadowMapDepth"; + shadow.map.depthTexture.format = DepthFormat; + shadow.map.depthTexture.compareFunction = null; + shadow.map.depthTexture.minFilter = NearestFilter; + shadow.map.depthTexture.magFilter = NearestFilter; + } else { + if (light.isPointLight) { + shadow.map = new WebGLCubeRenderTarget(_shadowMapSize.x); + shadow.map.depthTexture = new CubeDepthTexture(_shadowMapSize.x, UnsignedIntType); + } else { + shadow.map = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y); + shadow.map.depthTexture = new DepthTexture(_shadowMapSize.x, _shadowMapSize.y, UnsignedIntType); + } + shadow.map.depthTexture.name = light.name + ".shadowMap"; + shadow.map.depthTexture.format = DepthFormat; + const reversedDepthBuffer = renderer.state.buffers.depth.getReversed(); + if (this.type === PCFShadowMap) { + shadow.map.depthTexture.compareFunction = reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare; + shadow.map.depthTexture.minFilter = LinearFilter; + shadow.map.depthTexture.magFilter = LinearFilter; + } else { + shadow.map.depthTexture.compareFunction = null; + shadow.map.depthTexture.minFilter = NearestFilter; + shadow.map.depthTexture.magFilter = NearestFilter; + } + } + shadow.camera.updateProjectionMatrix(); + } + const faceCount = shadow.map.isWebGLCubeRenderTarget ? 6 : 1; + for (let face = 0; face < faceCount; face++) { + if (shadow.map.isWebGLCubeRenderTarget) { + renderer.setRenderTarget(shadow.map, face); + renderer.clear(); + } else { + if (face === 0) { + renderer.setRenderTarget(shadow.map); + renderer.clear(); + } + const viewport = shadow.getViewport(face); + _viewport.set( + _viewportSize.x * viewport.x, + _viewportSize.y * viewport.y, + _viewportSize.x * viewport.z, + _viewportSize.y * viewport.w + ); + _state.viewport(_viewport); + } + if (light.isPointLight) { + const camera2 = shadow.camera; + const shadowMatrix = shadow.matrix; + const far = light.distance || camera2.far; + if (far !== camera2.far) { + camera2.far = far; + camera2.updateProjectionMatrix(); + } + _lightPositionWorld2.setFromMatrixPosition(light.matrixWorld); + camera2.position.copy(_lightPositionWorld2); + _lookTarget2.copy(camera2.position); + _lookTarget2.add(_cubeDirections[face]); + camera2.up.copy(_cubeUps[face]); + camera2.lookAt(_lookTarget2); + camera2.updateMatrixWorld(); + shadowMatrix.makeTranslation(-_lightPositionWorld2.x, -_lightPositionWorld2.y, -_lightPositionWorld2.z); + _projScreenMatrix2.multiplyMatrices(camera2.projectionMatrix, camera2.matrixWorldInverse); + shadow._frustum.setFromProjectionMatrix(_projScreenMatrix2, camera2.coordinateSystem, camera2.reversedDepth); + } else { + shadow.updateMatrices(light); + } + _frustum2 = shadow.getFrustum(); + renderObject(scene, camera, shadow.camera, light, this.type); + } + if (shadow.isPointLightShadow !== true && this.type === VSMShadowMap) { + VSMPass(shadow, camera); + } + shadow.needsUpdate = false; + } + _previousType = this.type; + scope.needsUpdate = false; + renderer.setRenderTarget(currentRenderTarget, activeCubeFace, activeMipmapLevel); + }; + function VSMPass(shadow, camera) { + const geometry = objects.update(fullScreenMesh); + if (shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples) { + shadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples; + shadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples; + shadowMaterialVertical.needsUpdate = true; + shadowMaterialHorizontal.needsUpdate = true; + } + if (shadow.mapPass === null) { + shadow.mapPass = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, { + format: RGFormat, + type: HalfFloatType + }); + } + shadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.depthTexture; + shadowMaterialVertical.uniforms.resolution.value = shadow.mapSize; + shadowMaterialVertical.uniforms.radius.value = shadow.radius; + renderer.setRenderTarget(shadow.mapPass); + renderer.clear(); + renderer.renderBufferDirect(camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null); + shadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture; + shadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize; + shadowMaterialHorizontal.uniforms.radius.value = shadow.radius; + renderer.setRenderTarget(shadow.map); + renderer.clear(); + renderer.renderBufferDirect(camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null); + } + function getDepthMaterial(object, material, light, type) { + let result = null; + const customMaterial = light.isPointLight === true ? object.customDistanceMaterial : object.customDepthMaterial; + if (customMaterial !== void 0) { + result = customMaterial; + } else { + result = light.isPointLight === true ? _distanceMaterial : _depthMaterial; + if (renderer.localClippingEnabled && material.clipShadows === true && Array.isArray(material.clippingPlanes) && material.clippingPlanes.length !== 0 || material.displacementMap && material.displacementScale !== 0 || material.alphaMap && material.alphaTest > 0 || material.map && material.alphaTest > 0 || material.alphaToCoverage === true) { + const keyA = result.uuid, keyB = material.uuid; + let materialsForVariant = _materialCache[keyA]; + if (materialsForVariant === void 0) { + materialsForVariant = {}; + _materialCache[keyA] = materialsForVariant; + } + let cachedMaterial = materialsForVariant[keyB]; + if (cachedMaterial === void 0) { + cachedMaterial = result.clone(); + materialsForVariant[keyB] = cachedMaterial; + material.addEventListener("dispose", onMaterialDispose); + } + result = cachedMaterial; + } + } + result.visible = material.visible; + result.wireframe = material.wireframe; + if (type === VSMShadowMap) { + result.side = material.shadowSide !== null ? material.shadowSide : material.side; + } else { + result.side = material.shadowSide !== null ? material.shadowSide : shadowSide[material.side]; + } + result.alphaMap = material.alphaMap; + result.alphaTest = material.alphaToCoverage === true ? 0.5 : material.alphaTest; + result.map = material.map; + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + result.clipIntersection = material.clipIntersection; + result.displacementMap = material.displacementMap; + result.displacementScale = material.displacementScale; + result.displacementBias = material.displacementBias; + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + if (light.isPointLight === true && result.isMeshDistanceMaterial === true) { + const materialProperties = renderer.properties.get(result); + materialProperties.light = light; + } + return result; + } + function renderObject(object, camera, shadowCamera, light, type) { + if (object.visible === false) return; + const visible = object.layers.test(camera.layers); + if (visible && (object.isMesh || object.isLine || object.isPoints)) { + if ((object.castShadow || object.receiveShadow && type === VSMShadowMap) && (!object.frustumCulled || _frustum2.intersectsObject(object))) { + object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse, object.matrixWorld); + const geometry = objects.update(object); + const material = object.material; + if (Array.isArray(material)) { + const groups = geometry.groups; + for (let k = 0, kl = groups.length; k < kl; k++) { + const group = groups[k]; + const groupMaterial = material[group.materialIndex]; + if (groupMaterial && groupMaterial.visible) { + const depthMaterial = getDepthMaterial(object, groupMaterial, light, type); + object.onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, group); + renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, group); + object.onAfterShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, group); + } + } + } else if (material.visible) { + const depthMaterial = getDepthMaterial(object, material, light, type); + object.onBeforeShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, null); + renderer.renderBufferDirect(shadowCamera, null, geometry, depthMaterial, object, null); + object.onAfterShadow(renderer, object, camera, shadowCamera, geometry, depthMaterial, null); + } + } + } + const children = object.children; + for (let i = 0, l = children.length; i < l; i++) { + renderObject(children[i], camera, shadowCamera, light, type); + } + } + function onMaterialDispose(event) { + const material = event.target; + material.removeEventListener("dispose", onMaterialDispose); + for (const id in _materialCache) { + const cache = _materialCache[id]; + const uuid = event.target.uuid; + if (uuid in cache) { + const shadowMaterial = cache[uuid]; + shadowMaterial.dispose(); + delete cache[uuid]; + } + } + } +} +var reversedFuncs = { + [NeverDepth]: AlwaysDepth, + [LessDepth]: GreaterDepth, + [EqualDepth]: NotEqualDepth, + [LessEqualDepth]: GreaterEqualDepth, + [AlwaysDepth]: NeverDepth, + [GreaterDepth]: LessDepth, + [NotEqualDepth]: EqualDepth, + [GreaterEqualDepth]: LessEqualDepth +}; +function WebGLState(gl, extensions) { + function ColorBuffer() { + let locked = false; + const color = new Vector4(); + let currentColorMask = null; + const currentColorClear = new Vector4(0, 0, 0, 0); + return { + setMask: function(colorMask) { + if (currentColorMask !== colorMask && !locked) { + gl.colorMask(colorMask, colorMask, colorMask, colorMask); + currentColorMask = colorMask; + } + }, + setLocked: function(lock) { + locked = lock; + }, + setClear: function(r, g, b, a, premultipliedAlpha) { + if (premultipliedAlpha === true) { + r *= a; + g *= a; + b *= a; + } + color.set(r, g, b, a); + if (currentColorClear.equals(color) === false) { + gl.clearColor(r, g, b, a); + currentColorClear.copy(color); + } + }, + reset: function() { + locked = false; + currentColorMask = null; + currentColorClear.set(-1, 0, 0, 0); + } + }; + } + function DepthBuffer() { + let locked = false; + let currentReversed = false; + let currentDepthMask = null; + let currentDepthFunc = null; + let currentDepthClear = null; + return { + setReversed: function(reversed) { + if (currentReversed !== reversed) { + const ext = extensions.get("EXT_clip_control"); + if (reversed) { + ext.clipControlEXT(ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT); + } else { + ext.clipControlEXT(ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT); + } + currentReversed = reversed; + const oldDepth = currentDepthClear; + currentDepthClear = null; + this.setClear(oldDepth); + } + }, + getReversed: function() { + return currentReversed; + }, + setTest: function(depthTest) { + if (depthTest) { + enable(gl.DEPTH_TEST); + } else { + disable(gl.DEPTH_TEST); + } + }, + setMask: function(depthMask) { + if (currentDepthMask !== depthMask && !locked) { + gl.depthMask(depthMask); + currentDepthMask = depthMask; + } + }, + setFunc: function(depthFunc) { + if (currentReversed) depthFunc = reversedFuncs[depthFunc]; + if (currentDepthFunc !== depthFunc) { + switch (depthFunc) { + case NeverDepth: + gl.depthFunc(gl.NEVER); + break; + case AlwaysDepth: + gl.depthFunc(gl.ALWAYS); + break; + case LessDepth: + gl.depthFunc(gl.LESS); + break; + case LessEqualDepth: + gl.depthFunc(gl.LEQUAL); + break; + case EqualDepth: + gl.depthFunc(gl.EQUAL); + break; + case GreaterEqualDepth: + gl.depthFunc(gl.GEQUAL); + break; + case GreaterDepth: + gl.depthFunc(gl.GREATER); + break; + case NotEqualDepth: + gl.depthFunc(gl.NOTEQUAL); + break; + default: + gl.depthFunc(gl.LEQUAL); + } + currentDepthFunc = depthFunc; + } + }, + setLocked: function(lock) { + locked = lock; + }, + setClear: function(depth) { + if (currentDepthClear !== depth) { + if (currentReversed) { + depth = 1 - depth; + } + gl.clearDepth(depth); + currentDepthClear = depth; + } + }, + reset: function() { + locked = false; + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + currentReversed = false; + } + }; + } + function StencilBuffer() { + let locked = false; + let currentStencilMask = null; + let currentStencilFunc = null; + let currentStencilRef = null; + let currentStencilFuncMask = null; + let currentStencilFail = null; + let currentStencilZFail = null; + let currentStencilZPass = null; + let currentStencilClear = null; + return { + setTest: function(stencilTest) { + if (!locked) { + if (stencilTest) { + enable(gl.STENCIL_TEST); + } else { + disable(gl.STENCIL_TEST); + } + } + }, + setMask: function(stencilMask) { + if (currentStencilMask !== stencilMask && !locked) { + gl.stencilMask(stencilMask); + currentStencilMask = stencilMask; + } + }, + setFunc: function(stencilFunc, stencilRef, stencilMask) { + if (currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask) { + gl.stencilFunc(stencilFunc, stencilRef, stencilMask); + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + } + }, + setOp: function(stencilFail, stencilZFail, stencilZPass) { + if (currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass) { + gl.stencilOp(stencilFail, stencilZFail, stencilZPass); + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + } + }, + setLocked: function(lock) { + locked = lock; + }, + setClear: function(stencil) { + if (currentStencilClear !== stencil) { + gl.clearStencil(stencil); + currentStencilClear = stencil; + } + }, + reset: function() { + locked = false; + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + } + }; + } + const colorBuffer = new ColorBuffer(); + const depthBuffer = new DepthBuffer(); + const stencilBuffer = new StencilBuffer(); + const uboBindings = /* @__PURE__ */ new WeakMap(); + const uboProgramMap = /* @__PURE__ */ new WeakMap(); + let enabledCapabilities = {}; + let currentBoundFramebuffers = {}; + let currentDrawbuffers = /* @__PURE__ */ new WeakMap(); + let defaultDrawbuffers = []; + let currentProgram = null; + let currentBlendingEnabled = false; + let currentBlending = null; + let currentBlendEquation = null; + let currentBlendSrc = null; + let currentBlendDst = null; + let currentBlendEquationAlpha = null; + let currentBlendSrcAlpha = null; + let currentBlendDstAlpha = null; + let currentBlendColor = new Color(0, 0, 0); + let currentBlendAlpha = 0; + let currentPremultipledAlpha = false; + let currentFlipSided = null; + let currentCullFace = null; + let currentLineWidth = null; + let currentPolygonOffsetFactor = null; + let currentPolygonOffsetUnits = null; + const maxTextures = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS); + let lineWidthAvailable = false; + let version = 0; + const glVersion = gl.getParameter(gl.VERSION); + if (glVersion.indexOf("WebGL") !== -1) { + version = parseFloat(/^WebGL (\d)/.exec(glVersion)[1]); + lineWidthAvailable = version >= 1; + } else if (glVersion.indexOf("OpenGL ES") !== -1) { + version = parseFloat(/^OpenGL ES (\d)/.exec(glVersion)[1]); + lineWidthAvailable = version >= 2; + } + let currentTextureSlot = null; + let currentBoundTextures = {}; + const scissorParam = gl.getParameter(gl.SCISSOR_BOX); + const viewportParam = gl.getParameter(gl.VIEWPORT); + const currentScissor = new Vector4().fromArray(scissorParam); + const currentViewport = new Vector4().fromArray(viewportParam); + function createTexture(type, target, count, dimensions) { + const data = new Uint8Array(4); + const texture = gl.createTexture(); + gl.bindTexture(type, texture); + gl.texParameteri(type, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(type, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + for (let i = 0; i < count; i++) { + if (type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY) { + gl.texImage3D(target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + } else { + gl.texImage2D(target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + } + } + return texture; + } + const emptyTextures = {}; + emptyTextures[gl.TEXTURE_2D] = createTexture(gl.TEXTURE_2D, gl.TEXTURE_2D, 1); + emptyTextures[gl.TEXTURE_CUBE_MAP] = createTexture(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6); + emptyTextures[gl.TEXTURE_2D_ARRAY] = createTexture(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1); + emptyTextures[gl.TEXTURE_3D] = createTexture(gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1); + colorBuffer.setClear(0, 0, 0, 1); + depthBuffer.setClear(1); + stencilBuffer.setClear(0); + enable(gl.DEPTH_TEST); + depthBuffer.setFunc(LessEqualDepth); + setFlipSided(false); + setCullFace(CullFaceBack); + enable(gl.CULL_FACE); + setBlending(NoBlending); + function enable(id) { + if (enabledCapabilities[id] !== true) { + gl.enable(id); + enabledCapabilities[id] = true; + } + } + function disable(id) { + if (enabledCapabilities[id] !== false) { + gl.disable(id); + enabledCapabilities[id] = false; + } + } + function bindFramebuffer(target, framebuffer) { + if (currentBoundFramebuffers[target] !== framebuffer) { + gl.bindFramebuffer(target, framebuffer); + currentBoundFramebuffers[target] = framebuffer; + if (target === gl.DRAW_FRAMEBUFFER) { + currentBoundFramebuffers[gl.FRAMEBUFFER] = framebuffer; + } + if (target === gl.FRAMEBUFFER) { + currentBoundFramebuffers[gl.DRAW_FRAMEBUFFER] = framebuffer; + } + return true; + } + return false; + } + function drawBuffers(renderTarget, framebuffer) { + let drawBuffers2 = defaultDrawbuffers; + let needsUpdate = false; + if (renderTarget) { + drawBuffers2 = currentDrawbuffers.get(framebuffer); + if (drawBuffers2 === void 0) { + drawBuffers2 = []; + currentDrawbuffers.set(framebuffer, drawBuffers2); + } + const textures = renderTarget.textures; + if (drawBuffers2.length !== textures.length || drawBuffers2[0] !== gl.COLOR_ATTACHMENT0) { + for (let i = 0, il = textures.length; i < il; i++) { + drawBuffers2[i] = gl.COLOR_ATTACHMENT0 + i; + } + drawBuffers2.length = textures.length; + needsUpdate = true; + } + } else { + if (drawBuffers2[0] !== gl.BACK) { + drawBuffers2[0] = gl.BACK; + needsUpdate = true; + } + } + if (needsUpdate) { + gl.drawBuffers(drawBuffers2); + } + } + function useProgram(program) { + if (currentProgram !== program) { + gl.useProgram(program); + currentProgram = program; + return true; + } + return false; + } + const equationToGL = { + [AddEquation]: gl.FUNC_ADD, + [SubtractEquation]: gl.FUNC_SUBTRACT, + [ReverseSubtractEquation]: gl.FUNC_REVERSE_SUBTRACT + }; + equationToGL[MinEquation] = gl.MIN; + equationToGL[MaxEquation] = gl.MAX; + const factorToGL = { + [ZeroFactor]: gl.ZERO, + [OneFactor]: gl.ONE, + [SrcColorFactor]: gl.SRC_COLOR, + [SrcAlphaFactor]: gl.SRC_ALPHA, + [SrcAlphaSaturateFactor]: gl.SRC_ALPHA_SATURATE, + [DstColorFactor]: gl.DST_COLOR, + [DstAlphaFactor]: gl.DST_ALPHA, + [OneMinusSrcColorFactor]: gl.ONE_MINUS_SRC_COLOR, + [OneMinusSrcAlphaFactor]: gl.ONE_MINUS_SRC_ALPHA, + [OneMinusDstColorFactor]: gl.ONE_MINUS_DST_COLOR, + [OneMinusDstAlphaFactor]: gl.ONE_MINUS_DST_ALPHA, + [ConstantColorFactor]: gl.CONSTANT_COLOR, + [OneMinusConstantColorFactor]: gl.ONE_MINUS_CONSTANT_COLOR, + [ConstantAlphaFactor]: gl.CONSTANT_ALPHA, + [OneMinusConstantAlphaFactor]: gl.ONE_MINUS_CONSTANT_ALPHA + }; + function setBlending(blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha) { + if (blending === NoBlending) { + if (currentBlendingEnabled === true) { + disable(gl.BLEND); + currentBlendingEnabled = false; + } + return; + } + if (currentBlendingEnabled === false) { + enable(gl.BLEND); + currentBlendingEnabled = true; + } + if (blending !== CustomBlending) { + if (blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha) { + if (currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation) { + gl.blendEquation(gl.FUNC_ADD); + currentBlendEquation = AddEquation; + currentBlendEquationAlpha = AddEquation; + } + if (premultipliedAlpha) { + switch (blending) { + case NormalBlending: + gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + break; + case AdditiveBlending: + gl.blendFunc(gl.ONE, gl.ONE); + break; + case SubtractiveBlending: + gl.blendFuncSeparate(gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE); + break; + case MultiplyBlending: + gl.blendFuncSeparate(gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE); + break; + default: + error("WebGLState: Invalid blending: ", blending); + break; + } + } else { + switch (blending) { + case NormalBlending: + gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + break; + case AdditiveBlending: + gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE); + break; + case SubtractiveBlending: + error("WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true"); + break; + case MultiplyBlending: + error("WebGLState: MultiplyBlending requires material.premultipliedAlpha = true"); + break; + default: + error("WebGLState: Invalid blending: ", blending); + break; + } + } + currentBlendSrc = null; + currentBlendDst = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentBlendColor.set(0, 0, 0); + currentBlendAlpha = 0; + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + } + return; + } + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + if (blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha) { + gl.blendEquationSeparate(equationToGL[blendEquation], equationToGL[blendEquationAlpha]); + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + } + if (blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha) { + gl.blendFuncSeparate(factorToGL[blendSrc], factorToGL[blendDst], factorToGL[blendSrcAlpha], factorToGL[blendDstAlpha]); + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + } + if (blendColor.equals(currentBlendColor) === false || blendAlpha !== currentBlendAlpha) { + gl.blendColor(blendColor.r, blendColor.g, blendColor.b, blendAlpha); + currentBlendColor.copy(blendColor); + currentBlendAlpha = blendAlpha; + } + currentBlending = blending; + currentPremultipledAlpha = false; + } + function setMaterial(material, frontFaceCW) { + material.side === DoubleSide ? disable(gl.CULL_FACE) : enable(gl.CULL_FACE); + let flipSided = material.side === BackSide; + if (frontFaceCW) flipSided = !flipSided; + setFlipSided(flipSided); + material.blending === NormalBlending && material.transparent === false ? setBlending(NoBlending) : setBlending(material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha); + depthBuffer.setFunc(material.depthFunc); + depthBuffer.setTest(material.depthTest); + depthBuffer.setMask(material.depthWrite); + colorBuffer.setMask(material.colorWrite); + const stencilWrite = material.stencilWrite; + stencilBuffer.setTest(stencilWrite); + if (stencilWrite) { + stencilBuffer.setMask(material.stencilWriteMask); + stencilBuffer.setFunc(material.stencilFunc, material.stencilRef, material.stencilFuncMask); + stencilBuffer.setOp(material.stencilFail, material.stencilZFail, material.stencilZPass); + } + setPolygonOffset(material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits); + material.alphaToCoverage === true ? enable(gl.SAMPLE_ALPHA_TO_COVERAGE) : disable(gl.SAMPLE_ALPHA_TO_COVERAGE); + } + function setFlipSided(flipSided) { + if (currentFlipSided !== flipSided) { + if (flipSided) { + gl.frontFace(gl.CW); + } else { + gl.frontFace(gl.CCW); + } + currentFlipSided = flipSided; + } + } + function setCullFace(cullFace) { + if (cullFace !== CullFaceNone) { + enable(gl.CULL_FACE); + if (cullFace !== currentCullFace) { + if (cullFace === CullFaceBack) { + gl.cullFace(gl.BACK); + } else if (cullFace === CullFaceFront) { + gl.cullFace(gl.FRONT); + } else { + gl.cullFace(gl.FRONT_AND_BACK); + } + } + } else { + disable(gl.CULL_FACE); + } + currentCullFace = cullFace; + } + function setLineWidth(width) { + if (width !== currentLineWidth) { + if (lineWidthAvailable) gl.lineWidth(width); + currentLineWidth = width; + } + } + function setPolygonOffset(polygonOffset, factor, units) { + if (polygonOffset) { + enable(gl.POLYGON_OFFSET_FILL); + if (currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units) { + gl.polygonOffset(factor, units); + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + } + } else { + disable(gl.POLYGON_OFFSET_FILL); + } + } + function setScissorTest(scissorTest) { + if (scissorTest) { + enable(gl.SCISSOR_TEST); + } else { + disable(gl.SCISSOR_TEST); + } + } + function activeTexture(webglSlot) { + if (webglSlot === void 0) webglSlot = gl.TEXTURE0 + maxTextures - 1; + if (currentTextureSlot !== webglSlot) { + gl.activeTexture(webglSlot); + currentTextureSlot = webglSlot; + } + } + function bindTexture(webglType, webglTexture, webglSlot) { + if (webglSlot === void 0) { + if (currentTextureSlot === null) { + webglSlot = gl.TEXTURE0 + maxTextures - 1; + } else { + webglSlot = currentTextureSlot; + } + } + let boundTexture = currentBoundTextures[webglSlot]; + if (boundTexture === void 0) { + boundTexture = { type: void 0, texture: void 0 }; + currentBoundTextures[webglSlot] = boundTexture; + } + if (boundTexture.type !== webglType || boundTexture.texture !== webglTexture) { + if (currentTextureSlot !== webglSlot) { + gl.activeTexture(webglSlot); + currentTextureSlot = webglSlot; + } + gl.bindTexture(webglType, webglTexture || emptyTextures[webglType]); + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + } + } + function unbindTexture() { + const boundTexture = currentBoundTextures[currentTextureSlot]; + if (boundTexture !== void 0 && boundTexture.type !== void 0) { + gl.bindTexture(boundTexture.type, null); + boundTexture.type = void 0; + boundTexture.texture = void 0; + } + } + function compressedTexImage2D() { + try { + gl.compressedTexImage2D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function compressedTexImage3D() { + try { + gl.compressedTexImage3D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function texSubImage2D() { + try { + gl.texSubImage2D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function texSubImage3D() { + try { + gl.texSubImage3D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function compressedTexSubImage2D() { + try { + gl.compressedTexSubImage2D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function compressedTexSubImage3D() { + try { + gl.compressedTexSubImage3D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function texStorage2D() { + try { + gl.texStorage2D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function texStorage3D() { + try { + gl.texStorage3D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function texImage2D() { + try { + gl.texImage2D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function texImage3D() { + try { + gl.texImage3D(...arguments); + } catch (e) { + error("WebGLState:", e); + } + } + function scissor(scissor2) { + if (currentScissor.equals(scissor2) === false) { + gl.scissor(scissor2.x, scissor2.y, scissor2.z, scissor2.w); + currentScissor.copy(scissor2); + } + } + function viewport(viewport2) { + if (currentViewport.equals(viewport2) === false) { + gl.viewport(viewport2.x, viewport2.y, viewport2.z, viewport2.w); + currentViewport.copy(viewport2); + } + } + function updateUBOMapping(uniformsGroup, program) { + let mapping = uboProgramMap.get(program); + if (mapping === void 0) { + mapping = /* @__PURE__ */ new WeakMap(); + uboProgramMap.set(program, mapping); + } + let blockIndex = mapping.get(uniformsGroup); + if (blockIndex === void 0) { + blockIndex = gl.getUniformBlockIndex(program, uniformsGroup.name); + mapping.set(uniformsGroup, blockIndex); + } + } + function uniformBlockBinding(uniformsGroup, program) { + const mapping = uboProgramMap.get(program); + const blockIndex = mapping.get(uniformsGroup); + if (uboBindings.get(program) !== blockIndex) { + gl.uniformBlockBinding(program, blockIndex, uniformsGroup.__bindingPointIndex); + uboBindings.set(program, blockIndex); + } + } + function reset() { + gl.disable(gl.BLEND); + gl.disable(gl.CULL_FACE); + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.POLYGON_OFFSET_FILL); + gl.disable(gl.SCISSOR_TEST); + gl.disable(gl.STENCIL_TEST); + gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE); + gl.blendEquation(gl.FUNC_ADD); + gl.blendFunc(gl.ONE, gl.ZERO); + gl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO); + gl.blendColor(0, 0, 0, 0); + gl.colorMask(true, true, true, true); + gl.clearColor(0, 0, 0, 0); + gl.depthMask(true); + gl.depthFunc(gl.LESS); + depthBuffer.setReversed(false); + gl.clearDepth(1); + gl.stencilMask(4294967295); + gl.stencilFunc(gl.ALWAYS, 0, 4294967295); + gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); + gl.clearStencil(0); + gl.cullFace(gl.BACK); + gl.frontFace(gl.CCW); + gl.polygonOffset(0, 0); + gl.activeTexture(gl.TEXTURE0); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null); + gl.useProgram(null); + gl.lineWidth(1); + gl.scissor(0, 0, gl.canvas.width, gl.canvas.height); + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + enabledCapabilities = {}; + currentTextureSlot = null; + currentBoundTextures = {}; + currentBoundFramebuffers = {}; + currentDrawbuffers = /* @__PURE__ */ new WeakMap(); + defaultDrawbuffers = []; + currentProgram = null; + currentBlendingEnabled = false; + currentBlending = null; + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + currentBlendColor = new Color(0, 0, 0); + currentBlendAlpha = 0; + currentPremultipledAlpha = false; + currentFlipSided = null; + currentCullFace = null; + currentLineWidth = null; + currentPolygonOffsetFactor = null; + currentPolygonOffsetUnits = null; + currentScissor.set(0, 0, gl.canvas.width, gl.canvas.height); + currentViewport.set(0, 0, gl.canvas.width, gl.canvas.height); + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + } + return { + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + enable, + disable, + bindFramebuffer, + drawBuffers, + useProgram, + setBlending, + setMaterial, + setFlipSided, + setCullFace, + setLineWidth, + setPolygonOffset, + setScissorTest, + activeTexture, + bindTexture, + unbindTexture, + compressedTexImage2D, + compressedTexImage3D, + texImage2D, + texImage3D, + updateUBOMapping, + uniformBlockBinding, + texStorage2D, + texStorage3D, + texSubImage2D, + texSubImage3D, + compressedTexSubImage2D, + compressedTexSubImage3D, + scissor, + viewport, + reset + }; +} +function WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info) { + const multisampledRTTExt = extensions.has("WEBGL_multisampled_render_to_texture") ? extensions.get("WEBGL_multisampled_render_to_texture") : null; + const supportsInvalidateFramebuffer = typeof navigator === "undefined" ? false : /OculusBrowser/g.test(navigator.userAgent); + const _imageDimensions = new Vector2(); + const _videoTextures = /* @__PURE__ */ new WeakMap(); + let _canvas2; + const _sources = /* @__PURE__ */ new WeakMap(); + let useOffscreenCanvas = false; + try { + useOffscreenCanvas = typeof OffscreenCanvas !== "undefined" && new OffscreenCanvas(1, 1).getContext("2d") !== null; + } catch (err) { + } + function createCanvas(width, height) { + return useOffscreenCanvas ? new OffscreenCanvas(width, height) : createElementNS("canvas"); + } + function resizeImage(image, needsNewCanvas, maxSize) { + let scale = 1; + const dimensions = getDimensions(image); + if (dimensions.width > maxSize || dimensions.height > maxSize) { + scale = maxSize / Math.max(dimensions.width, dimensions.height); + } + if (scale < 1) { + if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap || typeof VideoFrame !== "undefined" && image instanceof VideoFrame) { + const width = Math.floor(scale * dimensions.width); + const height = Math.floor(scale * dimensions.height); + if (_canvas2 === void 0) _canvas2 = createCanvas(width, height); + const canvas = needsNewCanvas ? createCanvas(width, height) : _canvas2; + canvas.width = width; + canvas.height = height; + const context = canvas.getContext("2d"); + context.drawImage(image, 0, 0, width, height); + warn("WebGLRenderer: Texture has been resized from (" + dimensions.width + "x" + dimensions.height + ") to (" + width + "x" + height + ")."); + return canvas; + } else { + if ("data" in image) { + warn("WebGLRenderer: Image in DataTexture is too big (" + dimensions.width + "x" + dimensions.height + ")."); + } + return image; + } + } + return image; + } + function textureNeedsGenerateMipmaps(texture) { + return texture.generateMipmaps; + } + function generateMipmap(target) { + _gl.generateMipmap(target); + } + function getTargetType(texture) { + if (texture.isWebGLCubeRenderTarget) return _gl.TEXTURE_CUBE_MAP; + if (texture.isWebGL3DRenderTarget) return _gl.TEXTURE_3D; + if (texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture) return _gl.TEXTURE_2D_ARRAY; + return _gl.TEXTURE_2D; + } + function getInternalFormat(internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false) { + if (internalFormatName !== null) { + if (_gl[internalFormatName] !== void 0) return _gl[internalFormatName]; + warn("WebGLRenderer: Attempt to use non-existing WebGL internal format '" + internalFormatName + "'"); + } + let internalFormat = glFormat; + if (glFormat === _gl.RED) { + if (glType === _gl.FLOAT) internalFormat = _gl.R32F; + if (glType === _gl.HALF_FLOAT) internalFormat = _gl.R16F; + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.R8; + } + if (glFormat === _gl.RED_INTEGER) { + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.R8UI; + if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.R16UI; + if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.R32UI; + if (glType === _gl.BYTE) internalFormat = _gl.R8I; + if (glType === _gl.SHORT) internalFormat = _gl.R16I; + if (glType === _gl.INT) internalFormat = _gl.R32I; + } + if (glFormat === _gl.RG) { + if (glType === _gl.FLOAT) internalFormat = _gl.RG32F; + if (glType === _gl.HALF_FLOAT) internalFormat = _gl.RG16F; + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RG8; + } + if (glFormat === _gl.RG_INTEGER) { + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RG8UI; + if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RG16UI; + if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RG32UI; + if (glType === _gl.BYTE) internalFormat = _gl.RG8I; + if (glType === _gl.SHORT) internalFormat = _gl.RG16I; + if (glType === _gl.INT) internalFormat = _gl.RG32I; + } + if (glFormat === _gl.RGB_INTEGER) { + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RGB8UI; + if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RGB16UI; + if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RGB32UI; + if (glType === _gl.BYTE) internalFormat = _gl.RGB8I; + if (glType === _gl.SHORT) internalFormat = _gl.RGB16I; + if (glType === _gl.INT) internalFormat = _gl.RGB32I; + } + if (glFormat === _gl.RGBA_INTEGER) { + if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RGBA8UI; + if (glType === _gl.UNSIGNED_SHORT) internalFormat = _gl.RGBA16UI; + if (glType === _gl.UNSIGNED_INT) internalFormat = _gl.RGBA32UI; + if (glType === _gl.BYTE) internalFormat = _gl.RGBA8I; + if (glType === _gl.SHORT) internalFormat = _gl.RGBA16I; + if (glType === _gl.INT) internalFormat = _gl.RGBA32I; + } + if (glFormat === _gl.RGB) { + if (glType === _gl.UNSIGNED_INT_5_9_9_9_REV) internalFormat = _gl.RGB9_E5; + if (glType === _gl.UNSIGNED_INT_10F_11F_11F_REV) internalFormat = _gl.R11F_G11F_B10F; + } + if (glFormat === _gl.RGBA) { + const transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer(colorSpace); + if (glType === _gl.FLOAT) internalFormat = _gl.RGBA32F; + if (glType === _gl.HALF_FLOAT) internalFormat = _gl.RGBA16F; + if (glType === _gl.UNSIGNED_BYTE) internalFormat = transfer === SRGBTransfer ? _gl.SRGB8_ALPHA8 : _gl.RGBA8; + if (glType === _gl.UNSIGNED_SHORT_4_4_4_4) internalFormat = _gl.RGBA4; + if (glType === _gl.UNSIGNED_SHORT_5_5_5_1) internalFormat = _gl.RGB5_A1; + } + if (internalFormat === _gl.R16F || internalFormat === _gl.R32F || internalFormat === _gl.RG16F || internalFormat === _gl.RG32F || internalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F) { + extensions.get("EXT_color_buffer_float"); + } + return internalFormat; + } + function getInternalDepthFormat(useStencil, depthType) { + let glInternalFormat; + if (useStencil) { + if (depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type) { + glInternalFormat = _gl.DEPTH24_STENCIL8; + } else if (depthType === FloatType) { + glInternalFormat = _gl.DEPTH32F_STENCIL8; + } else if (depthType === UnsignedShortType) { + glInternalFormat = _gl.DEPTH24_STENCIL8; + warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment."); + } + } else { + if (depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type) { + glInternalFormat = _gl.DEPTH_COMPONENT24; + } else if (depthType === FloatType) { + glInternalFormat = _gl.DEPTH_COMPONENT32F; + } else if (depthType === UnsignedShortType) { + glInternalFormat = _gl.DEPTH_COMPONENT16; + } + } + return glInternalFormat; + } + function getMipLevels(texture, image) { + if (textureNeedsGenerateMipmaps(texture) === true || texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter) { + return Math.log2(Math.max(image.width, image.height)) + 1; + } else if (texture.mipmaps !== void 0 && texture.mipmaps.length > 0) { + return texture.mipmaps.length; + } else if (texture.isCompressedTexture && Array.isArray(texture.image)) { + return image.mipmaps.length; + } else { + return 1; + } + } + function onTextureDispose(event) { + const texture = event.target; + texture.removeEventListener("dispose", onTextureDispose); + deallocateTexture(texture); + if (texture.isVideoTexture) { + _videoTextures.delete(texture); + } + } + function onRenderTargetDispose(event) { + const renderTarget = event.target; + renderTarget.removeEventListener("dispose", onRenderTargetDispose); + deallocateRenderTarget(renderTarget); + } + function deallocateTexture(texture) { + const textureProperties = properties.get(texture); + if (textureProperties.__webglInit === void 0) return; + const source = texture.source; + const webglTextures = _sources.get(source); + if (webglTextures) { + const webglTexture = webglTextures[textureProperties.__cacheKey]; + webglTexture.usedTimes--; + if (webglTexture.usedTimes === 0) { + deleteTexture(texture); + } + if (Object.keys(webglTextures).length === 0) { + _sources.delete(source); + } + } + properties.remove(texture); + } + function deleteTexture(texture) { + const textureProperties = properties.get(texture); + _gl.deleteTexture(textureProperties.__webglTexture); + const source = texture.source; + const webglTextures = _sources.get(source); + delete webglTextures[textureProperties.__cacheKey]; + info.memory.textures--; + } + function deallocateRenderTarget(renderTarget) { + const renderTargetProperties = properties.get(renderTarget); + if (renderTarget.depthTexture) { + renderTarget.depthTexture.dispose(); + properties.remove(renderTarget.depthTexture); + } + if (renderTarget.isWebGLCubeRenderTarget) { + for (let i = 0; i < 6; i++) { + if (Array.isArray(renderTargetProperties.__webglFramebuffer[i])) { + for (let level = 0; level < renderTargetProperties.__webglFramebuffer[i].length; level++) _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i][level]); + } else { + _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]); + } + if (renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[i]); + } + } else { + if (Array.isArray(renderTargetProperties.__webglFramebuffer)) { + for (let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level++) _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[level]); + } else { + _gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer); + } + if (renderTargetProperties.__webglDepthbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer); + if (renderTargetProperties.__webglMultisampledFramebuffer) _gl.deleteFramebuffer(renderTargetProperties.__webglMultisampledFramebuffer); + if (renderTargetProperties.__webglColorRenderbuffer) { + for (let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i++) { + if (renderTargetProperties.__webglColorRenderbuffer[i]) _gl.deleteRenderbuffer(renderTargetProperties.__webglColorRenderbuffer[i]); + } + } + if (renderTargetProperties.__webglDepthRenderbuffer) _gl.deleteRenderbuffer(renderTargetProperties.__webglDepthRenderbuffer); + } + const textures = renderTarget.textures; + for (let i = 0, il = textures.length; i < il; i++) { + const attachmentProperties = properties.get(textures[i]); + if (attachmentProperties.__webglTexture) { + _gl.deleteTexture(attachmentProperties.__webglTexture); + info.memory.textures--; + } + properties.remove(textures[i]); + } + properties.remove(renderTarget); + } + let textureUnits = 0; + function resetTextureUnits() { + textureUnits = 0; + } + function allocateTextureUnit() { + const textureUnit = textureUnits; + if (textureUnit >= capabilities.maxTextures) { + warn("WebGLTextures: Trying to use " + textureUnit + " texture units while this GPU supports only " + capabilities.maxTextures); + } + textureUnits += 1; + return textureUnit; + } + function getTextureCacheKey(texture) { + const array = []; + array.push(texture.wrapS); + array.push(texture.wrapT); + array.push(texture.wrapR || 0); + array.push(texture.magFilter); + array.push(texture.minFilter); + array.push(texture.anisotropy); + array.push(texture.internalFormat); + array.push(texture.format); + array.push(texture.type); + array.push(texture.generateMipmaps); + array.push(texture.premultiplyAlpha); + array.push(texture.flipY); + array.push(texture.unpackAlignment); + array.push(texture.colorSpace); + return array.join(); + } + function setTexture2D(texture, slot) { + const textureProperties = properties.get(texture); + if (texture.isVideoTexture) updateVideoTexture(texture); + if (texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version) { + const image = texture.image; + if (image === null) { + warn("WebGLRenderer: Texture marked for update but no image data found."); + } else if (image.complete === false) { + warn("WebGLRenderer: Texture marked for update but image is incomplete"); + } else { + uploadTexture(textureProperties, texture, slot); + return; + } + } else if (texture.isExternalTexture) { + textureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null; + } + state.bindTexture(_gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + } + function setTexture2DArray(texture, slot) { + const textureProperties = properties.get(texture); + if (texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version) { + uploadTexture(textureProperties, texture, slot); + return; + } else if (texture.isExternalTexture) { + textureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null; + } + state.bindTexture(_gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + } + function setTexture3D(texture, slot) { + const textureProperties = properties.get(texture); + if (texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version) { + uploadTexture(textureProperties, texture, slot); + return; + } + state.bindTexture(_gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + } + function setTextureCube(texture, slot) { + const textureProperties = properties.get(texture); + if (texture.isCubeDepthTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version) { + uploadCubeTexture(textureProperties, texture, slot); + return; + } + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + } + const wrappingToGL = { + [RepeatWrapping]: _gl.REPEAT, + [ClampToEdgeWrapping]: _gl.CLAMP_TO_EDGE, + [MirroredRepeatWrapping]: _gl.MIRRORED_REPEAT + }; + const filterToGL = { + [NearestFilter]: _gl.NEAREST, + [NearestMipmapNearestFilter]: _gl.NEAREST_MIPMAP_NEAREST, + [NearestMipmapLinearFilter]: _gl.NEAREST_MIPMAP_LINEAR, + [LinearFilter]: _gl.LINEAR, + [LinearMipmapNearestFilter]: _gl.LINEAR_MIPMAP_NEAREST, + [LinearMipmapLinearFilter]: _gl.LINEAR_MIPMAP_LINEAR + }; + const compareToGL = { + [NeverCompare]: _gl.NEVER, + [AlwaysCompare]: _gl.ALWAYS, + [LessCompare]: _gl.LESS, + [LessEqualCompare]: _gl.LEQUAL, + [EqualCompare]: _gl.EQUAL, + [GreaterEqualCompare]: _gl.GEQUAL, + [GreaterCompare]: _gl.GREATER, + [NotEqualCompare]: _gl.NOTEQUAL + }; + function setTextureParameters(textureType, texture) { + if (texture.type === FloatType && extensions.has("OES_texture_float_linear") === false && (texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter || texture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter)) { + warn("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."); + } + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[texture.wrapS]); + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[texture.wrapT]); + if (textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY) { + _gl.texParameteri(textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[texture.wrapR]); + } + _gl.texParameteri(textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[texture.magFilter]); + _gl.texParameteri(textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[texture.minFilter]); + if (texture.compareFunction) { + _gl.texParameteri(textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE); + _gl.texParameteri(textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[texture.compareFunction]); + } + if (extensions.has("EXT_texture_filter_anisotropic") === true) { + if (texture.magFilter === NearestFilter) return; + if (texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter) return; + if (texture.type === FloatType && extensions.has("OES_texture_float_linear") === false) return; + if (texture.anisotropy > 1 || properties.get(texture).__currentAnisotropy) { + const extension = extensions.get("EXT_texture_filter_anisotropic"); + _gl.texParameterf(textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(texture.anisotropy, capabilities.getMaxAnisotropy())); + properties.get(texture).__currentAnisotropy = texture.anisotropy; + } + } + } + function initTexture(textureProperties, texture) { + let forceUpload = false; + if (textureProperties.__webglInit === void 0) { + textureProperties.__webglInit = true; + texture.addEventListener("dispose", onTextureDispose); + } + const source = texture.source; + let webglTextures = _sources.get(source); + if (webglTextures === void 0) { + webglTextures = {}; + _sources.set(source, webglTextures); + } + const textureCacheKey = getTextureCacheKey(texture); + if (textureCacheKey !== textureProperties.__cacheKey) { + if (webglTextures[textureCacheKey] === void 0) { + webglTextures[textureCacheKey] = { + texture: _gl.createTexture(), + usedTimes: 0 + }; + info.memory.textures++; + forceUpload = true; + } + webglTextures[textureCacheKey].usedTimes++; + const webglTexture = webglTextures[textureProperties.__cacheKey]; + if (webglTexture !== void 0) { + webglTextures[textureProperties.__cacheKey].usedTimes--; + if (webglTexture.usedTimes === 0) { + deleteTexture(texture); + } + } + textureProperties.__cacheKey = textureCacheKey; + textureProperties.__webglTexture = webglTextures[textureCacheKey].texture; + } + return forceUpload; + } + function getRow(index, rowLength, componentStride) { + return Math.floor(Math.floor(index / componentStride) / rowLength); + } + function updateTexture(texture, image, glFormat, glType) { + const componentStride = 4; + const updateRanges = texture.updateRanges; + if (updateRanges.length === 0) { + state.texSubImage2D(_gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data); + } else { + updateRanges.sort((a, b) => a.start - b.start); + let mergeIndex = 0; + for (let i = 1; i < updateRanges.length; i++) { + const previousRange = updateRanges[mergeIndex]; + const range = updateRanges[i]; + const previousEnd = previousRange.start + previousRange.count; + const currentRow = getRow(range.start, image.width, componentStride); + const previousRow = getRow(previousRange.start, image.width, componentStride); + if (range.start <= previousEnd + 1 && currentRow === previousRow && getRow(range.start + range.count - 1, image.width, componentStride) === currentRow) { + previousRange.count = Math.max( + previousRange.count, + range.start + range.count - previousRange.start + ); + } else { + ++mergeIndex; + updateRanges[mergeIndex] = range; + } + } + updateRanges.length = mergeIndex + 1; + const currentUnpackRowLen = _gl.getParameter(_gl.UNPACK_ROW_LENGTH); + const currentUnpackSkipPixels = _gl.getParameter(_gl.UNPACK_SKIP_PIXELS); + const currentUnpackSkipRows = _gl.getParameter(_gl.UNPACK_SKIP_ROWS); + _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, image.width); + for (let i = 0, l = updateRanges.length; i < l; i++) { + const range = updateRanges[i]; + const pixelStart = Math.floor(range.start / componentStride); + const pixelCount = Math.ceil(range.count / componentStride); + const x = pixelStart % image.width; + const y = Math.floor(pixelStart / image.width); + const width = pixelCount; + const height = 1; + _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, x); + _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, y); + state.texSubImage2D(_gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data); + } + texture.clearUpdateRanges(); + _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, currentUnpackRowLen); + _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels); + _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows); + } + } + function uploadTexture(textureProperties, texture, slot) { + let textureType = _gl.TEXTURE_2D; + if (texture.isDataArrayTexture || texture.isCompressedArrayTexture) textureType = _gl.TEXTURE_2D_ARRAY; + if (texture.isData3DTexture) textureType = _gl.TEXTURE_3D; + const forceUpload = initTexture(textureProperties, texture); + const source = texture.source; + state.bindTexture(textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + const sourceProperties = properties.get(source); + if (source.version !== sourceProperties.__version || forceUpload === true) { + state.activeTexture(_gl.TEXTURE0 + slot); + const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace); + const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace); + const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; + _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); + _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); + _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment); + _gl.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion); + let image = resizeImage(texture.image, false, capabilities.maxTextureSize); + image = verifyColorSpace(texture, image); + const glFormat = utils.convert(texture.format, texture.colorSpace); + const glType = utils.convert(texture.type); + let glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture); + setTextureParameters(textureType, texture); + let mipmap; + const mipmaps = texture.mipmaps; + const useTexStorage = texture.isVideoTexture !== true; + const allocateMemory = sourceProperties.__version === void 0 || forceUpload === true; + const dataReady = source.dataReady; + const levels = getMipLevels(texture, image); + if (texture.isDepthTexture) { + glInternalFormat = getInternalDepthFormat(texture.format === DepthStencilFormat, texture.type); + if (allocateMemory) { + if (useTexStorage) { + state.texStorage2D(_gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height); + } else { + state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null); + } + } + } else if (texture.isDataTexture) { + if (mipmaps.length > 0) { + if (useTexStorage && allocateMemory) { + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height); + } + for (let i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i]; + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); + } + } + texture.generateMipmaps = false; + } else { + if (useTexStorage) { + if (allocateMemory) { + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height); + } + if (dataReady) { + updateTexture(texture, image, glFormat, glType); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data); + } + } + } else if (texture.isCompressedTexture) { + if (texture.isCompressedArrayTexture) { + if (useTexStorage && allocateMemory) { + state.texStorage3D(_gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height, image.depth); + } + for (let i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i]; + if (texture.format !== RGBAFormat) { + if (glFormat !== null) { + if (useTexStorage) { + if (dataReady) { + if (texture.layerUpdates.size > 0) { + const layerByteLength = getByteLength(mipmap.width, mipmap.height, texture.format, texture.type); + for (const layerIndex of texture.layerUpdates) { + const layerData = mipmap.data.subarray( + layerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT, + (layerIndex + 1) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT + ); + state.compressedTexSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData); + } + texture.clearLayerUpdates(); + } else { + state.compressedTexSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data); + } + } + } else { + state.compressedTexImage3D(_gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0); + } + } else { + warn("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"); + } + } else { + if (useTexStorage) { + if (dataReady) { + state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data); + } + } else { + state.texImage3D(_gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data); + } + } + } + } else { + if (useTexStorage && allocateMemory) { + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[0].width, mipmaps[0].height); + } + for (let i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i]; + if (texture.format !== RGBAFormat) { + if (glFormat !== null) { + if (useTexStorage) { + if (dataReady) { + state.compressedTexSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data); + } + } else { + state.compressedTexImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); + } + } else { + warn("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"); + } + } else { + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); + } + } + } + } + } else if (texture.isDataArrayTexture) { + if (useTexStorage) { + if (allocateMemory) { + state.texStorage3D(_gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth); + } + if (dataReady) { + if (texture.layerUpdates.size > 0) { + const layerByteLength = getByteLength(image.width, image.height, texture.format, texture.type); + for (const layerIndex of texture.layerUpdates) { + const layerData = image.data.subarray( + layerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT, + (layerIndex + 1) * layerByteLength / image.data.BYTES_PER_ELEMENT + ); + state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData); + } + texture.clearLayerUpdates(); + } else { + state.texSubImage3D(_gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data); + } + } + } else { + state.texImage3D(_gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data); + } + } else if (texture.isData3DTexture) { + if (useTexStorage) { + if (allocateMemory) { + state.texStorage3D(_gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth); + } + if (dataReady) { + state.texSubImage3D(_gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data); + } + } else { + state.texImage3D(_gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data); + } + } else if (texture.isFramebufferTexture) { + if (allocateMemory) { + if (useTexStorage) { + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height); + } else { + let width = image.width, height = image.height; + for (let i = 0; i < levels; i++) { + state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null); + width >>= 1; + height >>= 1; + } + } + } + } else { + if (mipmaps.length > 0) { + if (useTexStorage && allocateMemory) { + const dimensions = getDimensions(mipmaps[0]); + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height); + } + for (let i = 0, il = mipmaps.length; i < il; i++) { + mipmap = mipmaps[i]; + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap); + } + } + texture.generateMipmaps = false; + } else { + if (useTexStorage) { + if (allocateMemory) { + const dimensions = getDimensions(image); + state.texStorage2D(_gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height); + } + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image); + } + } else { + state.texImage2D(_gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image); + } + } + } + if (textureNeedsGenerateMipmaps(texture)) { + generateMipmap(textureType); + } + sourceProperties.__version = source.version; + if (texture.onUpdate) texture.onUpdate(texture); + } + textureProperties.__version = texture.version; + } + function uploadCubeTexture(textureProperties, texture, slot) { + if (texture.image.length !== 6) return; + const forceUpload = initTexture(textureProperties, texture); + const source = texture.source; + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot); + const sourceProperties = properties.get(source); + if (source.version !== sourceProperties.__version || forceUpload === true) { + state.activeTexture(_gl.TEXTURE0 + slot); + const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace); + const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace); + const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL; + _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY); + _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha); + _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment); + _gl.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion); + const isCompressed = texture.isCompressedTexture || texture.image[0].isCompressedTexture; + const isDataTexture = texture.image[0] && texture.image[0].isDataTexture; + const cubeImage = []; + for (let i = 0; i < 6; i++) { + if (!isCompressed && !isDataTexture) { + cubeImage[i] = resizeImage(texture.image[i], true, capabilities.maxCubemapSize); + } else { + cubeImage[i] = isDataTexture ? texture.image[i].image : texture.image[i]; + } + cubeImage[i] = verifyColorSpace(texture, cubeImage[i]); + } + const image = cubeImage[0], glFormat = utils.convert(texture.format, texture.colorSpace), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); + const useTexStorage = texture.isVideoTexture !== true; + const allocateMemory = sourceProperties.__version === void 0 || forceUpload === true; + const dataReady = source.dataReady; + let levels = getMipLevels(texture, image); + setTextureParameters(_gl.TEXTURE_CUBE_MAP, texture); + let mipmaps; + if (isCompressed) { + if (useTexStorage && allocateMemory) { + state.texStorage2D(_gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height); + } + for (let i = 0; i < 6; i++) { + mipmaps = cubeImage[i].mipmaps; + for (let j = 0; j < mipmaps.length; j++) { + const mipmap = mipmaps[j]; + if (texture.format !== RGBAFormat) { + if (glFormat !== null) { + if (useTexStorage) { + if (dataReady) { + state.compressedTexSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data); + } + } else { + state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data); + } + } else { + warn("WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"); + } + } else { + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data); + } + } + } + } + } else { + mipmaps = texture.mipmaps; + if (useTexStorage && allocateMemory) { + if (mipmaps.length > 0) levels++; + const dimensions = getDimensions(cubeImage[0]); + state.texStorage2D(_gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height); + } + for (let i = 0; i < 6; i++) { + if (isDataTexture) { + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[i].width, cubeImage[i].height, glFormat, glType, cubeImage[i].data); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[i].width, cubeImage[i].height, 0, glFormat, glType, cubeImage[i].data); + } + for (let j = 0; j < mipmaps.length; j++) { + const mipmap = mipmaps[j]; + const mipmapImage = mipmap.image[i].image; + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data); + } + } + } else { + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[i]); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[i]); + } + for (let j = 0; j < mipmaps.length; j++) { + const mipmap = mipmaps[j]; + if (useTexStorage) { + if (dataReady) { + state.texSubImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[i]); + } + } else { + state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[i]); + } + } + } + } + } + if (textureNeedsGenerateMipmaps(texture)) { + generateMipmap(_gl.TEXTURE_CUBE_MAP); + } + sourceProperties.__version = source.version; + if (texture.onUpdate) texture.onUpdate(texture); + } + textureProperties.__version = texture.version; + } + function setupFrameBufferTexture(framebuffer, renderTarget, texture, attachment, textureTarget, level) { + const glFormat = utils.convert(texture.format, texture.colorSpace); + const glType = utils.convert(texture.type); + const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); + const renderTargetProperties = properties.get(renderTarget); + const textureProperties = properties.get(texture); + textureProperties.__renderTarget = renderTarget; + if (!renderTargetProperties.__hasExternalTextures) { + const width = Math.max(1, renderTarget.width >> level); + const height = Math.max(1, renderTarget.height >> level); + if (textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY) { + state.texImage3D(textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null); + } else { + state.texImage2D(textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null); + } + } + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples(renderTarget)); + } else if (textureTarget === _gl.TEXTURE_2D || textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z) { + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level); + } + state.bindFramebuffer(_gl.FRAMEBUFFER, null); + } + function setupRenderBufferStorage(renderbuffer, renderTarget, useMultisample) { + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); + if (renderTarget.depthBuffer) { + const depthTexture = renderTarget.depthTexture; + const depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null; + const glInternalFormat = getInternalDepthFormat(renderTarget.stencilBuffer, depthType); + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, getRenderTargetSamples(renderTarget), glInternalFormat, renderTarget.width, renderTarget.height); + } else if (useMultisample) { + _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, getRenderTargetSamples(renderTarget), glInternalFormat, renderTarget.width, renderTarget.height); + } else { + _gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height); + } + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); + } else { + const textures = renderTarget.textures; + for (let i = 0; i < textures.length; i++) { + const texture = textures[i]; + const glFormat = utils.convert(texture.format, texture.colorSpace); + const glType = utils.convert(texture.type); + const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace); + if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, getRenderTargetSamples(renderTarget), glInternalFormat, renderTarget.width, renderTarget.height); + } else if (useMultisample) { + _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, getRenderTargetSamples(renderTarget), glInternalFormat, renderTarget.width, renderTarget.height); + } else { + _gl.renderbufferStorage(_gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height); + } + } + } + _gl.bindRenderbuffer(_gl.RENDERBUFFER, null); + } + function setupDepthTexture(framebuffer, renderTarget, cubeFace) { + const isCube = renderTarget.isWebGLCubeRenderTarget === true; + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + if (!(renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture)) { + throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture"); + } + const textureProperties = properties.get(renderTarget.depthTexture); + textureProperties.__renderTarget = renderTarget; + if (!textureProperties.__webglTexture || renderTarget.depthTexture.image.width !== renderTarget.width || renderTarget.depthTexture.image.height !== renderTarget.height) { + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + } + if (isCube) { + if (textureProperties.__webglInit === void 0) { + textureProperties.__webglInit = true; + renderTarget.depthTexture.addEventListener("dispose", onTextureDispose); + } + if (textureProperties.__webglTexture === void 0) { + textureProperties.__webglTexture = _gl.createTexture(); + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture); + setTextureParameters(_gl.TEXTURE_CUBE_MAP, renderTarget.depthTexture); + const glFormat = utils.convert(renderTarget.depthTexture.format); + const glType = utils.convert(renderTarget.depthTexture.type); + let glInternalFormat; + if (renderTarget.depthTexture.format === DepthFormat) { + glInternalFormat = _gl.DEPTH_COMPONENT24; + } else if (renderTarget.depthTexture.format === DepthStencilFormat) { + glInternalFormat = _gl.DEPTH24_STENCIL8; + } + for (let i = 0; i < 6; i++) { + _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null); + } + } + } else { + setTexture2D(renderTarget.depthTexture, 0); + } + const webglDepthTexture = textureProperties.__webglTexture; + const samples = getRenderTargetSamples(renderTarget); + const glTextureType = isCube ? _gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace : _gl.TEXTURE_2D; + const glAttachmentType = renderTarget.depthTexture.format === DepthStencilFormat ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + if (renderTarget.depthTexture.format === DepthFormat) { + if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0, samples); + } else { + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0); + } + } else if (renderTarget.depthTexture.format === DepthStencilFormat) { + if (useMultisampledRTT(renderTarget)) { + multisampledRTTExt.framebufferTexture2DMultisampleEXT(_gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0, samples); + } else { + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0); + } + } else { + throw new Error("Unknown depthTexture format"); + } + } + function setupDepthRenderbuffer(renderTarget) { + const renderTargetProperties = properties.get(renderTarget); + const isCube = renderTarget.isWebGLCubeRenderTarget === true; + if (renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture) { + const depthTexture = renderTarget.depthTexture; + if (renderTargetProperties.__depthDisposeCallback) { + renderTargetProperties.__depthDisposeCallback(); + } + if (depthTexture) { + const disposeEvent = () => { + delete renderTargetProperties.__boundDepthTexture; + delete renderTargetProperties.__depthDisposeCallback; + depthTexture.removeEventListener("dispose", disposeEvent); + }; + depthTexture.addEventListener("dispose", disposeEvent); + renderTargetProperties.__depthDisposeCallback = disposeEvent; + } + renderTargetProperties.__boundDepthTexture = depthTexture; + } + if (renderTarget.depthTexture && !renderTargetProperties.__autoAllocateDepthBuffer) { + if (isCube) { + for (let i = 0; i < 6; i++) { + setupDepthTexture(renderTargetProperties.__webglFramebuffer[i], renderTarget, i); + } + } else { + const mipmaps = renderTarget.texture.mipmaps; + if (mipmaps && mipmaps.length > 0) { + setupDepthTexture(renderTargetProperties.__webglFramebuffer[0], renderTarget, 0); + } else { + setupDepthTexture(renderTargetProperties.__webglFramebuffer, renderTarget, 0); + } + } + } else { + if (isCube) { + renderTargetProperties.__webglDepthbuffer = []; + for (let i = 0; i < 6; i++) { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[i]); + if (renderTargetProperties.__webglDepthbuffer[i] === void 0) { + renderTargetProperties.__webglDepthbuffer[i] = _gl.createRenderbuffer(); + setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer[i], renderTarget, false); + } else { + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderbuffer = renderTargetProperties.__webglDepthbuffer[i]; + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); + } + } + } else { + const mipmaps = renderTarget.texture.mipmaps; + if (mipmaps && mipmaps.length > 0) { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[0]); + } else { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + } + if (renderTargetProperties.__webglDepthbuffer === void 0) { + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer, renderTarget, false); + } else { + const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderbuffer = renderTargetProperties.__webglDepthbuffer; + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderbuffer); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer); + } + } + } + state.bindFramebuffer(_gl.FRAMEBUFFER, null); + } + function rebindTextures(renderTarget, colorTexture, depthTexture) { + const renderTargetProperties = properties.get(renderTarget); + if (colorTexture !== void 0) { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0); + } + if (depthTexture !== void 0) { + setupDepthRenderbuffer(renderTarget); + } + } + function setupRenderTarget(renderTarget) { + const texture = renderTarget.texture; + const renderTargetProperties = properties.get(renderTarget); + const textureProperties = properties.get(texture); + renderTarget.addEventListener("dispose", onRenderTargetDispose); + const textures = renderTarget.textures; + const isCube = renderTarget.isWebGLCubeRenderTarget === true; + const isMultipleRenderTargets = textures.length > 1; + if (!isMultipleRenderTargets) { + if (textureProperties.__webglTexture === void 0) { + textureProperties.__webglTexture = _gl.createTexture(); + } + textureProperties.__version = texture.version; + info.memory.textures++; + } + if (isCube) { + renderTargetProperties.__webglFramebuffer = []; + for (let i = 0; i < 6; i++) { + if (texture.mipmaps && texture.mipmaps.length > 0) { + renderTargetProperties.__webglFramebuffer[i] = []; + for (let level = 0; level < texture.mipmaps.length; level++) { + renderTargetProperties.__webglFramebuffer[i][level] = _gl.createFramebuffer(); + } + } else { + renderTargetProperties.__webglFramebuffer[i] = _gl.createFramebuffer(); + } + } + } else { + if (texture.mipmaps && texture.mipmaps.length > 0) { + renderTargetProperties.__webglFramebuffer = []; + for (let level = 0; level < texture.mipmaps.length; level++) { + renderTargetProperties.__webglFramebuffer[level] = _gl.createFramebuffer(); + } + } else { + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + } + if (isMultipleRenderTargets) { + for (let i = 0, il = textures.length; i < il; i++) { + const attachmentProperties = properties.get(textures[i]); + if (attachmentProperties.__webglTexture === void 0) { + attachmentProperties.__webglTexture = _gl.createTexture(); + info.memory.textures++; + } + } + } + if (renderTarget.samples > 0 && useMultisampledRTT(renderTarget) === false) { + renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer(); + renderTargetProperties.__webglColorRenderbuffer = []; + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + for (let i = 0; i < textures.length; i++) { + const texture2 = textures[i]; + renderTargetProperties.__webglColorRenderbuffer[i] = _gl.createRenderbuffer(); + _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); + const glFormat = utils.convert(texture2.format, texture2.colorSpace); + const glType = utils.convert(texture2.type); + const glInternalFormat = getInternalFormat(texture2.internalFormat, glFormat, glType, texture2.colorSpace, renderTarget.isXRRenderTarget === true); + const samples = getRenderTargetSamples(renderTarget); + _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); + } + _gl.bindRenderbuffer(_gl.RENDERBUFFER, null); + if (renderTarget.depthBuffer) { + renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage(renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true); + } + state.bindFramebuffer(_gl.FRAMEBUFFER, null); + } + } + if (isCube) { + state.bindTexture(_gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture); + setTextureParameters(_gl.TEXTURE_CUBE_MAP, texture); + for (let i = 0; i < 6; i++) { + if (texture.mipmaps && texture.mipmaps.length > 0) { + for (let level = 0; level < texture.mipmaps.length; level++) { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i][level], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level); + } + } else { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0); + } + } + if (textureNeedsGenerateMipmaps(texture)) { + generateMipmap(_gl.TEXTURE_CUBE_MAP); + } + state.unbindTexture(); + } else if (isMultipleRenderTargets) { + for (let i = 0, il = textures.length; i < il; i++) { + const attachment = textures[i]; + const attachmentProperties = properties.get(attachment); + let glTextureType = _gl.TEXTURE_2D; + if (renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget) { + glTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY; + } + state.bindTexture(glTextureType, attachmentProperties.__webglTexture); + setTextureParameters(glTextureType, attachment); + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0); + if (textureNeedsGenerateMipmaps(attachment)) { + generateMipmap(glTextureType); + } + } + state.unbindTexture(); + } else { + let glTextureType = _gl.TEXTURE_2D; + if (renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget) { + glTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY; + } + state.bindTexture(glTextureType, textureProperties.__webglTexture); + setTextureParameters(glTextureType, texture); + if (texture.mipmaps && texture.mipmaps.length > 0) { + for (let level = 0; level < texture.mipmaps.length; level++) { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[level], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level); + } + } else { + setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0); + } + if (textureNeedsGenerateMipmaps(texture)) { + generateMipmap(glTextureType); + } + state.unbindTexture(); + } + if (renderTarget.depthBuffer) { + setupDepthRenderbuffer(renderTarget); + } + } + function updateRenderTargetMipmap(renderTarget) { + const textures = renderTarget.textures; + for (let i = 0, il = textures.length; i < il; i++) { + const texture = textures[i]; + if (textureNeedsGenerateMipmaps(texture)) { + const targetType = getTargetType(renderTarget); + const webglTexture = properties.get(texture).__webglTexture; + state.bindTexture(targetType, webglTexture); + generateMipmap(targetType); + state.unbindTexture(); + } + } + } + const invalidationArrayRead = []; + const invalidationArrayDraw = []; + function updateMultisampleRenderTarget(renderTarget) { + if (renderTarget.samples > 0) { + if (useMultisampledRTT(renderTarget) === false) { + const textures = renderTarget.textures; + const width = renderTarget.width; + const height = renderTarget.height; + let mask = _gl.COLOR_BUFFER_BIT; + const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + const renderTargetProperties = properties.get(renderTarget); + const isMultipleRenderTargets = textures.length > 1; + if (isMultipleRenderTargets) { + for (let i = 0; i < textures.length; i++) { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null); + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0); + } + } + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + const mipmaps = renderTarget.texture.mipmaps; + if (mipmaps && mipmaps.length > 0) { + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[0]); + } else { + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + } + for (let i = 0; i < textures.length; i++) { + if (renderTarget.resolveDepthBuffer) { + if (renderTarget.depthBuffer) mask |= _gl.DEPTH_BUFFER_BIT; + if (renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer) mask |= _gl.STENCIL_BUFFER_BIT; + } + if (isMultipleRenderTargets) { + _gl.framebufferRenderbuffer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); + const webglTexture = properties.get(textures[i]).__webglTexture; + _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0); + } + _gl.blitFramebuffer(0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST); + if (supportsInvalidateFramebuffer === true) { + invalidationArrayRead.length = 0; + invalidationArrayDraw.length = 0; + invalidationArrayRead.push(_gl.COLOR_ATTACHMENT0 + i); + if (renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false) { + invalidationArrayRead.push(depthStyle); + invalidationArrayDraw.push(depthStyle); + _gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, invalidationArrayDraw); + } + _gl.invalidateFramebuffer(_gl.READ_FRAMEBUFFER, invalidationArrayRead); + } + } + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); + if (isMultipleRenderTargets) { + for (let i = 0; i < textures.length; i++) { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i]); + const webglTexture = properties.get(textures[i]).__webglTexture; + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0); + } + } + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer); + } else { + if (renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer) { + const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT; + _gl.invalidateFramebuffer(_gl.DRAW_FRAMEBUFFER, [depthStyle]); + } + } + } + } + function getRenderTargetSamples(renderTarget) { + return Math.min(capabilities.maxSamples, renderTarget.samples); + } + function useMultisampledRTT(renderTarget) { + const renderTargetProperties = properties.get(renderTarget); + return renderTarget.samples > 0 && extensions.has("WEBGL_multisampled_render_to_texture") === true && renderTargetProperties.__useRenderToTexture !== false; + } + function updateVideoTexture(texture) { + const frame = info.render.frame; + if (_videoTextures.get(texture) !== frame) { + _videoTextures.set(texture, frame); + texture.update(); + } + } + function verifyColorSpace(texture, image) { + const colorSpace = texture.colorSpace; + const format = texture.format; + const type = texture.type; + if (texture.isCompressedTexture === true || texture.isVideoTexture === true) return image; + if (colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace) { + if (ColorManagement.getTransfer(colorSpace) === SRGBTransfer) { + if (format !== RGBAFormat || type !== UnsignedByteType) { + warn("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."); + } + } else { + error("WebGLTextures: Unsupported texture color space:", colorSpace); + } + } + return image; + } + function getDimensions(image) { + if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement) { + _imageDimensions.width = image.naturalWidth || image.width; + _imageDimensions.height = image.naturalHeight || image.height; + } else if (typeof VideoFrame !== "undefined" && image instanceof VideoFrame) { + _imageDimensions.width = image.displayWidth; + _imageDimensions.height = image.displayHeight; + } else { + _imageDimensions.width = image.width; + _imageDimensions.height = image.height; + } + return _imageDimensions; + } + this.allocateTextureUnit = allocateTextureUnit; + this.resetTextureUnits = resetTextureUnits; + this.setTexture2D = setTexture2D; + this.setTexture2DArray = setTexture2DArray; + this.setTexture3D = setTexture3D; + this.setTextureCube = setTextureCube; + this.rebindTextures = rebindTextures; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + this.updateMultisampleRenderTarget = updateMultisampleRenderTarget; + this.setupDepthRenderbuffer = setupDepthRenderbuffer; + this.setupFrameBufferTexture = setupFrameBufferTexture; + this.useMultisampledRTT = useMultisampledRTT; + this.isReversedDepthBuffer = function() { + return state.buffers.depth.getReversed(); + }; +} +function WebGLUtils(gl, extensions) { + function convert(p, colorSpace = NoColorSpace) { + let extension; + const transfer = ColorManagement.getTransfer(colorSpace); + if (p === UnsignedByteType) return gl.UNSIGNED_BYTE; + if (p === UnsignedShort4444Type) return gl.UNSIGNED_SHORT_4_4_4_4; + if (p === UnsignedShort5551Type) return gl.UNSIGNED_SHORT_5_5_5_1; + if (p === UnsignedInt5999Type) return gl.UNSIGNED_INT_5_9_9_9_REV; + if (p === UnsignedInt101111Type) return gl.UNSIGNED_INT_10F_11F_11F_REV; + if (p === ByteType) return gl.BYTE; + if (p === ShortType) return gl.SHORT; + if (p === UnsignedShortType) return gl.UNSIGNED_SHORT; + if (p === IntType) return gl.INT; + if (p === UnsignedIntType) return gl.UNSIGNED_INT; + if (p === FloatType) return gl.FLOAT; + if (p === HalfFloatType) return gl.HALF_FLOAT; + if (p === AlphaFormat) return gl.ALPHA; + if (p === RGBFormat) return gl.RGB; + if (p === RGBAFormat) return gl.RGBA; + if (p === DepthFormat) return gl.DEPTH_COMPONENT; + if (p === DepthStencilFormat) return gl.DEPTH_STENCIL; + if (p === RedFormat) return gl.RED; + if (p === RedIntegerFormat) return gl.RED_INTEGER; + if (p === RGFormat) return gl.RG; + if (p === RGIntegerFormat) return gl.RG_INTEGER; + if (p === RGBAIntegerFormat) return gl.RGBA_INTEGER; + if (p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format) { + if (transfer === SRGBTransfer) { + extension = extensions.get("WEBGL_compressed_texture_s3tc_srgb"); + if (extension !== null) { + if (p === RGB_S3TC_DXT1_Format) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; + if (p === RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; + } else { + return null; + } + } else { + extension = extensions.get("WEBGL_compressed_texture_s3tc"); + if (extension !== null) { + if (p === RGB_S3TC_DXT1_Format) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT1_Format) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if (p === RGBA_S3TC_DXT3_Format) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if (p === RGBA_S3TC_DXT5_Format) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + } else { + return null; + } + } + } + if (p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format) { + extension = extensions.get("WEBGL_compressed_texture_pvrtc"); + if (extension !== null) { + if (p === RGB_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if (p === RGB_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if (p === RGBA_PVRTC_4BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if (p === RGBA_PVRTC_2BPPV1_Format) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + } else { + return null; + } + } + if (p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format || p === R11_EAC_Format || p === SIGNED_R11_EAC_Format || p === RG11_EAC_Format || p === SIGNED_RG11_EAC_Format) { + extension = extensions.get("WEBGL_compressed_texture_etc"); + if (extension !== null) { + if (p === RGB_ETC1_Format || p === RGB_ETC2_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2; + if (p === RGBA_ETC2_EAC_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC; + if (p === R11_EAC_Format) return extension.COMPRESSED_R11_EAC; + if (p === SIGNED_R11_EAC_Format) return extension.COMPRESSED_SIGNED_R11_EAC; + if (p === RG11_EAC_Format) return extension.COMPRESSED_RG11_EAC; + if (p === SIGNED_RG11_EAC_Format) return extension.COMPRESSED_SIGNED_RG11_EAC; + } else { + return null; + } + } + if (p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format || p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format || p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format || p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format || p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format) { + extension = extensions.get("WEBGL_compressed_texture_astc"); + if (extension !== null) { + if (p === RGBA_ASTC_4x4_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR; + if (p === RGBA_ASTC_5x4_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR; + if (p === RGBA_ASTC_5x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR; + if (p === RGBA_ASTC_6x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR; + if (p === RGBA_ASTC_6x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR; + if (p === RGBA_ASTC_8x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR; + if (p === RGBA_ASTC_8x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR; + if (p === RGBA_ASTC_8x8_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR; + if (p === RGBA_ASTC_10x5_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR; + if (p === RGBA_ASTC_10x6_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR; + if (p === RGBA_ASTC_10x8_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR; + if (p === RGBA_ASTC_10x10_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR; + if (p === RGBA_ASTC_12x10_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR; + if (p === RGBA_ASTC_12x12_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR; + } else { + return null; + } + } + if (p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format) { + extension = extensions.get("EXT_texture_compression_bptc"); + if (extension !== null) { + if (p === RGBA_BPTC_Format) return transfer === SRGBTransfer ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT; + if (p === RGB_BPTC_SIGNED_Format) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; + if (p === RGB_BPTC_UNSIGNED_Format) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; + } else { + return null; + } + } + if (p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format) { + extension = extensions.get("EXT_texture_compression_rgtc"); + if (extension !== null) { + if (p === RED_RGTC1_Format) return extension.COMPRESSED_RED_RGTC1_EXT; + if (p === SIGNED_RED_RGTC1_Format) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT; + if (p === RED_GREEN_RGTC2_Format) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT; + if (p === SIGNED_RED_GREEN_RGTC2_Format) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; + } else { + return null; + } + } + if (p === UnsignedInt248Type) return gl.UNSIGNED_INT_24_8; + return gl[p] !== void 0 ? gl[p] : null; + } + return { convert }; +} +var _occlusion_vertex = ` +void main() { + + gl_Position = vec4( position, 1.0 ); + +}`; +var _occlusion_fragment = ` +uniform sampler2DArray depthColor; +uniform float depthWidth; +uniform float depthHeight; + +void main() { + + vec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight ); + + if ( coord.x >= 1.0 ) { + + gl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r; + + } else { + + gl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r; + + } + +}`; +var WebXRDepthSensing = class { + /** + * Constructs a new depth sensing module. + */ + constructor() { + this.texture = null; + this.mesh = null; + this.depthNear = 0; + this.depthFar = 0; + } + /** + * Inits the depth sensing module + * + * @param {XRWebGLDepthInformation} depthData - The XR depth data. + * @param {XRRenderState} renderState - The XR render state. + */ + init(depthData, renderState) { + if (this.texture === null) { + const texture = new ExternalTexture(depthData.texture); + if (depthData.depthNear !== renderState.depthNear || depthData.depthFar !== renderState.depthFar) { + this.depthNear = depthData.depthNear; + this.depthFar = depthData.depthFar; + } + this.texture = texture; + } + } + /** + * Returns a plane mesh that visualizes the depth texture. + * + * @param {ArrayCamera} cameraXR - The XR camera. + * @return {?Mesh} The plane mesh. + */ + getMesh(cameraXR) { + if (this.texture !== null) { + if (this.mesh === null) { + const viewport = cameraXR.cameras[0].viewport; + const material = new ShaderMaterial({ + vertexShader: _occlusion_vertex, + fragmentShader: _occlusion_fragment, + uniforms: { + depthColor: { value: this.texture }, + depthWidth: { value: viewport.z }, + depthHeight: { value: viewport.w } + } + }); + this.mesh = new Mesh(new PlaneGeometry(20, 20), material); + } + } + return this.mesh; + } + /** + * Resets the module + */ + reset() { + this.texture = null; + this.mesh = null; + } + /** + * Returns a texture representing the depth of the user's environment. + * + * @return {?ExternalTexture} The depth texture. + */ + getDepthTexture() { + return this.texture; + } +}; +var WebXRManager = class extends EventDispatcher { + /** + * Constructs a new WebGL renderer. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGL2RenderingContext} gl - The rendering context. + */ + constructor(renderer, gl) { + super(); + const scope = this; + let session = null; + let framebufferScaleFactor = 1; + let referenceSpace = null; + let referenceSpaceType = "local-floor"; + let foveation = 1; + let customReferenceSpace = null; + let pose = null; + let glBinding = null; + let glProjLayer = null; + let glBaseLayer = null; + let xrFrame = null; + const supportsGlBinding = typeof XRWebGLBinding !== "undefined"; + const depthSensing = new WebXRDepthSensing(); + const cameraAccessTextures = {}; + const attributes = gl.getContextAttributes(); + let initialRenderTarget = null; + let newRenderTarget = null; + const controllers = []; + const controllerInputSources = []; + const currentSize = new Vector2(); + let currentPixelRatio = null; + const cameraL = new PerspectiveCamera(); + cameraL.viewport = new Vector4(); + const cameraR = new PerspectiveCamera(); + cameraR.viewport = new Vector4(); + const cameras = [cameraL, cameraR]; + const cameraXR = new ArrayCamera(); + let _currentDepthNear = null; + let _currentDepthFar = null; + this.cameraAutoUpdate = true; + this.enabled = false; + this.isPresenting = false; + this.getController = function(index) { + let controller = controllers[index]; + if (controller === void 0) { + controller = new WebXRController(); + controllers[index] = controller; + } + return controller.getTargetRaySpace(); + }; + this.getControllerGrip = function(index) { + let controller = controllers[index]; + if (controller === void 0) { + controller = new WebXRController(); + controllers[index] = controller; + } + return controller.getGripSpace(); + }; + this.getHand = function(index) { + let controller = controllers[index]; + if (controller === void 0) { + controller = new WebXRController(); + controllers[index] = controller; + } + return controller.getHandSpace(); + }; + function onSessionEvent(event) { + const controllerIndex = controllerInputSources.indexOf(event.inputSource); + if (controllerIndex === -1) { + return; + } + const controller = controllers[controllerIndex]; + if (controller !== void 0) { + controller.update(event.inputSource, event.frame, customReferenceSpace || referenceSpace); + controller.dispatchEvent({ type: event.type, data: event.inputSource }); + } + } + function onSessionEnd() { + session.removeEventListener("select", onSessionEvent); + session.removeEventListener("selectstart", onSessionEvent); + session.removeEventListener("selectend", onSessionEvent); + session.removeEventListener("squeeze", onSessionEvent); + session.removeEventListener("squeezestart", onSessionEvent); + session.removeEventListener("squeezeend", onSessionEvent); + session.removeEventListener("end", onSessionEnd); + session.removeEventListener("inputsourceschange", onInputSourcesChange); + for (let i = 0; i < controllers.length; i++) { + const inputSource = controllerInputSources[i]; + if (inputSource === null) continue; + controllerInputSources[i] = null; + controllers[i].disconnect(inputSource); + } + _currentDepthNear = null; + _currentDepthFar = null; + depthSensing.reset(); + for (const key in cameraAccessTextures) { + delete cameraAccessTextures[key]; + } + renderer.setRenderTarget(initialRenderTarget); + glBaseLayer = null; + glProjLayer = null; + glBinding = null; + session = null; + newRenderTarget = null; + animation.stop(); + scope.isPresenting = false; + renderer.setPixelRatio(currentPixelRatio); + renderer.setSize(currentSize.width, currentSize.height, false); + scope.dispatchEvent({ type: "sessionend" }); + } + this.setFramebufferScaleFactor = function(value) { + framebufferScaleFactor = value; + if (scope.isPresenting === true) { + warn("WebXRManager: Cannot change framebuffer scale while presenting."); + } + }; + this.setReferenceSpaceType = function(value) { + referenceSpaceType = value; + if (scope.isPresenting === true) { + warn("WebXRManager: Cannot change reference space type while presenting."); + } + }; + this.getReferenceSpace = function() { + return customReferenceSpace || referenceSpace; + }; + this.setReferenceSpace = function(space) { + customReferenceSpace = space; + }; + this.getBaseLayer = function() { + return glProjLayer !== null ? glProjLayer : glBaseLayer; + }; + this.getBinding = function() { + if (glBinding === null && supportsGlBinding) { + glBinding = new XRWebGLBinding(session, gl); + } + return glBinding; + }; + this.getFrame = function() { + return xrFrame; + }; + this.getSession = function() { + return session; + }; + this.setSession = async function(value) { + session = value; + if (session !== null) { + initialRenderTarget = renderer.getRenderTarget(); + session.addEventListener("select", onSessionEvent); + session.addEventListener("selectstart", onSessionEvent); + session.addEventListener("selectend", onSessionEvent); + session.addEventListener("squeeze", onSessionEvent); + session.addEventListener("squeezestart", onSessionEvent); + session.addEventListener("squeezeend", onSessionEvent); + session.addEventListener("end", onSessionEnd); + session.addEventListener("inputsourceschange", onInputSourcesChange); + if (attributes.xrCompatible !== true) { + await gl.makeXRCompatible(); + } + currentPixelRatio = renderer.getPixelRatio(); + renderer.getSize(currentSize); + const supportsLayers = supportsGlBinding && "createProjectionLayer" in XRWebGLBinding.prototype; + if (!supportsLayers) { + const layerInit = { + antialias: attributes.antialias, + alpha: true, + depth: attributes.depth, + stencil: attributes.stencil, + framebufferScaleFactor + }; + glBaseLayer = new XRWebGLLayer(session, gl, layerInit); + session.updateRenderState({ baseLayer: glBaseLayer }); + renderer.setPixelRatio(1); + renderer.setSize(glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false); + newRenderTarget = new WebGLRenderTarget( + glBaseLayer.framebufferWidth, + glBaseLayer.framebufferHeight, + { + format: RGBAFormat, + type: UnsignedByteType, + colorSpace: renderer.outputColorSpace, + stencilBuffer: attributes.stencil, + resolveDepthBuffer: glBaseLayer.ignoreDepthValues === false, + resolveStencilBuffer: glBaseLayer.ignoreDepthValues === false + } + ); + } else { + let depthFormat = null; + let depthType = null; + let glDepthFormat = null; + if (attributes.depth) { + glDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24; + depthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat; + depthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType; + } + const projectionlayerInit = { + colorFormat: gl.RGBA8, + depthFormat: glDepthFormat, + scaleFactor: framebufferScaleFactor + }; + glBinding = this.getBinding(); + glProjLayer = glBinding.createProjectionLayer(projectionlayerInit); + session.updateRenderState({ layers: [glProjLayer] }); + renderer.setPixelRatio(1); + renderer.setSize(glProjLayer.textureWidth, glProjLayer.textureHeight, false); + newRenderTarget = new WebGLRenderTarget( + glProjLayer.textureWidth, + glProjLayer.textureHeight, + { + format: RGBAFormat, + type: UnsignedByteType, + depthTexture: new DepthTexture(glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, void 0, void 0, void 0, void 0, void 0, void 0, depthFormat), + stencilBuffer: attributes.stencil, + colorSpace: renderer.outputColorSpace, + samples: attributes.antialias ? 4 : 0, + resolveDepthBuffer: glProjLayer.ignoreDepthValues === false, + resolveStencilBuffer: glProjLayer.ignoreDepthValues === false + } + ); + } + newRenderTarget.isXRRenderTarget = true; + this.setFoveation(foveation); + customReferenceSpace = null; + referenceSpace = await session.requestReferenceSpace(referenceSpaceType); + animation.setContext(session); + animation.start(); + scope.isPresenting = true; + scope.dispatchEvent({ type: "sessionstart" }); + } + }; + this.getEnvironmentBlendMode = function() { + if (session !== null) { + return session.environmentBlendMode; + } + }; + this.getDepthTexture = function() { + return depthSensing.getDepthTexture(); + }; + function onInputSourcesChange(event) { + for (let i = 0; i < event.removed.length; i++) { + const inputSource = event.removed[i]; + const index = controllerInputSources.indexOf(inputSource); + if (index >= 0) { + controllerInputSources[index] = null; + controllers[index].disconnect(inputSource); + } + } + for (let i = 0; i < event.added.length; i++) { + const inputSource = event.added[i]; + let controllerIndex = controllerInputSources.indexOf(inputSource); + if (controllerIndex === -1) { + for (let i2 = 0; i2 < controllers.length; i2++) { + if (i2 >= controllerInputSources.length) { + controllerInputSources.push(inputSource); + controllerIndex = i2; + break; + } else if (controllerInputSources[i2] === null) { + controllerInputSources[i2] = inputSource; + controllerIndex = i2; + break; + } + } + if (controllerIndex === -1) break; + } + const controller = controllers[controllerIndex]; + if (controller) { + controller.connect(inputSource); + } + } + } + const cameraLPos = new Vector3(); + const cameraRPos = new Vector3(); + function setProjectionFromUnion(camera, cameraL2, cameraR2) { + cameraLPos.setFromMatrixPosition(cameraL2.matrixWorld); + cameraRPos.setFromMatrixPosition(cameraR2.matrixWorld); + const ipd = cameraLPos.distanceTo(cameraRPos); + const projL = cameraL2.projectionMatrix.elements; + const projR = cameraR2.projectionMatrix.elements; + const near = projL[14] / (projL[10] - 1); + const far = projL[14] / (projL[10] + 1); + const topFov = (projL[9] + 1) / projL[5]; + const bottomFov = (projL[9] - 1) / projL[5]; + const leftFov = (projL[8] - 1) / projL[0]; + const rightFov = (projR[8] + 1) / projR[0]; + const left = near * leftFov; + const right = near * rightFov; + const zOffset = ipd / (-leftFov + rightFov); + const xOffset = zOffset * -leftFov; + cameraL2.matrixWorld.decompose(camera.position, camera.quaternion, camera.scale); + camera.translateX(xOffset); + camera.translateZ(zOffset); + camera.matrixWorld.compose(camera.position, camera.quaternion, camera.scale); + camera.matrixWorldInverse.copy(camera.matrixWorld).invert(); + if (projL[10] === -1) { + camera.projectionMatrix.copy(cameraL2.projectionMatrix); + camera.projectionMatrixInverse.copy(cameraL2.projectionMatrixInverse); + } else { + const near2 = near + zOffset; + const far2 = far + zOffset; + const left2 = left - xOffset; + const right2 = right + (ipd - xOffset); + const top2 = topFov * far / far2 * near2; + const bottom2 = bottomFov * far / far2 * near2; + camera.projectionMatrix.makePerspective(left2, right2, top2, bottom2, near2, far2); + camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert(); + } + } + function updateCamera(camera, parent) { + if (parent === null) { + camera.matrixWorld.copy(camera.matrix); + } else { + camera.matrixWorld.multiplyMatrices(parent.matrixWorld, camera.matrix); + } + camera.matrixWorldInverse.copy(camera.matrixWorld).invert(); + } + this.updateCamera = function(camera) { + if (session === null) return; + let depthNear = camera.near; + let depthFar = camera.far; + if (depthSensing.texture !== null) { + if (depthSensing.depthNear > 0) depthNear = depthSensing.depthNear; + if (depthSensing.depthFar > 0) depthFar = depthSensing.depthFar; + } + cameraXR.near = cameraR.near = cameraL.near = depthNear; + cameraXR.far = cameraR.far = cameraL.far = depthFar; + if (_currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far) { + session.updateRenderState({ + depthNear: cameraXR.near, + depthFar: cameraXR.far + }); + _currentDepthNear = cameraXR.near; + _currentDepthFar = cameraXR.far; + } + cameraXR.layers.mask = camera.layers.mask | 6; + cameraL.layers.mask = cameraXR.layers.mask & 3; + cameraR.layers.mask = cameraXR.layers.mask & 5; + const parent = camera.parent; + const cameras2 = cameraXR.cameras; + updateCamera(cameraXR, parent); + for (let i = 0; i < cameras2.length; i++) { + updateCamera(cameras2[i], parent); + } + if (cameras2.length === 2) { + setProjectionFromUnion(cameraXR, cameraL, cameraR); + } else { + cameraXR.projectionMatrix.copy(cameraL.projectionMatrix); + } + updateUserCamera(camera, cameraXR, parent); + }; + function updateUserCamera(camera, cameraXR2, parent) { + if (parent === null) { + camera.matrix.copy(cameraXR2.matrixWorld); + } else { + camera.matrix.copy(parent.matrixWorld); + camera.matrix.invert(); + camera.matrix.multiply(cameraXR2.matrixWorld); + } + camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); + camera.updateMatrixWorld(true); + camera.projectionMatrix.copy(cameraXR2.projectionMatrix); + camera.projectionMatrixInverse.copy(cameraXR2.projectionMatrixInverse); + if (camera.isPerspectiveCamera) { + camera.fov = RAD2DEG * 2 * Math.atan(1 / camera.projectionMatrix.elements[5]); + camera.zoom = 1; + } + } + this.getCamera = function() { + return cameraXR; + }; + this.getFoveation = function() { + if (glProjLayer === null && glBaseLayer === null) { + return void 0; + } + return foveation; + }; + this.setFoveation = function(value) { + foveation = value; + if (glProjLayer !== null) { + glProjLayer.fixedFoveation = value; + } + if (glBaseLayer !== null && glBaseLayer.fixedFoveation !== void 0) { + glBaseLayer.fixedFoveation = value; + } + }; + this.hasDepthSensing = function() { + return depthSensing.texture !== null; + }; + this.getDepthSensingMesh = function() { + return depthSensing.getMesh(cameraXR); + }; + this.getCameraTexture = function(xrCamera) { + return cameraAccessTextures[xrCamera]; + }; + let onAnimationFrameCallback = null; + function onAnimationFrame(time, frame) { + pose = frame.getViewerPose(customReferenceSpace || referenceSpace); + xrFrame = frame; + if (pose !== null) { + const views = pose.views; + if (glBaseLayer !== null) { + renderer.setRenderTargetFramebuffer(newRenderTarget, glBaseLayer.framebuffer); + renderer.setRenderTarget(newRenderTarget); + } + let cameraXRNeedsUpdate = false; + if (views.length !== cameraXR.cameras.length) { + cameraXR.cameras.length = 0; + cameraXRNeedsUpdate = true; + } + for (let i = 0; i < views.length; i++) { + const view = views[i]; + let viewport = null; + if (glBaseLayer !== null) { + viewport = glBaseLayer.getViewport(view); + } else { + const glSubImage = glBinding.getViewSubImage(glProjLayer, view); + viewport = glSubImage.viewport; + if (i === 0) { + renderer.setRenderTargetTextures( + newRenderTarget, + glSubImage.colorTexture, + glSubImage.depthStencilTexture + ); + renderer.setRenderTarget(newRenderTarget); + } + } + let camera = cameras[i]; + if (camera === void 0) { + camera = new PerspectiveCamera(); + camera.layers.enable(i); + camera.viewport = new Vector4(); + cameras[i] = camera; + } + camera.matrix.fromArray(view.transform.matrix); + camera.matrix.decompose(camera.position, camera.quaternion, camera.scale); + camera.projectionMatrix.fromArray(view.projectionMatrix); + camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert(); + camera.viewport.set(viewport.x, viewport.y, viewport.width, viewport.height); + if (i === 0) { + cameraXR.matrix.copy(camera.matrix); + cameraXR.matrix.decompose(cameraXR.position, cameraXR.quaternion, cameraXR.scale); + } + if (cameraXRNeedsUpdate === true) { + cameraXR.cameras.push(camera); + } + } + const enabledFeatures = session.enabledFeatures; + const gpuDepthSensingEnabled = enabledFeatures && enabledFeatures.includes("depth-sensing") && session.depthUsage == "gpu-optimized"; + if (gpuDepthSensingEnabled && supportsGlBinding) { + glBinding = scope.getBinding(); + const depthData = glBinding.getDepthInformation(views[0]); + if (depthData && depthData.isValid && depthData.texture) { + depthSensing.init(depthData, session.renderState); + } + } + const cameraAccessEnabled = enabledFeatures && enabledFeatures.includes("camera-access"); + if (cameraAccessEnabled && supportsGlBinding) { + renderer.state.unbindTexture(); + glBinding = scope.getBinding(); + for (let i = 0; i < views.length; i++) { + const camera = views[i].camera; + if (camera) { + let cameraTex = cameraAccessTextures[camera]; + if (!cameraTex) { + cameraTex = new ExternalTexture(); + cameraAccessTextures[camera] = cameraTex; + } + const glTexture = glBinding.getCameraImage(camera); + cameraTex.sourceTexture = glTexture; + } + } + } + } + for (let i = 0; i < controllers.length; i++) { + const inputSource = controllerInputSources[i]; + const controller = controllers[i]; + if (inputSource !== null && controller !== void 0) { + controller.update(inputSource, frame, customReferenceSpace || referenceSpace); + } + } + if (onAnimationFrameCallback) onAnimationFrameCallback(time, frame); + if (frame.detectedPlanes) { + scope.dispatchEvent({ type: "planesdetected", data: frame }); + } + xrFrame = null; + } + const animation = new WebGLAnimation(); + animation.setAnimationLoop(onAnimationFrame); + this.setAnimationLoop = function(callback) { + onAnimationFrameCallback = callback; + }; + this.dispose = function() { + }; + } +}; +var _e1 = new Euler(); +var _m12 = new Matrix4(); +function WebGLMaterials(renderer, properties) { + function refreshTransformUniform(map, uniform) { + if (map.matrixAutoUpdate === true) { + map.updateMatrix(); + } + uniform.value.copy(map.matrix); + } + function refreshFogUniforms(uniforms, fog) { + fog.color.getRGB(uniforms.fogColor.value, getUnlitUniformColorSpace(renderer)); + if (fog.isFog) { + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + } else if (fog.isFogExp2) { + uniforms.fogDensity.value = fog.density; + } + } + function refreshMaterialUniforms(uniforms, material, pixelRatio, height, transmissionRenderTarget) { + if (material.isMeshBasicMaterial) { + refreshUniformsCommon(uniforms, material); + } else if (material.isMeshLambertMaterial) { + refreshUniformsCommon(uniforms, material); + } else if (material.isMeshToonMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsToon(uniforms, material); + } else if (material.isMeshPhongMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsPhong(uniforms, material); + } else if (material.isMeshStandardMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsStandard(uniforms, material); + if (material.isMeshPhysicalMaterial) { + refreshUniformsPhysical(uniforms, material, transmissionRenderTarget); + } + } else if (material.isMeshMatcapMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsMatcap(uniforms, material); + } else if (material.isMeshDepthMaterial) { + refreshUniformsCommon(uniforms, material); + } else if (material.isMeshDistanceMaterial) { + refreshUniformsCommon(uniforms, material); + refreshUniformsDistance(uniforms, material); + } else if (material.isMeshNormalMaterial) { + refreshUniformsCommon(uniforms, material); + } else if (material.isLineBasicMaterial) { + refreshUniformsLine(uniforms, material); + if (material.isLineDashedMaterial) { + refreshUniformsDash(uniforms, material); + } + } else if (material.isPointsMaterial) { + refreshUniformsPoints(uniforms, material, pixelRatio, height); + } else if (material.isSpriteMaterial) { + refreshUniformsSprites(uniforms, material); + } else if (material.isShadowMaterial) { + uniforms.color.value.copy(material.color); + uniforms.opacity.value = material.opacity; + } else if (material.isShaderMaterial) { + material.uniformsNeedUpdate = false; + } + } + function refreshUniformsCommon(uniforms, material) { + uniforms.opacity.value = material.opacity; + if (material.color) { + uniforms.diffuse.value.copy(material.color); + } + if (material.emissive) { + uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity); + } + if (material.map) { + uniforms.map.value = material.map; + refreshTransformUniform(material.map, uniforms.mapTransform); + } + if (material.alphaMap) { + uniforms.alphaMap.value = material.alphaMap; + refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); + } + if (material.bumpMap) { + uniforms.bumpMap.value = material.bumpMap; + refreshTransformUniform(material.bumpMap, uniforms.bumpMapTransform); + uniforms.bumpScale.value = material.bumpScale; + if (material.side === BackSide) { + uniforms.bumpScale.value *= -1; + } + } + if (material.normalMap) { + uniforms.normalMap.value = material.normalMap; + refreshTransformUniform(material.normalMap, uniforms.normalMapTransform); + uniforms.normalScale.value.copy(material.normalScale); + if (material.side === BackSide) { + uniforms.normalScale.value.negate(); + } + } + if (material.displacementMap) { + uniforms.displacementMap.value = material.displacementMap; + refreshTransformUniform(material.displacementMap, uniforms.displacementMapTransform); + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + } + if (material.emissiveMap) { + uniforms.emissiveMap.value = material.emissiveMap; + refreshTransformUniform(material.emissiveMap, uniforms.emissiveMapTransform); + } + if (material.specularMap) { + uniforms.specularMap.value = material.specularMap; + refreshTransformUniform(material.specularMap, uniforms.specularMapTransform); + } + if (material.alphaTest > 0) { + uniforms.alphaTest.value = material.alphaTest; + } + const materialProperties = properties.get(material); + const envMap = materialProperties.envMap; + const envMapRotation = materialProperties.envMapRotation; + if (envMap) { + uniforms.envMap.value = envMap; + _e1.copy(envMapRotation); + _e1.x *= -1; + _e1.y *= -1; + _e1.z *= -1; + if (envMap.isCubeTexture && envMap.isRenderTargetTexture === false) { + _e1.y *= -1; + _e1.z *= -1; + } + uniforms.envMapRotation.value.setFromMatrix4(_m12.makeRotationFromEuler(_e1)); + uniforms.flipEnvMap.value = envMap.isCubeTexture && envMap.isRenderTargetTexture === false ? -1 : 1; + uniforms.reflectivity.value = material.reflectivity; + uniforms.ior.value = material.ior; + uniforms.refractionRatio.value = material.refractionRatio; + } + if (material.lightMap) { + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + refreshTransformUniform(material.lightMap, uniforms.lightMapTransform); + } + if (material.aoMap) { + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + refreshTransformUniform(material.aoMap, uniforms.aoMapTransform); + } + } + function refreshUniformsLine(uniforms, material) { + uniforms.diffuse.value.copy(material.color); + uniforms.opacity.value = material.opacity; + if (material.map) { + uniforms.map.value = material.map; + refreshTransformUniform(material.map, uniforms.mapTransform); + } + } + function refreshUniformsDash(uniforms, material) { + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + } + function refreshUniformsPoints(uniforms, material, pixelRatio, height) { + uniforms.diffuse.value.copy(material.color); + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * pixelRatio; + uniforms.scale.value = height * 0.5; + if (material.map) { + uniforms.map.value = material.map; + refreshTransformUniform(material.map, uniforms.uvTransform); + } + if (material.alphaMap) { + uniforms.alphaMap.value = material.alphaMap; + refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); + } + if (material.alphaTest > 0) { + uniforms.alphaTest.value = material.alphaTest; + } + } + function refreshUniformsSprites(uniforms, material) { + uniforms.diffuse.value.copy(material.color); + uniforms.opacity.value = material.opacity; + uniforms.rotation.value = material.rotation; + if (material.map) { + uniforms.map.value = material.map; + refreshTransformUniform(material.map, uniforms.mapTransform); + } + if (material.alphaMap) { + uniforms.alphaMap.value = material.alphaMap; + refreshTransformUniform(material.alphaMap, uniforms.alphaMapTransform); + } + if (material.alphaTest > 0) { + uniforms.alphaTest.value = material.alphaTest; + } + } + function refreshUniformsPhong(uniforms, material) { + uniforms.specular.value.copy(material.specular); + uniforms.shininess.value = Math.max(material.shininess, 1e-4); + } + function refreshUniformsToon(uniforms, material) { + if (material.gradientMap) { + uniforms.gradientMap.value = material.gradientMap; + } + } + function refreshUniformsStandard(uniforms, material) { + uniforms.metalness.value = material.metalness; + if (material.metalnessMap) { + uniforms.metalnessMap.value = material.metalnessMap; + refreshTransformUniform(material.metalnessMap, uniforms.metalnessMapTransform); + } + uniforms.roughness.value = material.roughness; + if (material.roughnessMap) { + uniforms.roughnessMap.value = material.roughnessMap; + refreshTransformUniform(material.roughnessMap, uniforms.roughnessMapTransform); + } + if (material.envMap) { + uniforms.envMapIntensity.value = material.envMapIntensity; + } + } + function refreshUniformsPhysical(uniforms, material, transmissionRenderTarget) { + uniforms.ior.value = material.ior; + if (material.sheen > 0) { + uniforms.sheenColor.value.copy(material.sheenColor).multiplyScalar(material.sheen); + uniforms.sheenRoughness.value = material.sheenRoughness; + if (material.sheenColorMap) { + uniforms.sheenColorMap.value = material.sheenColorMap; + refreshTransformUniform(material.sheenColorMap, uniforms.sheenColorMapTransform); + } + if (material.sheenRoughnessMap) { + uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap; + refreshTransformUniform(material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform); + } + } + if (material.clearcoat > 0) { + uniforms.clearcoat.value = material.clearcoat; + uniforms.clearcoatRoughness.value = material.clearcoatRoughness; + if (material.clearcoatMap) { + uniforms.clearcoatMap.value = material.clearcoatMap; + refreshTransformUniform(material.clearcoatMap, uniforms.clearcoatMapTransform); + } + if (material.clearcoatRoughnessMap) { + uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap; + refreshTransformUniform(material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform); + } + if (material.clearcoatNormalMap) { + uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap; + refreshTransformUniform(material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform); + uniforms.clearcoatNormalScale.value.copy(material.clearcoatNormalScale); + if (material.side === BackSide) { + uniforms.clearcoatNormalScale.value.negate(); + } + } + } + if (material.dispersion > 0) { + uniforms.dispersion.value = material.dispersion; + } + if (material.iridescence > 0) { + uniforms.iridescence.value = material.iridescence; + uniforms.iridescenceIOR.value = material.iridescenceIOR; + uniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[0]; + uniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[1]; + if (material.iridescenceMap) { + uniforms.iridescenceMap.value = material.iridescenceMap; + refreshTransformUniform(material.iridescenceMap, uniforms.iridescenceMapTransform); + } + if (material.iridescenceThicknessMap) { + uniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap; + refreshTransformUniform(material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform); + } + } + if (material.transmission > 0) { + uniforms.transmission.value = material.transmission; + uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture; + uniforms.transmissionSamplerSize.value.set(transmissionRenderTarget.width, transmissionRenderTarget.height); + if (material.transmissionMap) { + uniforms.transmissionMap.value = material.transmissionMap; + refreshTransformUniform(material.transmissionMap, uniforms.transmissionMapTransform); + } + uniforms.thickness.value = material.thickness; + if (material.thicknessMap) { + uniforms.thicknessMap.value = material.thicknessMap; + refreshTransformUniform(material.thicknessMap, uniforms.thicknessMapTransform); + } + uniforms.attenuationDistance.value = material.attenuationDistance; + uniforms.attenuationColor.value.copy(material.attenuationColor); + } + if (material.anisotropy > 0) { + uniforms.anisotropyVector.value.set(material.anisotropy * Math.cos(material.anisotropyRotation), material.anisotropy * Math.sin(material.anisotropyRotation)); + if (material.anisotropyMap) { + uniforms.anisotropyMap.value = material.anisotropyMap; + refreshTransformUniform(material.anisotropyMap, uniforms.anisotropyMapTransform); + } + } + uniforms.specularIntensity.value = material.specularIntensity; + uniforms.specularColor.value.copy(material.specularColor); + if (material.specularColorMap) { + uniforms.specularColorMap.value = material.specularColorMap; + refreshTransformUniform(material.specularColorMap, uniforms.specularColorMapTransform); + } + if (material.specularIntensityMap) { + uniforms.specularIntensityMap.value = material.specularIntensityMap; + refreshTransformUniform(material.specularIntensityMap, uniforms.specularIntensityMapTransform); + } + } + function refreshUniformsMatcap(uniforms, material) { + if (material.matcap) { + uniforms.matcap.value = material.matcap; + } + } + function refreshUniformsDistance(uniforms, material) { + const light = properties.get(material).light; + uniforms.referencePosition.value.setFromMatrixPosition(light.matrixWorld); + uniforms.nearDistance.value = light.shadow.camera.near; + uniforms.farDistance.value = light.shadow.camera.far; + } + return { + refreshFogUniforms, + refreshMaterialUniforms + }; +} +function WebGLUniformsGroups(gl, info, capabilities, state) { + let buffers = {}; + let updateList = {}; + let allocatedBindingPoints = []; + const maxBindingPoints = gl.getParameter(gl.MAX_UNIFORM_BUFFER_BINDINGS); + function bind(uniformsGroup, program) { + const webglProgram = program.program; + state.uniformBlockBinding(uniformsGroup, webglProgram); + } + function update(uniformsGroup, program) { + let buffer = buffers[uniformsGroup.id]; + if (buffer === void 0) { + prepareUniformsGroup(uniformsGroup); + buffer = createBuffer(uniformsGroup); + buffers[uniformsGroup.id] = buffer; + uniformsGroup.addEventListener("dispose", onUniformsGroupsDispose); + } + const webglProgram = program.program; + state.updateUBOMapping(uniformsGroup, webglProgram); + const frame = info.render.frame; + if (updateList[uniformsGroup.id] !== frame) { + updateBufferData(uniformsGroup); + updateList[uniformsGroup.id] = frame; + } + } + function createBuffer(uniformsGroup) { + const bindingPointIndex = allocateBindingPointIndex(); + uniformsGroup.__bindingPointIndex = bindingPointIndex; + const buffer = gl.createBuffer(); + const size = uniformsGroup.__size; + const usage = uniformsGroup.usage; + gl.bindBuffer(gl.UNIFORM_BUFFER, buffer); + gl.bufferData(gl.UNIFORM_BUFFER, size, usage); + gl.bindBuffer(gl.UNIFORM_BUFFER, null); + gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPointIndex, buffer); + return buffer; + } + function allocateBindingPointIndex() { + for (let i = 0; i < maxBindingPoints; i++) { + if (allocatedBindingPoints.indexOf(i) === -1) { + allocatedBindingPoints.push(i); + return i; + } + } + error("WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached."); + return 0; + } + function updateBufferData(uniformsGroup) { + const buffer = buffers[uniformsGroup.id]; + const uniforms = uniformsGroup.uniforms; + const cache = uniformsGroup.__cache; + gl.bindBuffer(gl.UNIFORM_BUFFER, buffer); + for (let i = 0, il = uniforms.length; i < il; i++) { + const uniformArray = Array.isArray(uniforms[i]) ? uniforms[i] : [uniforms[i]]; + for (let j = 0, jl = uniformArray.length; j < jl; j++) { + const uniform = uniformArray[j]; + if (hasUniformChanged(uniform, i, j, cache) === true) { + const offset = uniform.__offset; + const values = Array.isArray(uniform.value) ? uniform.value : [uniform.value]; + let arrayOffset = 0; + for (let k = 0; k < values.length; k++) { + const value = values[k]; + const info2 = getUniformSize(value); + if (typeof value === "number" || typeof value === "boolean") { + uniform.__data[0] = value; + gl.bufferSubData(gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data); + } else if (value.isMatrix3) { + uniform.__data[0] = value.elements[0]; + uniform.__data[1] = value.elements[1]; + uniform.__data[2] = value.elements[2]; + uniform.__data[3] = 0; + uniform.__data[4] = value.elements[3]; + uniform.__data[5] = value.elements[4]; + uniform.__data[6] = value.elements[5]; + uniform.__data[7] = 0; + uniform.__data[8] = value.elements[6]; + uniform.__data[9] = value.elements[7]; + uniform.__data[10] = value.elements[8]; + uniform.__data[11] = 0; + } else { + value.toArray(uniform.__data, arrayOffset); + arrayOffset += info2.storage / Float32Array.BYTES_PER_ELEMENT; + } + } + gl.bufferSubData(gl.UNIFORM_BUFFER, offset, uniform.__data); + } + } + } + gl.bindBuffer(gl.UNIFORM_BUFFER, null); + } + function hasUniformChanged(uniform, index, indexArray, cache) { + const value = uniform.value; + const indexString = index + "_" + indexArray; + if (cache[indexString] === void 0) { + if (typeof value === "number" || typeof value === "boolean") { + cache[indexString] = value; + } else { + cache[indexString] = value.clone(); + } + return true; + } else { + const cachedObject = cache[indexString]; + if (typeof value === "number" || typeof value === "boolean") { + if (cachedObject !== value) { + cache[indexString] = value; + return true; + } + } else { + if (cachedObject.equals(value) === false) { + cachedObject.copy(value); + return true; + } + } + } + return false; + } + function prepareUniformsGroup(uniformsGroup) { + const uniforms = uniformsGroup.uniforms; + let offset = 0; + const chunkSize = 16; + for (let i = 0, l = uniforms.length; i < l; i++) { + const uniformArray = Array.isArray(uniforms[i]) ? uniforms[i] : [uniforms[i]]; + for (let j = 0, jl = uniformArray.length; j < jl; j++) { + const uniform = uniformArray[j]; + const values = Array.isArray(uniform.value) ? uniform.value : [uniform.value]; + for (let k = 0, kl = values.length; k < kl; k++) { + const value = values[k]; + const info2 = getUniformSize(value); + const chunkOffset2 = offset % chunkSize; + const chunkPadding = chunkOffset2 % info2.boundary; + const chunkStart = chunkOffset2 + chunkPadding; + offset += chunkPadding; + if (chunkStart !== 0 && chunkSize - chunkStart < info2.storage) { + offset += chunkSize - chunkStart; + } + uniform.__data = new Float32Array(info2.storage / Float32Array.BYTES_PER_ELEMENT); + uniform.__offset = offset; + offset += info2.storage; + } + } + } + const chunkOffset = offset % chunkSize; + if (chunkOffset > 0) offset += chunkSize - chunkOffset; + uniformsGroup.__size = offset; + uniformsGroup.__cache = {}; + return this; + } + function getUniformSize(value) { + const info2 = { + boundary: 0, + // bytes + storage: 0 + // bytes + }; + if (typeof value === "number" || typeof value === "boolean") { + info2.boundary = 4; + info2.storage = 4; + } else if (value.isVector2) { + info2.boundary = 8; + info2.storage = 8; + } else if (value.isVector3 || value.isColor) { + info2.boundary = 16; + info2.storage = 12; + } else if (value.isVector4) { + info2.boundary = 16; + info2.storage = 16; + } else if (value.isMatrix3) { + info2.boundary = 48; + info2.storage = 48; + } else if (value.isMatrix4) { + info2.boundary = 64; + info2.storage = 64; + } else if (value.isTexture) { + warn("WebGLRenderer: Texture samplers can not be part of an uniforms group."); + } else { + warn("WebGLRenderer: Unsupported uniform value type.", value); + } + return info2; + } + function onUniformsGroupsDispose(event) { + const uniformsGroup = event.target; + uniformsGroup.removeEventListener("dispose", onUniformsGroupsDispose); + const index = allocatedBindingPoints.indexOf(uniformsGroup.__bindingPointIndex); + allocatedBindingPoints.splice(index, 1); + gl.deleteBuffer(buffers[uniformsGroup.id]); + delete buffers[uniformsGroup.id]; + delete updateList[uniformsGroup.id]; + } + function dispose() { + for (const id in buffers) { + gl.deleteBuffer(buffers[id]); + } + allocatedBindingPoints = []; + buffers = {}; + updateList = {}; + } + return { + bind, + update, + dispose + }; +} +var DATA = new Uint16Array([ + 12469, + 15057, + 12620, + 14925, + 13266, + 14620, + 13807, + 14376, + 14323, + 13990, + 14545, + 13625, + 14713, + 13328, + 14840, + 12882, + 14931, + 12528, + 14996, + 12233, + 15039, + 11829, + 15066, + 11525, + 15080, + 11295, + 15085, + 10976, + 15082, + 10705, + 15073, + 10495, + 13880, + 14564, + 13898, + 14542, + 13977, + 14430, + 14158, + 14124, + 14393, + 13732, + 14556, + 13410, + 14702, + 12996, + 14814, + 12596, + 14891, + 12291, + 14937, + 11834, + 14957, + 11489, + 14958, + 11194, + 14943, + 10803, + 14921, + 10506, + 14893, + 10278, + 14858, + 9960, + 14484, + 14039, + 14487, + 14025, + 14499, + 13941, + 14524, + 13740, + 14574, + 13468, + 14654, + 13106, + 14743, + 12678, + 14818, + 12344, + 14867, + 11893, + 14889, + 11509, + 14893, + 11180, + 14881, + 10751, + 14852, + 10428, + 14812, + 10128, + 14765, + 9754, + 14712, + 9466, + 14764, + 13480, + 14764, + 13475, + 14766, + 13440, + 14766, + 13347, + 14769, + 13070, + 14786, + 12713, + 14816, + 12387, + 14844, + 11957, + 14860, + 11549, + 14868, + 11215, + 14855, + 10751, + 14825, + 10403, + 14782, + 10044, + 14729, + 9651, + 14666, + 9352, + 14599, + 9029, + 14967, + 12835, + 14966, + 12831, + 14963, + 12804, + 14954, + 12723, + 14936, + 12564, + 14917, + 12347, + 14900, + 11958, + 14886, + 11569, + 14878, + 11247, + 14859, + 10765, + 14828, + 10401, + 14784, + 10011, + 14727, + 9600, + 14660, + 9289, + 14586, + 8893, + 14508, + 8533, + 15111, + 12234, + 15110, + 12234, + 15104, + 12216, + 15092, + 12156, + 15067, + 12010, + 15028, + 11776, + 14981, + 11500, + 14942, + 11205, + 14902, + 10752, + 14861, + 10393, + 14812, + 9991, + 14752, + 9570, + 14682, + 9252, + 14603, + 8808, + 14519, + 8445, + 14431, + 8145, + 15209, + 11449, + 15208, + 11451, + 15202, + 11451, + 15190, + 11438, + 15163, + 11384, + 15117, + 11274, + 15055, + 10979, + 14994, + 10648, + 14932, + 10343, + 14871, + 9936, + 14803, + 9532, + 14729, + 9218, + 14645, + 8742, + 14556, + 8381, + 14461, + 8020, + 14365, + 7603, + 15273, + 10603, + 15272, + 10607, + 15267, + 10619, + 15256, + 10631, + 15231, + 10614, + 15182, + 10535, + 15118, + 10389, + 15042, + 10167, + 14963, + 9787, + 14883, + 9447, + 14800, + 9115, + 14710, + 8665, + 14615, + 8318, + 14514, + 7911, + 14411, + 7507, + 14279, + 7198, + 15314, + 9675, + 15313, + 9683, + 15309, + 9712, + 15298, + 9759, + 15277, + 9797, + 15229, + 9773, + 15166, + 9668, + 15084, + 9487, + 14995, + 9274, + 14898, + 8910, + 14800, + 8539, + 14697, + 8234, + 14590, + 7790, + 14479, + 7409, + 14367, + 7067, + 14178, + 6621, + 15337, + 8619, + 15337, + 8631, + 15333, + 8677, + 15325, + 8769, + 15305, + 8871, + 15264, + 8940, + 15202, + 8909, + 15119, + 8775, + 15022, + 8565, + 14916, + 8328, + 14804, + 8009, + 14688, + 7614, + 14569, + 7287, + 14448, + 6888, + 14321, + 6483, + 14088, + 6171, + 15350, + 7402, + 15350, + 7419, + 15347, + 7480, + 15340, + 7613, + 15322, + 7804, + 15287, + 7973, + 15229, + 8057, + 15148, + 8012, + 15046, + 7846, + 14933, + 7611, + 14810, + 7357, + 14682, + 7069, + 14552, + 6656, + 14421, + 6316, + 14251, + 5948, + 14007, + 5528, + 15356, + 5942, + 15356, + 5977, + 15353, + 6119, + 15348, + 6294, + 15332, + 6551, + 15302, + 6824, + 15249, + 7044, + 15171, + 7122, + 15070, + 7050, + 14949, + 6861, + 14818, + 6611, + 14679, + 6349, + 14538, + 6067, + 14398, + 5651, + 14189, + 5311, + 13935, + 4958, + 15359, + 4123, + 15359, + 4153, + 15356, + 4296, + 15353, + 4646, + 15338, + 5160, + 15311, + 5508, + 15263, + 5829, + 15188, + 6042, + 15088, + 6094, + 14966, + 6001, + 14826, + 5796, + 14678, + 5543, + 14527, + 5287, + 14377, + 4985, + 14133, + 4586, + 13869, + 4257, + 15360, + 1563, + 15360, + 1642, + 15358, + 2076, + 15354, + 2636, + 15341, + 3350, + 15317, + 4019, + 15273, + 4429, + 15203, + 4732, + 15105, + 4911, + 14981, + 4932, + 14836, + 4818, + 14679, + 4621, + 14517, + 4386, + 14359, + 4156, + 14083, + 3795, + 13808, + 3437, + 15360, + 122, + 15360, + 137, + 15358, + 285, + 15355, + 636, + 15344, + 1274, + 15322, + 2177, + 15281, + 2765, + 15215, + 3223, + 15120, + 3451, + 14995, + 3569, + 14846, + 3567, + 14681, + 3466, + 14511, + 3305, + 14344, + 3121, + 14037, + 2800, + 13753, + 2467, + 15360, + 0, + 15360, + 1, + 15359, + 21, + 15355, + 89, + 15346, + 253, + 15325, + 479, + 15287, + 796, + 15225, + 1148, + 15133, + 1492, + 15008, + 1749, + 14856, + 1882, + 14685, + 1886, + 14506, + 1783, + 14324, + 1608, + 13996, + 1398, + 13702, + 1183 +]); +var lut = null; +function getDFGLUT() { + if (lut === null) { + lut = new DataTexture(DATA, 16, 16, RGFormat, HalfFloatType); + lut.name = "DFG_LUT"; + lut.minFilter = LinearFilter; + lut.magFilter = LinearFilter; + lut.wrapS = ClampToEdgeWrapping; + lut.wrapT = ClampToEdgeWrapping; + lut.generateMipmaps = false; + lut.needsUpdate = true; + } + return lut; +} +var WebGLRenderer = class { + /** + * Constructs a new WebGL renderer. + * + * @param {WebGLRenderer~Options} [parameters] - The configuration parameter. + */ + constructor(parameters = {}) { + const { + canvas = createCanvasElement(), + context = null, + depth = true, + stencil = false, + alpha = false, + antialias = false, + premultipliedAlpha = true, + preserveDrawingBuffer = false, + powerPreference = "default", + failIfMajorPerformanceCaveat = false, + reversedDepthBuffer = false, + outputBufferType = UnsignedByteType + } = parameters; + this.isWebGLRenderer = true; + let _alpha; + if (context !== null) { + if (typeof WebGLRenderingContext !== "undefined" && context instanceof WebGLRenderingContext) { + throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163."); + } + _alpha = context.getContextAttributes().alpha; + } else { + _alpha = alpha; + } + const _outputBufferType = outputBufferType; + const INTEGER_FORMATS = /* @__PURE__ */ new Set([ + RGBAIntegerFormat, + RGIntegerFormat, + RedIntegerFormat + ]); + const UNSIGNED_TYPES = /* @__PURE__ */ new Set([ + UnsignedByteType, + UnsignedIntType, + UnsignedShortType, + UnsignedInt248Type, + UnsignedShort4444Type, + UnsignedShort5551Type + ]); + const uintClearColor = new Uint32Array(4); + const intClearColor = new Int32Array(4); + let currentRenderList = null; + let currentRenderState = null; + const renderListStack = []; + const renderStateStack = []; + let output = null; + this.domElement = canvas; + this.debug = { + /** + * Enables error checking and reporting when shader programs are being compiled. + * @type {boolean} + */ + checkShaderErrors: true, + /** + * Callback for custom error reporting. + * @type {?Function} + */ + onShaderError: null + }; + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + this.sortObjects = true; + this.clippingPlanes = []; + this.localClippingEnabled = false; + this.toneMapping = NoToneMapping; + this.toneMappingExposure = 1; + this.transmissionResolutionScale = 1; + const _this = this; + let _isContextLost = false; + this._outputColorSpace = SRGBColorSpace; + let _currentActiveCubeFace = 0; + let _currentActiveMipmapLevel = 0; + let _currentRenderTarget = null; + let _currentMaterialId = -1; + let _currentCamera = null; + const _currentViewport = new Vector4(); + const _currentScissor = new Vector4(); + let _currentScissorTest = null; + const _currentClearColor = new Color(0); + let _currentClearAlpha = 0; + let _width = canvas.width; + let _height = canvas.height; + let _pixelRatio = 1; + let _opaqueSort = null; + let _transparentSort = null; + const _viewport = new Vector4(0, 0, _width, _height); + const _scissor = new Vector4(0, 0, _width, _height); + let _scissorTest = false; + const _frustum2 = new Frustum(); + let _clippingEnabled = false; + let _localClippingEnabled = false; + const _projScreenMatrix3 = new Matrix4(); + const _vector32 = new Vector3(); + const _vector4 = new Vector4(); + const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true }; + let _renderBackground = false; + function getTargetPixelRatio() { + return _currentRenderTarget === null ? _pixelRatio : 1; + } + let _gl = context; + function getContext(contextName, contextAttributes) { + return canvas.getContext(contextName, contextAttributes); + } + try { + const contextAttributes = { + alpha: true, + depth, + stencil, + antialias, + premultipliedAlpha, + preserveDrawingBuffer, + powerPreference, + failIfMajorPerformanceCaveat + }; + if ("setAttribute" in canvas) canvas.setAttribute("data-engine", `three.js r${REVISION}`); + canvas.addEventListener("webglcontextlost", onContextLost, false); + canvas.addEventListener("webglcontextrestored", onContextRestore, false); + canvas.addEventListener("webglcontextcreationerror", onContextCreationError, false); + if (_gl === null) { + const contextName = "webgl2"; + _gl = getContext(contextName, contextAttributes); + if (_gl === null) { + if (getContext(contextName)) { + throw new Error("Error creating WebGL context with your selected attributes."); + } else { + throw new Error("Error creating WebGL context."); + } + } + } + } catch (e) { + error("WebGLRenderer: " + e.message); + throw e; + } + let extensions, capabilities, state, info; + let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects; + let programCache, materials, renderLists, renderStates, clipping, shadowMap; + let background, morphtargets, bufferRenderer, indexedBufferRenderer; + let utils, bindingStates, uniformsGroups; + function initGLContext() { + extensions = new WebGLExtensions(_gl); + extensions.init(); + utils = new WebGLUtils(_gl, extensions); + capabilities = new WebGLCapabilities(_gl, extensions, parameters, utils); + state = new WebGLState(_gl, extensions); + if (capabilities.reversedDepthBuffer && reversedDepthBuffer) { + state.buffers.depth.setReversed(true); + } + info = new WebGLInfo(_gl); + properties = new WebGLProperties(); + textures = new WebGLTextures(_gl, extensions, state, properties, capabilities, utils, info); + cubemaps = new WebGLCubeMaps(_this); + cubeuvmaps = new WebGLCubeUVMaps(_this); + attributes = new WebGLAttributes(_gl); + bindingStates = new WebGLBindingStates(_gl, attributes); + geometries = new WebGLGeometries(_gl, attributes, info, bindingStates); + objects = new WebGLObjects(_gl, geometries, attributes, info); + morphtargets = new WebGLMorphtargets(_gl, capabilities, textures); + clipping = new WebGLClipping(properties); + programCache = new WebGLPrograms(_this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping); + materials = new WebGLMaterials(_this, properties); + renderLists = new WebGLRenderLists(); + renderStates = new WebGLRenderStates(extensions); + background = new WebGLBackground(_this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha); + shadowMap = new WebGLShadowMap(_this, objects, capabilities); + uniformsGroups = new WebGLUniformsGroups(_gl, info, capabilities, state); + bufferRenderer = new WebGLBufferRenderer(_gl, extensions, info); + indexedBufferRenderer = new WebGLIndexedBufferRenderer(_gl, extensions, info); + info.programs = programCache.programs; + _this.capabilities = capabilities; + _this.extensions = extensions; + _this.properties = properties; + _this.renderLists = renderLists; + _this.shadowMap = shadowMap; + _this.state = state; + _this.info = info; + } + initGLContext(); + if (_outputBufferType !== UnsignedByteType) { + output = new WebGLOutput(_outputBufferType, canvas.width, canvas.height, depth, stencil); + } + const xr = new WebXRManager(_this, _gl); + this.xr = xr; + this.getContext = function() { + return _gl; + }; + this.getContextAttributes = function() { + return _gl.getContextAttributes(); + }; + this.forceContextLoss = function() { + const extension = extensions.get("WEBGL_lose_context"); + if (extension) extension.loseContext(); + }; + this.forceContextRestore = function() { + const extension = extensions.get("WEBGL_lose_context"); + if (extension) extension.restoreContext(); + }; + this.getPixelRatio = function() { + return _pixelRatio; + }; + this.setPixelRatio = function(value) { + if (value === void 0) return; + _pixelRatio = value; + this.setSize(_width, _height, false); + }; + this.getSize = function(target) { + return target.set(_width, _height); + }; + this.setSize = function(width, height, updateStyle = true) { + if (xr.isPresenting) { + warn("WebGLRenderer: Can't change size while VR device is presenting."); + return; + } + _width = width; + _height = height; + canvas.width = Math.floor(width * _pixelRatio); + canvas.height = Math.floor(height * _pixelRatio); + if (updateStyle === true) { + canvas.style.width = width + "px"; + canvas.style.height = height + "px"; + } + if (output !== null) { + output.setSize(canvas.width, canvas.height); + } + this.setViewport(0, 0, width, height); + }; + this.getDrawingBufferSize = function(target) { + return target.set(_width * _pixelRatio, _height * _pixelRatio).floor(); + }; + this.setDrawingBufferSize = function(width, height, pixelRatio) { + _width = width; + _height = height; + _pixelRatio = pixelRatio; + canvas.width = Math.floor(width * pixelRatio); + canvas.height = Math.floor(height * pixelRatio); + this.setViewport(0, 0, width, height); + }; + this.setEffects = function(effects) { + if (_outputBufferType === UnsignedByteType) { + console.error("THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType."); + return; + } + if (effects) { + for (let i = 0; i < effects.length; i++) { + if (effects[i].isOutputPass === true) { + console.warn("THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically."); + break; + } + } + } + output.setEffects(effects || []); + }; + this.getCurrentViewport = function(target) { + return target.copy(_currentViewport); + }; + this.getViewport = function(target) { + return target.copy(_viewport); + }; + this.setViewport = function(x, y, width, height) { + if (x.isVector4) { + _viewport.set(x.x, x.y, x.z, x.w); + } else { + _viewport.set(x, y, width, height); + } + state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio).round()); + }; + this.getScissor = function(target) { + return target.copy(_scissor); + }; + this.setScissor = function(x, y, width, height) { + if (x.isVector4) { + _scissor.set(x.x, x.y, x.z, x.w); + } else { + _scissor.set(x, y, width, height); + } + state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio).round()); + }; + this.getScissorTest = function() { + return _scissorTest; + }; + this.setScissorTest = function(boolean) { + state.setScissorTest(_scissorTest = boolean); + }; + this.setOpaqueSort = function(method) { + _opaqueSort = method; + }; + this.setTransparentSort = function(method) { + _transparentSort = method; + }; + this.getClearColor = function(target) { + return target.copy(background.getClearColor()); + }; + this.setClearColor = function() { + background.setClearColor(...arguments); + }; + this.getClearAlpha = function() { + return background.getClearAlpha(); + }; + this.setClearAlpha = function() { + background.setClearAlpha(...arguments); + }; + this.clear = function(color = true, depth2 = true, stencil2 = true) { + let bits = 0; + if (color) { + let isIntegerFormat = false; + if (_currentRenderTarget !== null) { + const targetFormat = _currentRenderTarget.texture.format; + isIntegerFormat = INTEGER_FORMATS.has(targetFormat); + } + if (isIntegerFormat) { + const targetType = _currentRenderTarget.texture.type; + const isUnsignedType = UNSIGNED_TYPES.has(targetType); + const clearColor = background.getClearColor(); + const a = background.getClearAlpha(); + const r = clearColor.r; + const g = clearColor.g; + const b = clearColor.b; + if (isUnsignedType) { + uintClearColor[0] = r; + uintClearColor[1] = g; + uintClearColor[2] = b; + uintClearColor[3] = a; + _gl.clearBufferuiv(_gl.COLOR, 0, uintClearColor); + } else { + intClearColor[0] = r; + intClearColor[1] = g; + intClearColor[2] = b; + intClearColor[3] = a; + _gl.clearBufferiv(_gl.COLOR, 0, intClearColor); + } + } else { + bits |= _gl.COLOR_BUFFER_BIT; + } + } + if (depth2) { + bits |= _gl.DEPTH_BUFFER_BIT; + } + if (stencil2) { + bits |= _gl.STENCIL_BUFFER_BIT; + this.state.buffers.stencil.setMask(4294967295); + } + _gl.clear(bits); + }; + this.clearColor = function() { + this.clear(true, false, false); + }; + this.clearDepth = function() { + this.clear(false, true, false); + }; + this.clearStencil = function() { + this.clear(false, false, true); + }; + this.dispose = function() { + canvas.removeEventListener("webglcontextlost", onContextLost, false); + canvas.removeEventListener("webglcontextrestored", onContextRestore, false); + canvas.removeEventListener("webglcontextcreationerror", onContextCreationError, false); + background.dispose(); + renderLists.dispose(); + renderStates.dispose(); + properties.dispose(); + cubemaps.dispose(); + cubeuvmaps.dispose(); + objects.dispose(); + bindingStates.dispose(); + uniformsGroups.dispose(); + programCache.dispose(); + xr.dispose(); + xr.removeEventListener("sessionstart", onXRSessionStart); + xr.removeEventListener("sessionend", onXRSessionEnd); + animation.stop(); + }; + function onContextLost(event) { + event.preventDefault(); + log("WebGLRenderer: Context Lost."); + _isContextLost = true; + } + function onContextRestore() { + log("WebGLRenderer: Context Restored."); + _isContextLost = false; + const infoAutoReset = info.autoReset; + const shadowMapEnabled = shadowMap.enabled; + const shadowMapAutoUpdate = shadowMap.autoUpdate; + const shadowMapNeedsUpdate = shadowMap.needsUpdate; + const shadowMapType = shadowMap.type; + initGLContext(); + info.autoReset = infoAutoReset; + shadowMap.enabled = shadowMapEnabled; + shadowMap.autoUpdate = shadowMapAutoUpdate; + shadowMap.needsUpdate = shadowMapNeedsUpdate; + shadowMap.type = shadowMapType; + } + function onContextCreationError(event) { + error("WebGLRenderer: A WebGL context could not be created. Reason: ", event.statusMessage); + } + function onMaterialDispose(event) { + const material = event.target; + material.removeEventListener("dispose", onMaterialDispose); + deallocateMaterial(material); + } + function deallocateMaterial(material) { + releaseMaterialProgramReferences(material); + properties.remove(material); + } + function releaseMaterialProgramReferences(material) { + const programs = properties.get(material).programs; + if (programs !== void 0) { + programs.forEach(function(program) { + programCache.releaseProgram(program); + }); + if (material.isShaderMaterial) { + programCache.releaseShaderCache(material); + } + } + } + this.renderBufferDirect = function(camera, scene, geometry, material, object, group) { + if (scene === null) scene = _emptyScene; + const frontFaceCW = object.isMesh && object.matrixWorld.determinant() < 0; + const program = setProgram(camera, scene, geometry, material, object); + state.setMaterial(material, frontFaceCW); + let index = geometry.index; + let rangeFactor = 1; + if (material.wireframe === true) { + index = geometries.getWireframeAttribute(geometry); + if (index === void 0) return; + rangeFactor = 2; + } + const drawRange = geometry.drawRange; + const position = geometry.attributes.position; + let drawStart = drawRange.start * rangeFactor; + let drawEnd = (drawRange.start + drawRange.count) * rangeFactor; + if (group !== null) { + drawStart = Math.max(drawStart, group.start * rangeFactor); + drawEnd = Math.min(drawEnd, (group.start + group.count) * rangeFactor); + } + if (index !== null) { + drawStart = Math.max(drawStart, 0); + drawEnd = Math.min(drawEnd, index.count); + } else if (position !== void 0 && position !== null) { + drawStart = Math.max(drawStart, 0); + drawEnd = Math.min(drawEnd, position.count); + } + const drawCount = drawEnd - drawStart; + if (drawCount < 0 || drawCount === Infinity) return; + bindingStates.setup(object, material, program, geometry, index); + let attribute; + let renderer = bufferRenderer; + if (index !== null) { + attribute = attributes.get(index); + renderer = indexedBufferRenderer; + renderer.setIndex(attribute); + } + if (object.isMesh) { + if (material.wireframe === true) { + state.setLineWidth(material.wireframeLinewidth * getTargetPixelRatio()); + renderer.setMode(_gl.LINES); + } else { + renderer.setMode(_gl.TRIANGLES); + } + } else if (object.isLine) { + let lineWidth = material.linewidth; + if (lineWidth === void 0) lineWidth = 1; + state.setLineWidth(lineWidth * getTargetPixelRatio()); + if (object.isLineSegments) { + renderer.setMode(_gl.LINES); + } else if (object.isLineLoop) { + renderer.setMode(_gl.LINE_LOOP); + } else { + renderer.setMode(_gl.LINE_STRIP); + } + } else if (object.isPoints) { + renderer.setMode(_gl.POINTS); + } else if (object.isSprite) { + renderer.setMode(_gl.TRIANGLES); + } + if (object.isBatchedMesh) { + if (object._multiDrawInstances !== null) { + warnOnce("WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."); + renderer.renderMultiDrawInstances(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances); + } else { + if (!extensions.get("WEBGL_multi_draw")) { + const starts = object._multiDrawStarts; + const counts = object._multiDrawCounts; + const drawCount2 = object._multiDrawCount; + const bytesPerElement = index ? attributes.get(index).bytesPerElement : 1; + const uniforms = properties.get(material).currentProgram.getUniforms(); + for (let i = 0; i < drawCount2; i++) { + uniforms.setValue(_gl, "_gl_DrawID", i); + renderer.render(starts[i] / bytesPerElement, counts[i]); + } + } else { + renderer.renderMultiDraw(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount); + } + } + } else if (object.isInstancedMesh) { + renderer.renderInstances(drawStart, drawCount, object.count); + } else if (geometry.isInstancedBufferGeometry) { + const maxInstanceCount = geometry._maxInstanceCount !== void 0 ? geometry._maxInstanceCount : Infinity; + const instanceCount = Math.min(geometry.instanceCount, maxInstanceCount); + renderer.renderInstances(drawStart, drawCount, instanceCount); + } else { + renderer.render(drawStart, drawCount); + } + }; + function prepareMaterial(material, scene, object) { + if (material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false) { + material.side = BackSide; + material.needsUpdate = true; + getProgram(material, scene, object); + material.side = FrontSide; + material.needsUpdate = true; + getProgram(material, scene, object); + material.side = DoubleSide; + } else { + getProgram(material, scene, object); + } + } + this.compile = function(scene, camera, targetScene = null) { + if (targetScene === null) targetScene = scene; + currentRenderState = renderStates.get(targetScene); + currentRenderState.init(camera); + renderStateStack.push(currentRenderState); + targetScene.traverseVisible(function(object) { + if (object.isLight && object.layers.test(camera.layers)) { + currentRenderState.pushLight(object); + if (object.castShadow) { + currentRenderState.pushShadow(object); + } + } + }); + if (scene !== targetScene) { + scene.traverseVisible(function(object) { + if (object.isLight && object.layers.test(camera.layers)) { + currentRenderState.pushLight(object); + if (object.castShadow) { + currentRenderState.pushShadow(object); + } + } + }); + } + currentRenderState.setupLights(); + const materials2 = /* @__PURE__ */ new Set(); + scene.traverse(function(object) { + if (!(object.isMesh || object.isPoints || object.isLine || object.isSprite)) { + return; + } + const material = object.material; + if (material) { + if (Array.isArray(material)) { + for (let i = 0; i < material.length; i++) { + const material2 = material[i]; + prepareMaterial(material2, targetScene, object); + materials2.add(material2); + } + } else { + prepareMaterial(material, targetScene, object); + materials2.add(material); + } + } + }); + currentRenderState = renderStateStack.pop(); + return materials2; + }; + this.compileAsync = function(scene, camera, targetScene = null) { + const materials2 = this.compile(scene, camera, targetScene); + return new Promise((resolve) => { + function checkMaterialsReady() { + materials2.forEach(function(material) { + const materialProperties = properties.get(material); + const program = materialProperties.currentProgram; + if (program.isReady()) { + materials2.delete(material); + } + }); + if (materials2.size === 0) { + resolve(scene); + return; + } + setTimeout(checkMaterialsReady, 10); + } + if (extensions.get("KHR_parallel_shader_compile") !== null) { + checkMaterialsReady(); + } else { + setTimeout(checkMaterialsReady, 10); + } + }); + }; + let onAnimationFrameCallback = null; + function onAnimationFrame(time) { + if (onAnimationFrameCallback) onAnimationFrameCallback(time); + } + function onXRSessionStart() { + animation.stop(); + } + function onXRSessionEnd() { + animation.start(); + } + const animation = new WebGLAnimation(); + animation.setAnimationLoop(onAnimationFrame); + if (typeof self !== "undefined") animation.setContext(self); + this.setAnimationLoop = function(callback) { + onAnimationFrameCallback = callback; + xr.setAnimationLoop(callback); + callback === null ? animation.stop() : animation.start(); + }; + xr.addEventListener("sessionstart", onXRSessionStart); + xr.addEventListener("sessionend", onXRSessionEnd); + this.render = function(scene, camera) { + if (camera !== void 0 && camera.isCamera !== true) { + error("WebGLRenderer.render: camera is not an instance of THREE.Camera."); + return; + } + if (_isContextLost === true) return; + const isXRPresenting = xr.enabled === true && xr.isPresenting === true; + const useOutput = output !== null && (_currentRenderTarget === null || isXRPresenting) && output.begin(_this, _currentRenderTarget); + if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld(); + if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld(); + if (xr.enabled === true && xr.isPresenting === true && (output === null || output.isCompositing() === false)) { + if (xr.cameraAutoUpdate === true) xr.updateCamera(camera); + camera = xr.getCamera(); + } + if (scene.isScene === true) scene.onBeforeRender(_this, scene, camera, _currentRenderTarget); + currentRenderState = renderStates.get(scene, renderStateStack.length); + currentRenderState.init(camera); + renderStateStack.push(currentRenderState); + _projScreenMatrix3.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); + _frustum2.setFromProjectionMatrix(_projScreenMatrix3, WebGLCoordinateSystem, camera.reversedDepth); + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = clipping.init(this.clippingPlanes, _localClippingEnabled); + currentRenderList = renderLists.get(scene, renderListStack.length); + currentRenderList.init(); + renderListStack.push(currentRenderList); + if (xr.enabled === true && xr.isPresenting === true) { + const depthSensingMesh = _this.xr.getDepthSensingMesh(); + if (depthSensingMesh !== null) { + projectObject(depthSensingMesh, camera, -Infinity, _this.sortObjects); + } + } + projectObject(scene, camera, 0, _this.sortObjects); + currentRenderList.finish(); + if (_this.sortObjects === true) { + currentRenderList.sort(_opaqueSort, _transparentSort); + } + _renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false; + if (_renderBackground) { + background.addToRenderList(currentRenderList, scene); + } + this.info.render.frame++; + if (_clippingEnabled === true) clipping.beginShadows(); + const shadowsArray = currentRenderState.state.shadowsArray; + shadowMap.render(shadowsArray, scene, camera); + if (_clippingEnabled === true) clipping.endShadows(); + if (this.info.autoReset === true) this.info.reset(); + const skipSceneRender = useOutput && output.hasRenderPass(); + if (skipSceneRender === false) { + const opaqueObjects = currentRenderList.opaque; + const transmissiveObjects = currentRenderList.transmissive; + currentRenderState.setupLights(); + if (camera.isArrayCamera) { + const cameras = camera.cameras; + if (transmissiveObjects.length > 0) { + for (let i = 0, l = cameras.length; i < l; i++) { + const camera2 = cameras[i]; + renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera2); + } + } + if (_renderBackground) background.render(scene); + for (let i = 0, l = cameras.length; i < l; i++) { + const camera2 = cameras[i]; + renderScene(currentRenderList, scene, camera2, camera2.viewport); + } + } else { + if (transmissiveObjects.length > 0) renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera); + if (_renderBackground) background.render(scene); + renderScene(currentRenderList, scene, camera); + } + } + if (_currentRenderTarget !== null && _currentActiveMipmapLevel === 0) { + textures.updateMultisampleRenderTarget(_currentRenderTarget); + textures.updateRenderTargetMipmap(_currentRenderTarget); + } + if (useOutput) { + output.end(_this); + } + if (scene.isScene === true) scene.onAfterRender(_this, scene, camera); + bindingStates.resetDefaultState(); + _currentMaterialId = -1; + _currentCamera = null; + renderStateStack.pop(); + if (renderStateStack.length > 0) { + currentRenderState = renderStateStack[renderStateStack.length - 1]; + if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, currentRenderState.state.camera); + } else { + currentRenderState = null; + } + renderListStack.pop(); + if (renderListStack.length > 0) { + currentRenderList = renderListStack[renderListStack.length - 1]; + } else { + currentRenderList = null; + } + }; + function projectObject(object, camera, groupOrder, sortObjects) { + if (object.visible === false) return; + const visible = object.layers.test(camera.layers); + if (visible) { + if (object.isGroup) { + groupOrder = object.renderOrder; + } else if (object.isLOD) { + if (object.autoUpdate === true) object.update(camera); + } else if (object.isLight) { + currentRenderState.pushLight(object); + if (object.castShadow) { + currentRenderState.pushShadow(object); + } + } else if (object.isSprite) { + if (!object.frustumCulled || _frustum2.intersectsSprite(object)) { + if (sortObjects) { + _vector4.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix3); + } + const geometry = objects.update(object); + const material = object.material; + if (material.visible) { + currentRenderList.push(object, geometry, material, groupOrder, _vector4.z, null); + } + } + } else if (object.isMesh || object.isLine || object.isPoints) { + if (!object.frustumCulled || _frustum2.intersectsObject(object)) { + const geometry = objects.update(object); + const material = object.material; + if (sortObjects) { + if (object.boundingSphere !== void 0) { + if (object.boundingSphere === null) object.computeBoundingSphere(); + _vector4.copy(object.boundingSphere.center); + } else { + if (geometry.boundingSphere === null) geometry.computeBoundingSphere(); + _vector4.copy(geometry.boundingSphere.center); + } + _vector4.applyMatrix4(object.matrixWorld).applyMatrix4(_projScreenMatrix3); + } + if (Array.isArray(material)) { + const groups = geometry.groups; + for (let i = 0, l = groups.length; i < l; i++) { + const group = groups[i]; + const groupMaterial = material[group.materialIndex]; + if (groupMaterial && groupMaterial.visible) { + currentRenderList.push(object, geometry, groupMaterial, groupOrder, _vector4.z, group); + } + } + } else if (material.visible) { + currentRenderList.push(object, geometry, material, groupOrder, _vector4.z, null); + } + } + } + } + const children = object.children; + for (let i = 0, l = children.length; i < l; i++) { + projectObject(children[i], camera, groupOrder, sortObjects); + } + } + function renderScene(currentRenderList2, scene, camera, viewport) { + const { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList2; + currentRenderState.setupLightsView(camera); + if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, camera); + if (viewport) state.viewport(_currentViewport.copy(viewport)); + if (opaqueObjects.length > 0) renderObjects(opaqueObjects, scene, camera); + if (transmissiveObjects.length > 0) renderObjects(transmissiveObjects, scene, camera); + if (transparentObjects.length > 0) renderObjects(transparentObjects, scene, camera); + state.buffers.depth.setTest(true); + state.buffers.depth.setMask(true); + state.buffers.color.setMask(true); + state.setPolygonOffset(false); + } + function renderTransmissionPass(opaqueObjects, transmissiveObjects, scene, camera) { + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + if (overrideMaterial !== null) { + return; + } + if (currentRenderState.state.transmissionRenderTarget[camera.id] === void 0) { + const hasHalfFloatSupport = extensions.has("EXT_color_buffer_half_float") || extensions.has("EXT_color_buffer_float"); + currentRenderState.state.transmissionRenderTarget[camera.id] = new WebGLRenderTarget(1, 1, { + generateMipmaps: true, + type: hasHalfFloatSupport ? HalfFloatType : UnsignedByteType, + minFilter: LinearMipmapLinearFilter, + samples: capabilities.samples, + stencilBuffer: stencil, + resolveDepthBuffer: false, + resolveStencilBuffer: false, + colorSpace: ColorManagement.workingColorSpace + }); + } + const transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[camera.id]; + const activeViewport = camera.viewport || _currentViewport; + transmissionRenderTarget.setSize(activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale); + const currentRenderTarget = _this.getRenderTarget(); + const currentActiveCubeFace = _this.getActiveCubeFace(); + const currentActiveMipmapLevel = _this.getActiveMipmapLevel(); + _this.setRenderTarget(transmissionRenderTarget); + _this.getClearColor(_currentClearColor); + _currentClearAlpha = _this.getClearAlpha(); + if (_currentClearAlpha < 1) _this.setClearColor(16777215, 0.5); + _this.clear(); + if (_renderBackground) background.render(scene); + const currentToneMapping = _this.toneMapping; + _this.toneMapping = NoToneMapping; + const currentCameraViewport = camera.viewport; + if (camera.viewport !== void 0) camera.viewport = void 0; + currentRenderState.setupLightsView(camera); + if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, camera); + renderObjects(opaqueObjects, scene, camera); + textures.updateMultisampleRenderTarget(transmissionRenderTarget); + textures.updateRenderTargetMipmap(transmissionRenderTarget); + if (extensions.has("WEBGL_multisampled_render_to_texture") === false) { + let renderTargetNeedsUpdate = false; + for (let i = 0, l = transmissiveObjects.length; i < l; i++) { + const renderItem = transmissiveObjects[i]; + const { object, geometry, material, group } = renderItem; + if (material.side === DoubleSide && object.layers.test(camera.layers)) { + const currentSide = material.side; + material.side = BackSide; + material.needsUpdate = true; + renderObject(object, scene, camera, geometry, material, group); + material.side = currentSide; + material.needsUpdate = true; + renderTargetNeedsUpdate = true; + } + } + if (renderTargetNeedsUpdate === true) { + textures.updateMultisampleRenderTarget(transmissionRenderTarget); + textures.updateRenderTargetMipmap(transmissionRenderTarget); + } + } + _this.setRenderTarget(currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel); + _this.setClearColor(_currentClearColor, _currentClearAlpha); + if (currentCameraViewport !== void 0) camera.viewport = currentCameraViewport; + _this.toneMapping = currentToneMapping; + } + function renderObjects(renderList, scene, camera) { + const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null; + for (let i = 0, l = renderList.length; i < l; i++) { + const renderItem = renderList[i]; + const { object, geometry, group } = renderItem; + let material = renderItem.material; + if (material.allowOverride === true && overrideMaterial !== null) { + material = overrideMaterial; + } + if (object.layers.test(camera.layers)) { + renderObject(object, scene, camera, geometry, material, group); + } + } + } + function renderObject(object, scene, camera, geometry, material, group) { + object.onBeforeRender(_this, scene, camera, geometry, material, group); + object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld); + object.normalMatrix.getNormalMatrix(object.modelViewMatrix); + material.onBeforeRender(_this, scene, camera, geometry, object, group); + if (material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false) { + material.side = BackSide; + material.needsUpdate = true; + _this.renderBufferDirect(camera, scene, geometry, material, object, group); + material.side = FrontSide; + material.needsUpdate = true; + _this.renderBufferDirect(camera, scene, geometry, material, object, group); + material.side = DoubleSide; + } else { + _this.renderBufferDirect(camera, scene, geometry, material, object, group); + } + object.onAfterRender(_this, scene, camera, geometry, material, group); + } + function getProgram(material, scene, object) { + if (scene.isScene !== true) scene = _emptyScene; + const materialProperties = properties.get(material); + const lights = currentRenderState.state.lights; + const shadowsArray = currentRenderState.state.shadowsArray; + const lightsStateVersion = lights.state.version; + const parameters2 = programCache.getParameters(material, lights.state, shadowsArray, scene, object); + const programCacheKey = programCache.getProgramCacheKey(parameters2); + let programs = materialProperties.programs; + materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null; + materialProperties.fog = scene.fog; + materialProperties.envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || materialProperties.environment); + materialProperties.envMapRotation = materialProperties.environment !== null && material.envMap === null ? scene.environmentRotation : material.envMapRotation; + if (programs === void 0) { + material.addEventListener("dispose", onMaterialDispose); + programs = /* @__PURE__ */ new Map(); + materialProperties.programs = programs; + } + let program = programs.get(programCacheKey); + if (program !== void 0) { + if (materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion) { + updateCommonMaterialProperties(material, parameters2); + return program; + } + } else { + parameters2.uniforms = programCache.getUniforms(material); + material.onBeforeCompile(parameters2, _this); + program = programCache.acquireProgram(parameters2, programCacheKey); + programs.set(programCacheKey, program); + materialProperties.uniforms = parameters2.uniforms; + } + const uniforms = materialProperties.uniforms; + if (!material.isShaderMaterial && !material.isRawShaderMaterial || material.clipping === true) { + uniforms.clippingPlanes = clipping.uniform; + } + updateCommonMaterialProperties(material, parameters2); + materialProperties.needsLights = materialNeedsLights(material); + materialProperties.lightsStateVersion = lightsStateVersion; + if (materialProperties.needsLights) { + uniforms.ambientLightColor.value = lights.state.ambient; + uniforms.lightProbe.value = lights.state.probe; + uniforms.directionalLights.value = lights.state.directional; + uniforms.directionalLightShadows.value = lights.state.directionalShadow; + uniforms.spotLights.value = lights.state.spot; + uniforms.spotLightShadows.value = lights.state.spotShadow; + uniforms.rectAreaLights.value = lights.state.rectArea; + uniforms.ltc_1.value = lights.state.rectAreaLTC1; + uniforms.ltc_2.value = lights.state.rectAreaLTC2; + uniforms.pointLights.value = lights.state.point; + uniforms.pointLightShadows.value = lights.state.pointShadow; + uniforms.hemisphereLights.value = lights.state.hemi; + uniforms.directionalShadowMap.value = lights.state.directionalShadowMap; + uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix; + uniforms.spotShadowMap.value = lights.state.spotShadowMap; + uniforms.spotLightMatrix.value = lights.state.spotLightMatrix; + uniforms.spotLightMap.value = lights.state.spotLightMap; + uniforms.pointShadowMap.value = lights.state.pointShadowMap; + uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix; + } + materialProperties.currentProgram = program; + materialProperties.uniformsList = null; + return program; + } + function getUniformList(materialProperties) { + if (materialProperties.uniformsList === null) { + const progUniforms = materialProperties.currentProgram.getUniforms(); + materialProperties.uniformsList = WebGLUniforms.seqWithValue(progUniforms.seq, materialProperties.uniforms); + } + return materialProperties.uniformsList; + } + function updateCommonMaterialProperties(material, parameters2) { + const materialProperties = properties.get(material); + materialProperties.outputColorSpace = parameters2.outputColorSpace; + materialProperties.batching = parameters2.batching; + materialProperties.batchingColor = parameters2.batchingColor; + materialProperties.instancing = parameters2.instancing; + materialProperties.instancingColor = parameters2.instancingColor; + materialProperties.instancingMorph = parameters2.instancingMorph; + materialProperties.skinning = parameters2.skinning; + materialProperties.morphTargets = parameters2.morphTargets; + materialProperties.morphNormals = parameters2.morphNormals; + materialProperties.morphColors = parameters2.morphColors; + materialProperties.morphTargetsCount = parameters2.morphTargetsCount; + materialProperties.numClippingPlanes = parameters2.numClippingPlanes; + materialProperties.numIntersection = parameters2.numClipIntersection; + materialProperties.vertexAlphas = parameters2.vertexAlphas; + materialProperties.vertexTangents = parameters2.vertexTangents; + materialProperties.toneMapping = parameters2.toneMapping; + } + function setProgram(camera, scene, geometry, material, object) { + if (scene.isScene !== true) scene = _emptyScene; + textures.resetTextureUnits(); + const fog = scene.fog; + const environment = material.isMeshStandardMaterial ? scene.environment : null; + const colorSpace = _currentRenderTarget === null ? _this.outputColorSpace : _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace; + const envMap = (material.isMeshStandardMaterial ? cubeuvmaps : cubemaps).get(material.envMap || environment); + const vertexAlphas = material.vertexColors === true && !!geometry.attributes.color && geometry.attributes.color.itemSize === 4; + const vertexTangents = !!geometry.attributes.tangent && (!!material.normalMap || material.anisotropy > 0); + const morphTargets = !!geometry.morphAttributes.position; + const morphNormals = !!geometry.morphAttributes.normal; + const morphColors = !!geometry.morphAttributes.color; + let toneMapping = NoToneMapping; + if (material.toneMapped) { + if (_currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true) { + toneMapping = _this.toneMapping; + } + } + const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color; + const morphTargetsCount = morphAttribute !== void 0 ? morphAttribute.length : 0; + const materialProperties = properties.get(material); + const lights = currentRenderState.state.lights; + if (_clippingEnabled === true) { + if (_localClippingEnabled === true || camera !== _currentCamera) { + const useCache = camera === _currentCamera && material.id === _currentMaterialId; + clipping.setState(material, camera, useCache); + } + } + let needsProgramChange = false; + if (material.version === materialProperties.__version) { + if (materialProperties.needsLights && materialProperties.lightsStateVersion !== lights.state.version) { + needsProgramChange = true; + } else if (materialProperties.outputColorSpace !== colorSpace) { + needsProgramChange = true; + } else if (object.isBatchedMesh && materialProperties.batching === false) { + needsProgramChange = true; + } else if (!object.isBatchedMesh && materialProperties.batching === true) { + needsProgramChange = true; + } else if (object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null) { + needsProgramChange = true; + } else if (object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancing === false) { + needsProgramChange = true; + } else if (!object.isInstancedMesh && materialProperties.instancing === true) { + needsProgramChange = true; + } else if (object.isSkinnedMesh && materialProperties.skinning === false) { + needsProgramChange = true; + } else if (!object.isSkinnedMesh && materialProperties.skinning === true) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null) { + needsProgramChange = true; + } else if (object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null) { + needsProgramChange = true; + } else if (materialProperties.envMap !== envMap) { + needsProgramChange = true; + } else if (material.fog === true && materialProperties.fog !== fog) { + needsProgramChange = true; + } else if (materialProperties.numClippingPlanes !== void 0 && (materialProperties.numClippingPlanes !== clipping.numPlanes || materialProperties.numIntersection !== clipping.numIntersection)) { + needsProgramChange = true; + } else if (materialProperties.vertexAlphas !== vertexAlphas) { + needsProgramChange = true; + } else if (materialProperties.vertexTangents !== vertexTangents) { + needsProgramChange = true; + } else if (materialProperties.morphTargets !== morphTargets) { + needsProgramChange = true; + } else if (materialProperties.morphNormals !== morphNormals) { + needsProgramChange = true; + } else if (materialProperties.morphColors !== morphColors) { + needsProgramChange = true; + } else if (materialProperties.toneMapping !== toneMapping) { + needsProgramChange = true; + } else if (materialProperties.morphTargetsCount !== morphTargetsCount) { + needsProgramChange = true; + } + } else { + needsProgramChange = true; + materialProperties.__version = material.version; + } + let program = materialProperties.currentProgram; + if (needsProgramChange === true) { + program = getProgram(material, scene, object); + } + let refreshProgram = false; + let refreshMaterial = false; + let refreshLights = false; + const p_uniforms = program.getUniforms(), m_uniforms = materialProperties.uniforms; + if (state.useProgram(program.program)) { + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + } + if (material.id !== _currentMaterialId) { + _currentMaterialId = material.id; + refreshMaterial = true; + } + if (refreshProgram || _currentCamera !== camera) { + const reversedDepthBuffer2 = state.buffers.depth.getReversed(); + if (reversedDepthBuffer2 && camera.reversedDepth !== true) { + camera._reversedDepth = true; + camera.updateProjectionMatrix(); + } + p_uniforms.setValue(_gl, "projectionMatrix", camera.projectionMatrix); + p_uniforms.setValue(_gl, "viewMatrix", camera.matrixWorldInverse); + const uCamPos = p_uniforms.map.cameraPosition; + if (uCamPos !== void 0) { + uCamPos.setValue(_gl, _vector32.setFromMatrixPosition(camera.matrixWorld)); + } + if (capabilities.logarithmicDepthBuffer) { + p_uniforms.setValue( + _gl, + "logDepthBufFC", + 2 / (Math.log(camera.far + 1) / Math.LN2) + ); + } + if (material.isMeshPhongMaterial || material.isMeshToonMaterial || material.isMeshLambertMaterial || material.isMeshBasicMaterial || material.isMeshStandardMaterial || material.isShaderMaterial) { + p_uniforms.setValue(_gl, "isOrthographic", camera.isOrthographicCamera === true); + } + if (_currentCamera !== camera) { + _currentCamera = camera; + refreshMaterial = true; + refreshLights = true; + } + } + if (materialProperties.needsLights) { + if (lights.state.directionalShadowMap.length > 0) { + p_uniforms.setValue(_gl, "directionalShadowMap", lights.state.directionalShadowMap, textures); + } + if (lights.state.spotShadowMap.length > 0) { + p_uniforms.setValue(_gl, "spotShadowMap", lights.state.spotShadowMap, textures); + } + if (lights.state.pointShadowMap.length > 0) { + p_uniforms.setValue(_gl, "pointShadowMap", lights.state.pointShadowMap, textures); + } + } + if (object.isSkinnedMesh) { + p_uniforms.setOptional(_gl, object, "bindMatrix"); + p_uniforms.setOptional(_gl, object, "bindMatrixInverse"); + const skeleton = object.skeleton; + if (skeleton) { + if (skeleton.boneTexture === null) skeleton.computeBoneTexture(); + p_uniforms.setValue(_gl, "boneTexture", skeleton.boneTexture, textures); + } + } + if (object.isBatchedMesh) { + p_uniforms.setOptional(_gl, object, "batchingTexture"); + p_uniforms.setValue(_gl, "batchingTexture", object._matricesTexture, textures); + p_uniforms.setOptional(_gl, object, "batchingIdTexture"); + p_uniforms.setValue(_gl, "batchingIdTexture", object._indirectTexture, textures); + p_uniforms.setOptional(_gl, object, "batchingColorTexture"); + if (object._colorsTexture !== null) { + p_uniforms.setValue(_gl, "batchingColorTexture", object._colorsTexture, textures); + } + } + const morphAttributes = geometry.morphAttributes; + if (morphAttributes.position !== void 0 || morphAttributes.normal !== void 0 || morphAttributes.color !== void 0) { + morphtargets.update(object, geometry, program); + } + if (refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow) { + materialProperties.receiveShadow = object.receiveShadow; + p_uniforms.setValue(_gl, "receiveShadow", object.receiveShadow); + } + if (material.isMeshGouraudMaterial && material.envMap !== null) { + m_uniforms.envMap.value = envMap; + m_uniforms.flipEnvMap.value = envMap.isCubeTexture && envMap.isRenderTargetTexture === false ? -1 : 1; + } + if (material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null) { + m_uniforms.envMapIntensity.value = scene.environmentIntensity; + } + if (m_uniforms.dfgLUT !== void 0) { + m_uniforms.dfgLUT.value = getDFGLUT(); + } + if (refreshMaterial) { + p_uniforms.setValue(_gl, "toneMappingExposure", _this.toneMappingExposure); + if (materialProperties.needsLights) { + markUniformsLightsNeedsUpdate(m_uniforms, refreshLights); + } + if (fog && material.fog === true) { + materials.refreshFogUniforms(m_uniforms, fog); + } + materials.refreshMaterialUniforms(m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[camera.id]); + WebGLUniforms.upload(_gl, getUniformList(materialProperties), m_uniforms, textures); + } + if (material.isShaderMaterial && material.uniformsNeedUpdate === true) { + WebGLUniforms.upload(_gl, getUniformList(materialProperties), m_uniforms, textures); + material.uniformsNeedUpdate = false; + } + if (material.isSpriteMaterial) { + p_uniforms.setValue(_gl, "center", object.center); + } + p_uniforms.setValue(_gl, "modelViewMatrix", object.modelViewMatrix); + p_uniforms.setValue(_gl, "normalMatrix", object.normalMatrix); + p_uniforms.setValue(_gl, "modelMatrix", object.matrixWorld); + if (material.isShaderMaterial || material.isRawShaderMaterial) { + const groups = material.uniformsGroups; + for (let i = 0, l = groups.length; i < l; i++) { + const group = groups[i]; + uniformsGroups.update(group, program); + uniformsGroups.bind(group, program); + } + } + return program; + } + function markUniformsLightsNeedsUpdate(uniforms, value) { + uniforms.ambientLightColor.needsUpdate = value; + uniforms.lightProbe.needsUpdate = value; + uniforms.directionalLights.needsUpdate = value; + uniforms.directionalLightShadows.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.pointLightShadows.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.spotLightShadows.needsUpdate = value; + uniforms.rectAreaLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + } + function materialNeedsLights(material) { + return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.isShadowMaterial || material.isShaderMaterial && material.lights === true; + } + this.getActiveCubeFace = function() { + return _currentActiveCubeFace; + }; + this.getActiveMipmapLevel = function() { + return _currentActiveMipmapLevel; + }; + this.getRenderTarget = function() { + return _currentRenderTarget; + }; + this.setRenderTargetTextures = function(renderTarget, colorTexture, depthTexture) { + const renderTargetProperties = properties.get(renderTarget); + renderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false; + if (renderTargetProperties.__autoAllocateDepthBuffer === false) { + renderTargetProperties.__useRenderToTexture = false; + } + properties.get(renderTarget.texture).__webglTexture = colorTexture; + properties.get(renderTarget.depthTexture).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? void 0 : depthTexture; + renderTargetProperties.__hasExternalTextures = true; + }; + this.setRenderTargetFramebuffer = function(renderTarget, defaultFramebuffer) { + const renderTargetProperties = properties.get(renderTarget); + renderTargetProperties.__webglFramebuffer = defaultFramebuffer; + renderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === void 0; + }; + const _scratchFrameBuffer = _gl.createFramebuffer(); + this.setRenderTarget = function(renderTarget, activeCubeFace = 0, activeMipmapLevel = 0) { + _currentRenderTarget = renderTarget; + _currentActiveCubeFace = activeCubeFace; + _currentActiveMipmapLevel = activeMipmapLevel; + let framebuffer = null; + let isCube = false; + let isRenderTarget3D = false; + if (renderTarget) { + const renderTargetProperties = properties.get(renderTarget); + if (renderTargetProperties.__useDefaultFramebuffer !== void 0) { + state.bindFramebuffer(_gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer); + _currentViewport.copy(renderTarget.viewport); + _currentScissor.copy(renderTarget.scissor); + _currentScissorTest = renderTarget.scissorTest; + state.viewport(_currentViewport); + state.scissor(_currentScissor); + state.setScissorTest(_currentScissorTest); + _currentMaterialId = -1; + return; + } else if (renderTargetProperties.__webglFramebuffer === void 0) { + textures.setupRenderTarget(renderTarget); + } else if (renderTargetProperties.__hasExternalTextures) { + textures.rebindTextures(renderTarget, properties.get(renderTarget.texture).__webglTexture, properties.get(renderTarget.depthTexture).__webglTexture); + } else if (renderTarget.depthBuffer) { + const depthTexture = renderTarget.depthTexture; + if (renderTargetProperties.__boundDepthTexture !== depthTexture) { + if (depthTexture !== null && properties.has(depthTexture) && (renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height)) { + throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size."); + } + textures.setupDepthRenderbuffer(renderTarget); + } + } + const texture = renderTarget.texture; + if (texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture) { + isRenderTarget3D = true; + } + const __webglFramebuffer = properties.get(renderTarget).__webglFramebuffer; + if (renderTarget.isWebGLCubeRenderTarget) { + if (Array.isArray(__webglFramebuffer[activeCubeFace])) { + framebuffer = __webglFramebuffer[activeCubeFace][activeMipmapLevel]; + } else { + framebuffer = __webglFramebuffer[activeCubeFace]; + } + isCube = true; + } else if (renderTarget.samples > 0 && textures.useMultisampledRTT(renderTarget) === false) { + framebuffer = properties.get(renderTarget).__webglMultisampledFramebuffer; + } else { + if (Array.isArray(__webglFramebuffer)) { + framebuffer = __webglFramebuffer[activeMipmapLevel]; + } else { + framebuffer = __webglFramebuffer; + } + } + _currentViewport.copy(renderTarget.viewport); + _currentScissor.copy(renderTarget.scissor); + _currentScissorTest = renderTarget.scissorTest; + } else { + _currentViewport.copy(_viewport).multiplyScalar(_pixelRatio).floor(); + _currentScissor.copy(_scissor).multiplyScalar(_pixelRatio).floor(); + _currentScissorTest = _scissorTest; + } + if (activeMipmapLevel !== 0) { + framebuffer = _scratchFrameBuffer; + } + const framebufferBound = state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + if (framebufferBound) { + state.drawBuffers(renderTarget, framebuffer); + } + state.viewport(_currentViewport); + state.scissor(_currentScissor); + state.setScissorTest(_currentScissorTest); + if (isCube) { + const textureProperties = properties.get(renderTarget.texture); + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel); + } else if (isRenderTarget3D) { + const layer = activeCubeFace; + for (let i = 0; i < renderTarget.textures.length; i++) { + const textureProperties = properties.get(renderTarget.textures[i]); + _gl.framebufferTextureLayer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer); + } + } else if (renderTarget !== null && activeMipmapLevel !== 0) { + const textureProperties = properties.get(renderTarget.texture); + _gl.framebufferTexture2D(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel); + } + _currentMaterialId = -1; + }; + this.readRenderTargetPixels = function(renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0) { + if (!(renderTarget && renderTarget.isWebGLRenderTarget)) { + error("WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget."); + return; + } + let framebuffer = properties.get(renderTarget).__webglFramebuffer; + if (renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== void 0) { + framebuffer = framebuffer[activeCubeFaceIndex]; + } + if (framebuffer) { + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + try { + const texture = renderTarget.textures[textureIndex]; + const textureFormat = texture.format; + const textureType = texture.type; + if (!capabilities.textureFormatReadable(textureFormat)) { + error("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."); + return; + } + if (!capabilities.textureTypeReadable(textureType)) { + error("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type."); + return; + } + if (x >= 0 && x <= renderTarget.width - width && (y >= 0 && y <= renderTarget.height - height)) { + if (renderTarget.textures.length > 1) _gl.readBuffer(_gl.COLOR_ATTACHMENT0 + textureIndex); + _gl.readPixels(x, y, width, height, utils.convert(textureFormat), utils.convert(textureType), buffer); + } + } finally { + const framebuffer2 = _currentRenderTarget !== null ? properties.get(_currentRenderTarget).__webglFramebuffer : null; + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer2); + } + } + }; + this.readRenderTargetPixelsAsync = async function(renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0) { + if (!(renderTarget && renderTarget.isWebGLRenderTarget)) { + throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget."); + } + let framebuffer = properties.get(renderTarget).__webglFramebuffer; + if (renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== void 0) { + framebuffer = framebuffer[activeCubeFaceIndex]; + } + if (framebuffer) { + if (x >= 0 && x <= renderTarget.width - width && (y >= 0 && y <= renderTarget.height - height)) { + state.bindFramebuffer(_gl.FRAMEBUFFER, framebuffer); + const texture = renderTarget.textures[textureIndex]; + const textureFormat = texture.format; + const textureType = texture.type; + if (!capabilities.textureFormatReadable(textureFormat)) { + throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format."); + } + if (!capabilities.textureTypeReadable(textureType)) { + throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type."); + } + const glBuffer = _gl.createBuffer(); + _gl.bindBuffer(_gl.PIXEL_PACK_BUFFER, glBuffer); + _gl.bufferData(_gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ); + if (renderTarget.textures.length > 1) _gl.readBuffer(_gl.COLOR_ATTACHMENT0 + textureIndex); + _gl.readPixels(x, y, width, height, utils.convert(textureFormat), utils.convert(textureType), 0); + const currFramebuffer = _currentRenderTarget !== null ? properties.get(_currentRenderTarget).__webglFramebuffer : null; + state.bindFramebuffer(_gl.FRAMEBUFFER, currFramebuffer); + const sync = _gl.fenceSync(_gl.SYNC_GPU_COMMANDS_COMPLETE, 0); + _gl.flush(); + await probeAsync(_gl, sync, 4); + _gl.bindBuffer(_gl.PIXEL_PACK_BUFFER, glBuffer); + _gl.getBufferSubData(_gl.PIXEL_PACK_BUFFER, 0, buffer); + _gl.deleteBuffer(glBuffer); + _gl.deleteSync(sync); + return buffer; + } else { + throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range."); + } + } + }; + this.copyFramebufferToTexture = function(texture, position = null, level = 0) { + const levelScale = Math.pow(2, -level); + const width = Math.floor(texture.image.width * levelScale); + const height = Math.floor(texture.image.height * levelScale); + const x = position !== null ? position.x : 0; + const y = position !== null ? position.y : 0; + textures.setTexture2D(texture, 0); + _gl.copyTexSubImage2D(_gl.TEXTURE_2D, level, 0, 0, x, y, width, height); + state.unbindTexture(); + }; + const _srcFramebuffer = _gl.createFramebuffer(); + const _dstFramebuffer = _gl.createFramebuffer(); + this.copyTextureToTexture = function(srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null) { + if (dstLevel === null) { + if (srcLevel !== 0) { + warnOnce("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."); + dstLevel = srcLevel; + srcLevel = 0; + } else { + dstLevel = 0; + } + } + let width, height, depth2, minX, minY, minZ; + let dstX, dstY, dstZ; + const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[dstLevel] : srcTexture.image; + if (srcRegion !== null) { + width = srcRegion.max.x - srcRegion.min.x; + height = srcRegion.max.y - srcRegion.min.y; + depth2 = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1; + minX = srcRegion.min.x; + minY = srcRegion.min.y; + minZ = srcRegion.isBox3 ? srcRegion.min.z : 0; + } else { + const levelScale = Math.pow(2, -srcLevel); + width = Math.floor(image.width * levelScale); + height = Math.floor(image.height * levelScale); + if (srcTexture.isDataArrayTexture) { + depth2 = image.depth; + } else if (srcTexture.isData3DTexture) { + depth2 = Math.floor(image.depth * levelScale); + } else { + depth2 = 1; + } + minX = 0; + minY = 0; + minZ = 0; + } + if (dstPosition !== null) { + dstX = dstPosition.x; + dstY = dstPosition.y; + dstZ = dstPosition.z; + } else { + dstX = 0; + dstY = 0; + dstZ = 0; + } + const glFormat = utils.convert(dstTexture.format); + const glType = utils.convert(dstTexture.type); + let glTarget; + if (dstTexture.isData3DTexture) { + textures.setTexture3D(dstTexture, 0); + glTarget = _gl.TEXTURE_3D; + } else if (dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture) { + textures.setTexture2DArray(dstTexture, 0); + glTarget = _gl.TEXTURE_2D_ARRAY; + } else { + textures.setTexture2D(dstTexture, 0); + glTarget = _gl.TEXTURE_2D; + } + _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY); + _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha); + _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment); + const currentUnpackRowLen = _gl.getParameter(_gl.UNPACK_ROW_LENGTH); + const currentUnpackImageHeight = _gl.getParameter(_gl.UNPACK_IMAGE_HEIGHT); + const currentUnpackSkipPixels = _gl.getParameter(_gl.UNPACK_SKIP_PIXELS); + const currentUnpackSkipRows = _gl.getParameter(_gl.UNPACK_SKIP_ROWS); + const currentUnpackSkipImages = _gl.getParameter(_gl.UNPACK_SKIP_IMAGES); + _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, image.width); + _gl.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, image.height); + _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, minX); + _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, minY); + _gl.pixelStorei(_gl.UNPACK_SKIP_IMAGES, minZ); + const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture; + const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture; + if (srcTexture.isDepthTexture) { + const srcTextureProperties = properties.get(srcTexture); + const dstTextureProperties = properties.get(dstTexture); + const srcRenderTargetProperties = properties.get(srcTextureProperties.__renderTarget); + const dstRenderTargetProperties = properties.get(dstTextureProperties.__renderTarget); + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer); + for (let i = 0; i < depth2; i++) { + if (isSrc3D) { + _gl.framebufferTextureLayer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get(srcTexture).__webglTexture, srcLevel, minZ + i); + _gl.framebufferTextureLayer(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get(dstTexture).__webglTexture, dstLevel, dstZ + i); + } + _gl.blitFramebuffer(minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST); + } + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); + } else if (srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has(srcTexture)) { + const srcTextureProperties = properties.get(srcTexture); + const dstTextureProperties = properties.get(dstTexture); + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, _srcFramebuffer); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, _dstFramebuffer); + for (let i = 0; i < depth2; i++) { + if (isSrc3D) { + _gl.framebufferTextureLayer(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i); + } else { + _gl.framebufferTexture2D(_gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel); + } + if (isDst3D) { + _gl.framebufferTextureLayer(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i); + } else { + _gl.framebufferTexture2D(_gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel); + } + if (srcLevel !== 0) { + _gl.blitFramebuffer(minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST); + } else if (isDst3D) { + _gl.copyTexSubImage3D(glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height); + } else { + _gl.copyTexSubImage2D(glTarget, dstLevel, dstX, dstY, minX, minY, width, height); + } + } + state.bindFramebuffer(_gl.READ_FRAMEBUFFER, null); + state.bindFramebuffer(_gl.DRAW_FRAMEBUFFER, null); + } else { + if (isDst3D) { + if (srcTexture.isDataTexture || srcTexture.isData3DTexture) { + _gl.texSubImage3D(glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth2, glFormat, glType, image.data); + } else if (dstTexture.isCompressedArrayTexture) { + _gl.compressedTexSubImage3D(glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth2, glFormat, image.data); + } else { + _gl.texSubImage3D(glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth2, glFormat, glType, image); + } + } else { + if (srcTexture.isDataTexture) { + _gl.texSubImage2D(_gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data); + } else if (srcTexture.isCompressedTexture) { + _gl.compressedTexSubImage2D(_gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data); + } else { + _gl.texSubImage2D(_gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image); + } + } + } + _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, currentUnpackRowLen); + _gl.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight); + _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels); + _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows); + _gl.pixelStorei(_gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages); + if (dstLevel === 0 && dstTexture.generateMipmaps) { + _gl.generateMipmap(glTarget); + } + state.unbindTexture(); + }; + this.initRenderTarget = function(target) { + if (properties.get(target).__webglFramebuffer === void 0) { + textures.setupRenderTarget(target); + } + }; + this.initTexture = function(texture) { + if (texture.isCubeTexture) { + textures.setTextureCube(texture, 0); + } else if (texture.isData3DTexture) { + textures.setTexture3D(texture, 0); + } else if (texture.isDataArrayTexture || texture.isCompressedArrayTexture) { + textures.setTexture2DArray(texture, 0); + } else { + textures.setTexture2D(texture, 0); + } + state.unbindTexture(); + }; + this.resetState = function() { + _currentActiveCubeFace = 0; + _currentActiveMipmapLevel = 0; + _currentRenderTarget = null; + state.reset(); + bindingStates.reset(); + }; + if (typeof __THREE_DEVTOOLS__ !== "undefined") { + __THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe", { detail: this })); + } + } + /** + * Defines the coordinate system of the renderer. + * + * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`. + * + * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem} + * @default WebGLCoordinateSystem + * @readonly + */ + get coordinateSystem() { + return WebGLCoordinateSystem; + } + /** + * Defines the output color space of the renderer. + * + * @type {SRGBColorSpace|LinearSRGBColorSpace} + * @default SRGBColorSpace + */ + get outputColorSpace() { + return this._outputColorSpace; + } + set outputColorSpace(colorSpace) { + this._outputColorSpace = colorSpace; + const gl = this.getContext(); + gl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace(colorSpace); + gl.unpackColorSpace = ColorManagement._getUnpackColorSpace(); + } +}; + +export { + REVISION, + MOUSE, + TOUCH, + CullFaceNone, + CullFaceBack, + CullFaceFront, + CullFaceFrontBack, + BasicShadowMap, + PCFShadowMap, + PCFSoftShadowMap, + VSMShadowMap, + FrontSide, + BackSide, + DoubleSide, + NoBlending, + NormalBlending, + AdditiveBlending, + SubtractiveBlending, + MultiplyBlending, + CustomBlending, + AddEquation, + SubtractEquation, + ReverseSubtractEquation, + MinEquation, + MaxEquation, + ZeroFactor, + OneFactor, + SrcColorFactor, + OneMinusSrcColorFactor, + SrcAlphaFactor, + OneMinusSrcAlphaFactor, + DstAlphaFactor, + OneMinusDstAlphaFactor, + DstColorFactor, + OneMinusDstColorFactor, + SrcAlphaSaturateFactor, + ConstantColorFactor, + OneMinusConstantColorFactor, + ConstantAlphaFactor, + OneMinusConstantAlphaFactor, + NeverDepth, + AlwaysDepth, + LessDepth, + LessEqualDepth, + EqualDepth, + GreaterEqualDepth, + GreaterDepth, + NotEqualDepth, + MultiplyOperation, + MixOperation, + AddOperation, + NoToneMapping, + LinearToneMapping, + ReinhardToneMapping, + CineonToneMapping, + ACESFilmicToneMapping, + CustomToneMapping, + AgXToneMapping, + NeutralToneMapping, + AttachedBindMode, + DetachedBindMode, + UVMapping, + CubeReflectionMapping, + CubeRefractionMapping, + EquirectangularReflectionMapping, + EquirectangularRefractionMapping, + CubeUVReflectionMapping, + RepeatWrapping, + ClampToEdgeWrapping, + MirroredRepeatWrapping, + NearestFilter, + NearestMipmapNearestFilter, + NearestMipMapNearestFilter, + NearestMipmapLinearFilter, + NearestMipMapLinearFilter, + LinearFilter, + LinearMipmapNearestFilter, + LinearMipMapNearestFilter, + LinearMipmapLinearFilter, + LinearMipMapLinearFilter, + UnsignedByteType, + ByteType, + ShortType, + UnsignedShortType, + IntType, + UnsignedIntType, + FloatType, + HalfFloatType, + UnsignedShort4444Type, + UnsignedShort5551Type, + UnsignedInt248Type, + UnsignedInt5999Type, + UnsignedInt101111Type, + AlphaFormat, + RGBFormat, + RGBAFormat, + DepthFormat, + DepthStencilFormat, + RedFormat, + RedIntegerFormat, + RGFormat, + RGIntegerFormat, + RGBIntegerFormat, + RGBAIntegerFormat, + RGB_S3TC_DXT1_Format, + RGBA_S3TC_DXT1_Format, + RGBA_S3TC_DXT3_Format, + RGBA_S3TC_DXT5_Format, + RGB_PVRTC_4BPPV1_Format, + RGB_PVRTC_2BPPV1_Format, + RGBA_PVRTC_4BPPV1_Format, + RGBA_PVRTC_2BPPV1_Format, + RGB_ETC1_Format, + RGB_ETC2_Format, + RGBA_ETC2_EAC_Format, + R11_EAC_Format, + SIGNED_R11_EAC_Format, + RG11_EAC_Format, + SIGNED_RG11_EAC_Format, + RGBA_ASTC_4x4_Format, + RGBA_ASTC_5x4_Format, + RGBA_ASTC_5x5_Format, + RGBA_ASTC_6x5_Format, + RGBA_ASTC_6x6_Format, + RGBA_ASTC_8x5_Format, + RGBA_ASTC_8x6_Format, + RGBA_ASTC_8x8_Format, + RGBA_ASTC_10x5_Format, + RGBA_ASTC_10x6_Format, + RGBA_ASTC_10x8_Format, + RGBA_ASTC_10x10_Format, + RGBA_ASTC_12x10_Format, + RGBA_ASTC_12x12_Format, + RGBA_BPTC_Format, + RGB_BPTC_SIGNED_Format, + RGB_BPTC_UNSIGNED_Format, + RED_RGTC1_Format, + SIGNED_RED_RGTC1_Format, + RED_GREEN_RGTC2_Format, + SIGNED_RED_GREEN_RGTC2_Format, + LoopOnce, + LoopRepeat, + LoopPingPong, + InterpolateDiscrete, + InterpolateLinear, + InterpolateSmooth, + ZeroCurvatureEnding, + ZeroSlopeEnding, + WrapAroundEnding, + NormalAnimationBlendMode, + AdditiveAnimationBlendMode, + TrianglesDrawMode, + TriangleStripDrawMode, + TriangleFanDrawMode, + BasicDepthPacking, + RGBADepthPacking, + RGBDepthPacking, + RGDepthPacking, + TangentSpaceNormalMap, + ObjectSpaceNormalMap, + NoColorSpace, + SRGBColorSpace, + LinearSRGBColorSpace, + LinearTransfer, + SRGBTransfer, + NoNormalPacking, + NormalRGPacking, + NormalGAPacking, + ZeroStencilOp, + KeepStencilOp, + ReplaceStencilOp, + IncrementStencilOp, + DecrementStencilOp, + IncrementWrapStencilOp, + DecrementWrapStencilOp, + InvertStencilOp, + NeverStencilFunc, + LessStencilFunc, + EqualStencilFunc, + LessEqualStencilFunc, + GreaterStencilFunc, + NotEqualStencilFunc, + GreaterEqualStencilFunc, + AlwaysStencilFunc, + NeverCompare, + LessCompare, + EqualCompare, + LessEqualCompare, + GreaterCompare, + NotEqualCompare, + GreaterEqualCompare, + AlwaysCompare, + StaticDrawUsage, + DynamicDrawUsage, + StreamDrawUsage, + StaticReadUsage, + DynamicReadUsage, + StreamReadUsage, + StaticCopyUsage, + DynamicCopyUsage, + StreamCopyUsage, + GLSL1, + GLSL3, + WebGLCoordinateSystem, + WebGPUCoordinateSystem, + TimestampQuery, + InterpolationSamplingType, + InterpolationSamplingMode, + createCanvasElement, + setConsoleFunction, + getConsoleFunction, + log, + warn, + error, + warnOnce, + EventDispatcher, + MathUtils, + Vector2, + Quaternion, + Vector3, + Matrix3, + ColorManagement, + ImageUtils, + Source, + Texture, + Vector4, + RenderTarget, + WebGLRenderTarget, + DataArrayTexture, + WebGLArrayRenderTarget, + Data3DTexture, + WebGL3DRenderTarget, + Box3, + Sphere, + Ray, + Matrix4, + Euler, + Layers, + Object3D, + Triangle, + Color, + Material, + MeshBasicMaterial, + DataUtils, + BufferAttribute, + Int8BufferAttribute, + Uint8BufferAttribute, + Uint8ClampedBufferAttribute, + Int16BufferAttribute, + Uint16BufferAttribute, + Int32BufferAttribute, + Uint32BufferAttribute, + Float16BufferAttribute, + Float32BufferAttribute, + BufferGeometry, + Mesh, + BoxGeometry, + UniformsUtils, + ShaderMaterial, + Camera, + PerspectiveCamera, + CubeCamera, + CubeTexture, + WebGLCubeRenderTarget, + Group, + WebXRController, + FogExp2, + Fog, + Scene, + InterleavedBuffer, + InterleavedBufferAttribute, + SpriteMaterial, + Sprite, + LOD, + SkinnedMesh, + Bone, + DataTexture, + Skeleton, + InstancedBufferAttribute, + InstancedMesh, + Plane, + Frustum, + FrustumArray, + BatchedMesh, + LineBasicMaterial, + Line, + LineSegments, + LineLoop, + PointsMaterial, + Points, + VideoTexture, + VideoFrameTexture, + FramebufferTexture, + CompressedTexture, + CompressedArrayTexture, + CompressedCubeTexture, + CanvasTexture, + DepthTexture, + CubeDepthTexture, + ExternalTexture, + CapsuleGeometry, + CircleGeometry, + CylinderGeometry, + ConeGeometry, + PolyhedronGeometry, + DodecahedronGeometry, + EdgesGeometry, + Curve, + EllipseCurve, + ArcCurve, + CatmullRomCurve3, + CubicBezierCurve, + CubicBezierCurve3, + LineCurve, + LineCurve3, + QuadraticBezierCurve, + QuadraticBezierCurve3, + SplineCurve, + CurvePath, + Path, + Shape, + ShapeUtils, + ExtrudeGeometry, + IcosahedronGeometry, + LatheGeometry, + OctahedronGeometry, + PlaneGeometry, + RingGeometry, + ShapeGeometry, + SphereGeometry, + TetrahedronGeometry, + TorusGeometry, + TorusKnotGeometry, + TubeGeometry, + WireframeGeometry, + ShadowMaterial, + RawShaderMaterial, + MeshStandardMaterial, + MeshPhysicalMaterial, + MeshPhongMaterial, + MeshToonMaterial, + MeshNormalMaterial, + MeshLambertMaterial, + MeshDepthMaterial, + MeshDistanceMaterial, + MeshMatcapMaterial, + LineDashedMaterial, + AnimationUtils, + Interpolant, + CubicInterpolant, + LinearInterpolant, + DiscreteInterpolant, + KeyframeTrack, + BooleanKeyframeTrack, + ColorKeyframeTrack, + NumberKeyframeTrack, + QuaternionLinearInterpolant, + QuaternionKeyframeTrack, + StringKeyframeTrack, + VectorKeyframeTrack, + AnimationClip, + Cache, + LoadingManager, + DefaultLoadingManager, + Loader, + FileLoader, + AnimationLoader, + CompressedTextureLoader, + ImageLoader, + CubeTextureLoader, + DataTextureLoader, + TextureLoader, + Light, + HemisphereLight, + SpotLight, + PointLight, + OrthographicCamera, + DirectionalLight, + AmbientLight, + RectAreaLight, + SphericalHarmonics3, + LightProbe, + MaterialLoader, + LoaderUtils, + InstancedBufferGeometry, + BufferGeometryLoader, + ObjectLoader, + ImageBitmapLoader, + AudioContext, + AudioLoader, + StereoCamera, + ArrayCamera, + Clock, + AudioListener, + Audio, + PositionalAudio, + AudioAnalyser, + PropertyMixer, + PropertyBinding, + AnimationObjectGroup, + AnimationAction, + AnimationMixer, + RenderTarget3D, + Uniform, + UniformsGroup, + InstancedInterleavedBuffer, + GLBufferAttribute, + Raycaster, + Timer, + Spherical, + Cylindrical, + Matrix2, + Box2, + Line3, + SpotLightHelper, + SkeletonHelper, + PointLightHelper, + HemisphereLightHelper, + GridHelper, + PolarGridHelper, + DirectionalLightHelper, + CameraHelper, + BoxHelper, + Box3Helper, + PlaneHelper, + ArrowHelper, + AxesHelper, + ShapePath, + Controls, + TextureUtils, + ShaderChunk, + UniformsLib, + ShaderLib, + PMREMGenerator, + WebGLUtils, + WebGLRenderer +}; +//# sourceMappingURL=chunk-XSTVJSXX.js.map diff --git a/node_modules/.vite/deps/chunk-XSTVJSXX.js.map b/node_modules/.vite/deps/chunk-XSTVJSXX.js.map new file mode 100644 index 0000000..5142dff --- /dev/null +++ b/node_modules/.vite/deps/chunk-XSTVJSXX.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../three/build/three.core.js", "../../three/build/three.module.js"], + "sourcesContent": ["/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '182';\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsMouse}\n * @constant\n */\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\n\n/**\n * Represents touch interaction types in context of controls.\n *\n * @type {ConstantsTouch}\n * @constant\n */\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\n\n/**\n * Disables face culling.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceNone = 0;\n\n/**\n * Culls back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceBack = 1;\n\n/**\n * Culls front faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFront = 2;\n\n/**\n * Culls both front and back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFrontBack = 3;\n\n/**\n * Gives unfiltered shadow maps - fastest, but lowest quality.\n *\n * @type {number}\n * @constant\n */\nconst BasicShadowMap = 0;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm.\n *\n * @type {number}\n * @constant\n */\nconst PCFShadowMap = 1;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm with\n * better soft shadows especially when using low-resolution shadow maps.\n *\n * @type {number}\n * @constant\n */\nconst PCFSoftShadowMap = 2;\n\n/**\n * Filters shadow maps using the Variance Shadow Map (VSM) algorithm.\n * When using VSMShadowMap all shadow receivers will also cast shadows.\n *\n * @type {number}\n * @constant\n */\nconst VSMShadowMap = 3;\n\n/**\n * Only front faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst FrontSide = 0;\n\n/**\n * Only back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst BackSide = 1;\n\n/**\n * Both front and back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst DoubleSide = 2;\n\n/**\n * No blending is performed which effectively disables\n * alpha transparency.\n *\n * @type {number}\n * @constant\n */\nconst NoBlending = 0;\n\n/**\n * The default blending.\n *\n * @type {number}\n * @constant\n */\nconst NormalBlending = 1;\n\n/**\n * Represents additive blending.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveBlending = 2;\n\n/**\n * Represents subtractive blending.\n *\n * @type {number}\n * @constant\n */\nconst SubtractiveBlending = 3;\n\n/**\n * Represents multiply blending.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyBlending = 4;\n\n/**\n * Represents custom blending.\n *\n * @type {number}\n * @constant\n */\nconst CustomBlending = 5;\n\n/**\n * A `source + destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst AddEquation = 100;\n\n/**\n * A `source - destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst SubtractEquation = 101;\n\n/**\n * A `destination - source` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst ReverseSubtractEquation = 102;\n\n/**\n * A blend equation that uses the minimum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MinEquation = 103;\n\n/**\n * A blend equation that uses the maximum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MaxEquation = 104;\n\n/**\n * Multiplies all colors by `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroFactor = 200;\n\n/**\n * Multiplies all colors by `1`.\n *\n * @type {number}\n * @constant\n */\nconst OneFactor = 201;\n\n/**\n * Multiplies all colors by the source colors.\n *\n * @type {number}\n * @constant\n */\nconst SrcColorFactor = 202;\n\n/**\n * Multiplies all colors by `1` minus each source color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcColorFactor = 203;\n\n/**\n * Multiplies all colors by the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaFactor = 204;\n\n/**\n * Multiplies all colors by 1 minus the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcAlphaFactor = 205;\n\n/**\n * Multiplies all colors by the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst DstAlphaFactor = 206;\n\n/**\n * Multiplies all colors by `1` minus the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstAlphaFactor = 207;\n\n/**\n * Multiplies all colors by the destination color.\n *\n * @type {number}\n * @constant\n */\nconst DstColorFactor = 208;\n\n/**\n * Multiplies all colors by `1` minus each destination color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstColorFactor = 209;\n\n/**\n * Multiplies the RGB colors by the smaller of either the source alpha\n * value or the value of `1` minus the destination alpha value. The alpha\n * value is multiplied by `1`.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaSaturateFactor = 210;\n\n/**\n * Multiplies all colors by a constant color.\n *\n * @type {number}\n * @constant\n */\nconst ConstantColorFactor = 211;\n\n/**\n * Multiplies all colors by `1` minus a constant color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantColorFactor = 212;\n\n/**\n * Multiplies all colors by a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst ConstantAlphaFactor = 213;\n\n/**\n * Multiplies all colors by 1 minus a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantAlphaFactor = 214;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverDepth = 0;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysDepth = 1;\n\n/**\n * Pass if the incoming value is less than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessDepth = 2;\n\n/**\n * Pass if the incoming value is less than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualDepth = 3;\n\n/**\n * Pass if the incoming value equals the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst EqualDepth = 4;\n\n/**\n * Pass if the incoming value is greater than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualDepth = 5;\n\n/**\n * Pass if the incoming value is greater than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterDepth = 6;\n\n/**\n * Pass if the incoming value is not equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualDepth = 7;\n\n/**\n * Multiplies the environment map color with the surface color.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyOperation = 0;\n\n/**\n * Uses reflectivity to blend between the two colors.\n *\n * @type {number}\n * @constant\n */\nconst MixOperation = 1;\n\n/**\n * Adds the two colors.\n *\n * @type {number}\n * @constant\n */\nconst AddOperation = 2;\n\n/**\n * No tone mapping is applied.\n *\n * @type {number}\n * @constant\n */\nconst NoToneMapping = 0;\n\n/**\n * Linear tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearToneMapping = 1;\n\n/**\n * Reinhard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ReinhardToneMapping = 2;\n\n/**\n * Cineon tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst CineonToneMapping = 3;\n\n/**\n * ACES Filmic tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ACESFilmicToneMapping = 4;\n\n/**\n * Custom tone mapping.\n *\n * Expects a custom implementation by modifying shader code of the material's fragment shader.\n *\n * @type {number}\n * @constant\n */\nconst CustomToneMapping = 5;\n\n/**\n * AgX tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst AgXToneMapping = 6;\n\n/**\n * Neutral tone mapping.\n *\n * Implementation based on the Khronos 3D Commerce Group standard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst NeutralToneMapping = 7;\n\n/**\n * The skinned mesh shares the same world space as the skeleton.\n *\n * @type {string}\n * @constant\n */\nconst AttachedBindMode = 'attached';\n\n/**\n * The skinned mesh does not share the same world space as the skeleton.\n * This is useful when a skeleton is shared across multiple skinned meshes.\n *\n * @type {string}\n * @constant\n */\nconst DetachedBindMode = 'detached';\n\n/**\n * Maps textures using the geometry's UV coordinates.\n *\n * @type {number}\n * @constant\n */\nconst UVMapping = 300;\n\n/**\n * Reflection mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeReflectionMapping = 301;\n\n/**\n * Refraction mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeRefractionMapping = 302;\n\n/**\n * Reflection mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularReflectionMapping = 303;\n\n/**\n * Refraction mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularRefractionMapping = 304;\n\n/**\n * Reflection mapping for PMREM textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeUVReflectionMapping = 306;\n\n/**\n * The texture will simply repeat to infinity.\n *\n * @type {number}\n * @constant\n */\nconst RepeatWrapping = 1000;\n\n/**\n * The last pixel of the texture stretches to the edge of the mesh.\n *\n * @type {number}\n * @constant\n */\nconst ClampToEdgeWrapping = 1001;\n\n/**\n * The texture will repeats to infinity, mirroring on each repeat.\n *\n * @type {number}\n * @constant\n */\nconst MirroredRepeatWrapping = 1002;\n\n/**\n * Returns the value of the texture element that is nearest (in Manhattan distance)\n * to the specified texture coordinates.\n *\n * @type {number}\n * @constant\n */\nconst NearestFilter = 1003;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured\n * and uses the `NearestFilter` criterion (the texel nearest to the center of the pixel)\n * to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and\n * uses the `NearestFilter` criterion to produce a texture value from each mipmap.\n * The final texture value is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005; // legacy\n\n/**\n * Returns the weighted average of the four texture elements that are closest to the specified\n * texture coordinates, and can include items wrapped or repeated from other parts of a texture,\n * depending on the values of `wrapS` and `wrapT`, and on the exact mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearFilter = 1006;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured and uses\n * the `LinearFilter` criterion (a weighted average of the four texels that are closest to the\n * center of the pixel) to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and uses\n * the `LinearFilter` criterion to produce a texture value from each mipmap. The final texture value\n * is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008; // legacy\n\n/**\n * An unsigned byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedByteType = 1009;\n\n/**\n * A byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ByteType = 1010;\n\n/**\n * A short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ShortType = 1011;\n\n/**\n * An unsigned short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShortType = 1012;\n\n/**\n * An int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst IntType = 1013;\n\n/**\n * An unsigned int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedIntType = 1014;\n\n/**\n * A float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst FloatType = 1015;\n\n/**\n * A half float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst HalfFloatType = 1016;\n\n/**\n * An unsigned short 4_4_4_4 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort4444Type = 1017;\n\n/**\n * An unsigned short 5_5_5_1 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort5551Type = 1018;\n\n/**\n * An unsigned int 24_8 data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt248Type = 1020;\n\n/**\n * An unsigned int 5_9_9_9 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt5999Type = 35902;\n\n/**\n * An unsigned int 10_11_11 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt101111Type = 35899;\n\n/**\n * Discards the red, green and blue components and reads just the alpha component.\n *\n * @type {number}\n * @constant\n */\nconst AlphaFormat = 1021;\n\n/**\n * Discards the alpha component and reads the red, green and blue component.\n *\n * @type {number}\n * @constant\n */\nconst RGBFormat = 1022;\n\n/**\n * Reads the red, green, blue and alpha components.\n *\n * @type {number}\n * @constant\n */\nconst RGBAFormat = 1023;\n\n/**\n * Reads each element as a single depth value, converts it to floating point, and clamps to the range `[0,1]`.\n *\n * @type {number}\n * @constant\n */\nconst DepthFormat = 1026;\n\n/**\n * Reads each element is a pair of depth and stencil values. The depth component of the pair is interpreted as\n * in `DepthFormat`. The stencil component is interpreted based on the depth + stencil internal format.\n *\n * @type {number}\n * @constant\n */\nconst DepthStencilFormat = 1027;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component.\n *\n * @type {number}\n * @constant\n */\nconst RedFormat = 1028;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RedIntegerFormat = 1029;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components.\n *\n * @type {number}\n * @constant\n */\nconst RGFormat = 1030;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGIntegerFormat = 1031;\n\n/**\n * Discards the alpha component and reads the red, green and blue component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBIntegerFormat = 1032;\n\n/**\n * Reads the red, green, blue and alpha components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBAIntegerFormat = 1033;\n\n/**\n * A DXT1-compressed image in an RGB image format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_S3TC_DXT1_Format = 33776;\n\n/**\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT1_Format = 33777;\n\n/**\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT3_Format = 33778;\n\n/**\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3\n * compression in how the alpha compression is done.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT5_Format = 33779;\n\n/**\n * PVRTC RGB compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_4BPPV1_Format = 35840;\n\n/**\n * PVRTC RGB compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_2BPPV1_Format = 35841;\n\n/**\n * PVRTC RGBA compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\n\n/**\n * PVRTC RGBA compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\n\n/**\n * ETC1 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC1_Format = 36196;\n\n/**\n * ETC2 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC2_Format = 37492;\n\n/**\n * ETC2 RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ETC2_EAC_Format = 37496;\n\n/**\n * EAC R11 UNORM format.\n *\n * @type {number}\n * @constant\n */\nconst R11_EAC_Format = 37488; // 0x9270\n\n/**\n * EAC R11 SNORM format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_R11_EAC_Format = 37489; // 0x9271\n\n/**\n * EAC RG11 UNORM format.\n *\n * @type {number}\n * @constant\n */\nconst RG11_EAC_Format = 37490; // 0x9272\n\n/**\n * EAC RG11 SNORM format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RG11_EAC_Format = 37491; // 0x9273\n\n/**\n * ASTC RGBA 4x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_4x4_Format = 37808;\n\n/**\n * ASTC RGBA 5x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x4_Format = 37809;\n\n/**\n * ASTC RGBA 5x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x5_Format = 37810;\n\n/**\n * ASTC RGBA 6x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x5_Format = 37811;\n\n/**\n * ASTC RGBA 6x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x6_Format = 37812;\n\n/**\n * ASTC RGBA 8x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x5_Format = 37813;\n\n/**\n * ASTC RGBA 8x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x6_Format = 37814;\n\n/**\n * ASTC RGBA 8x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x8_Format = 37815;\n\n/**\n * ASTC RGBA 10x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x5_Format = 37816;\n\n/**\n * ASTC RGBA 10x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x6_Format = 37817;\n\n/**\n * ASTC RGBA 10x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x8_Format = 37818;\n\n/**\n * ASTC RGBA 10x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x10_Format = 37819;\n\n/**\n * ASTC RGBA 12x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x10_Format = 37820;\n\n/**\n * ASTC RGBA 12x12 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x12_Format = 37821;\n\n/**\n * BPTC RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_BPTC_Format = 36492;\n\n/**\n * BPTC Signed RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_SIGNED_Format = 36494;\n\n/**\n * BPTC Unsigned RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_UNSIGNED_Format = 36495;\n\n/**\n * RGTC1 Red format.\n *\n * @type {number}\n * @constant\n */\nconst RED_RGTC1_Format = 36283;\n\n/**\n * RGTC1 Signed Red format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_RGTC1_Format = 36284;\n\n/**\n * RGTC2 Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst RED_GREEN_RGTC2_Format = 36285;\n\n/**\n * RGTC2 Signed Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\n\n/**\n * Animations are played once.\n *\n * @type {number}\n * @constant\n */\nconst LoopOnce = 2200;\n\n/**\n * Animations are played with a chosen number of repetitions, each time jumping from\n * the end of the clip directly to its beginning.\n *\n * @type {number}\n * @constant\n */\nconst LoopRepeat = 2201;\n\n/**\n * Animations are played with a chosen number of repetitions, alternately playing forward\n * and backward.\n *\n * @type {number}\n * @constant\n */\nconst LoopPingPong = 2202;\n\n/**\n * Discrete interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateDiscrete = 2300;\n\n/**\n * Linear interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateLinear = 2301;\n\n/**\n * Smooth interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateSmooth = 2302;\n\n/**\n * Zero curvature ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroCurvatureEnding = 2400;\n\n/**\n * Zero slope ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroSlopeEnding = 2401;\n\n/**\n * Wrap around ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst WrapAroundEnding = 2402;\n\n/**\n * Default animation blend mode.\n *\n * @type {number}\n * @constant\n */\nconst NormalAnimationBlendMode = 2500;\n\n/**\n * Additive animation blend mode. Can be used to layer motions on top of\n * each other to build complex performances from smaller re-usable assets.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveAnimationBlendMode = 2501;\n\n/**\n * For every three vertices draw a single triangle.\n *\n * @type {number}\n * @constant\n */\nconst TrianglesDrawMode = 0;\n\n/**\n * For each vertex draw a triangle from the last three vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleStripDrawMode = 1;\n\n/**\n * For each vertex draw a triangle from the first vertex and the last two vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleFanDrawMode = 2;\n\n/**\n * The depth value is inverted (1.0 - z) for visualization purposes.\n *\n * @type {number}\n * @constant\n */\nconst BasicDepthPacking = 3200;\n\n/**\n * The depth value is packed into 32 bit RGBA.\n *\n * @type {number}\n * @constant\n */\nconst RGBADepthPacking = 3201;\n\n/**\n * The depth value is packed into 24 bit RGB.\n *\n * @type {number}\n * @constant\n */\nconst RGBDepthPacking = 3202;\n\n/**\n * The depth value is packed into 16 bit RG.\n *\n * @type {number}\n * @constant\n */\nconst RGDepthPacking = 3203;\n\n/**\n * Normal information is relative to the underlying surface.\n *\n * @type {number}\n * @constant\n */\nconst TangentSpaceNormalMap = 0;\n\n/**\n * Normal information is relative to the object orientation.\n *\n * @type {number}\n * @constant\n */\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\n\n/**\n * No color space.\n *\n * @type {string}\n * @constant\n */\nconst NoColorSpace = '';\n\n/**\n * sRGB color space.\n *\n * @type {string}\n * @constant\n */\nconst SRGBColorSpace = 'srgb';\n\n/**\n * sRGB-linear color space.\n *\n * @type {string}\n * @constant\n */\nconst LinearSRGBColorSpace = 'srgb-linear';\n\n/**\n * Linear transfer function.\n *\n * @type {string}\n * @constant\n */\nconst LinearTransfer = 'linear';\n\n/**\n * sRGB transfer function.\n *\n * @type {string}\n * @constant\n */\nconst SRGBTransfer = 'srgb';\n\n/**\n * No normal map packing.\n *\n * @type {string}\n * @constant\n */\nconst NoNormalPacking = '';\n\n/**\n * Normal RG packing.\n *\n * @type {string}\n * @constant\n */\nconst NormalRGPacking = 'rg';\n\n/**\n * Normal GA packing.\n *\n * @type {string}\n * @constant\n */\nconst NormalGAPacking = 'ga';\n\n/**\n * Sets the stencil buffer value to `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroStencilOp = 0;\n\n/**\n * Keeps the current value.\n *\n * @type {number}\n * @constant\n */\nconst KeepStencilOp = 7680;\n\n/**\n * Sets the stencil buffer value to the specified reference value.\n *\n * @type {number}\n * @constant\n */\nconst ReplaceStencilOp = 7681;\n\n/**\n * Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementStencilOp = 7682;\n\n/**\n * Decrements the current stencil buffer value. Clamps to `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementStencilOp = 7683;\n\n/**\n * Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing\n * the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementWrapStencilOp = 34055;\n\n/**\n * Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable\n * unsigned value when decrementing a stencil buffer value of `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementWrapStencilOp = 34056;\n\n/**\n * Inverts the current stencil buffer value bitwise.\n *\n * @type {number}\n * @constant\n */\nconst InvertStencilOp = 5386;\n\n/**\n * Will never return true.\n *\n * @type {number}\n * @constant\n */\nconst NeverStencilFunc = 512;\n\n/**\n * Will return true if the stencil reference value is less than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessStencilFunc = 513;\n\n/**\n * Will return true if the stencil reference value is equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst EqualStencilFunc = 514;\n\n/**\n * Will return true if the stencil reference value is less than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualStencilFunc = 515;\n\n/**\n * Will return true if the stencil reference value is greater than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterStencilFunc = 516;\n\n/**\n * Will return true if the stencil reference value is not equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualStencilFunc = 517;\n\n/**\n * Will return true if the stencil reference value is greater than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualStencilFunc = 518;\n\n/**\n * Will always return true.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysStencilFunc = 519;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverCompare = 512;\n\n/**\n * Pass if the incoming value is less than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessCompare = 513;\n\n/**\n * Pass if the incoming value equals the texture value.\n *\n * @type {number}\n * @constant\n */\nconst EqualCompare = 514;\n\n/**\n * Pass if the incoming value is less than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualCompare = 515;\n\n/**\n * Pass if the incoming value is greater than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterCompare = 516;\n\n/**\n * Pass if the incoming value is not equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualCompare = 517;\n\n/**\n * Pass if the incoming value is greater than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualCompare = 518;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysCompare = 519;\n\n/**\n * The contents are intended to be specified once by the application, and used many\n * times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticDrawUsage = 35044;\n\n/**\n * The contents are intended to be respecified repeatedly by the application, and\n * used many times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicDrawUsage = 35048;\n\n/**\n * The contents are intended to be specified once by the application, and used at most\n * a few times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamDrawUsage = 35040;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst StaticReadUsage = 35045;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst DynamicReadUsage = 35049;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried at most\n * a few times by the application\n *\n * @type {number}\n * @constant\n */\nconst StreamReadUsage = 35041;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used many times as\n * the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticCopyUsage = 35046;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and used many times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicCopyUsage = 35050;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used at most a few times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamCopyUsage = 35042;\n\n/**\n * GLSL 1 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL1 = '100';\n\n/**\n * GLSL 3 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL3 = '300 es';\n\n/**\n * WebGL coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGLCoordinateSystem = 2000;\n\n/**\n * WebGPU coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * Represents the different timestamp query types.\n *\n * @type {ConstantsTimestampQuery}\n * @constant\n */\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsInterpolationSamplingType}\n * @constant\n */\nconst InterpolationSamplingType = {\n\tPERSPECTIVE: 'perspective',\n\tLINEAR: 'linear',\n\tFLAT: 'flat'\n};\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @type {ConstantsInterpolationSamplingMode}\n * @constant\n */\nconst InterpolationSamplingMode = {\n\tNORMAL: 'normal',\n\tCENTROID: 'centroid',\n\tSAMPLE: 'sample',\n\tFIRST: 'first',\n\tEITHER: 'either'\n};\n\n/**\n * This type represents mouse buttons and interaction types in context of controls.\n *\n * @typedef {Object} ConstantsMouse\n * @property {number} MIDDLE - The left mouse button.\n * @property {number} LEFT - The middle mouse button.\n * @property {number} RIGHT - The right mouse button.\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} DOLLY - A dolly interaction.\n * @property {number} PAN - A pan interaction.\n **/\n\n/**\n * This type represents touch interaction types in context of controls.\n *\n * @typedef {Object} ConstantsTouch\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} PAN - A pan interaction.\n * @property {number} DOLLY_PAN - The dolly-pan interaction.\n * @property {number} DOLLY_ROTATE - A dolly-rotate interaction.\n **/\n\n/**\n * This type represents the different timestamp query types.\n *\n * @typedef {Object} ConstantsTimestampQuery\n * @property {string} COMPUTE - A `compute` timestamp query.\n * @property {string} RENDER - A `render` timestamp query.\n **/\n\n/**\n * Represents the different interpolation sampling types.\n *\n * @typedef {Object} ConstantsInterpolationSamplingType\n * @property {string} PERSPECTIVE - Perspective-correct interpolation.\n * @property {string} LINEAR - Linear interpolation.\n * @property {string} FLAT - Flat interpolation.\n */\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @typedef {Object} ConstantsInterpolationSamplingMode\n * @property {string} NORMAL - Normal sampling mode.\n * @property {string} CENTROID - Centroid sampling mode.\n * @property {string} SAMPLE - Sample-specific sampling mode.\n * @property {string} FIRST - Flat interpolation using the first vertex.\n * @property {string} EITHER - Flat interpolation using either vertex.\n */\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\n/**\n * Returns `true` if the given object is a typed array.\n *\n * @param {any} array - The object to check.\n * @return {boolean} Whether the given object is a typed array.\n */\nfunction isTypedArray( array ) {\n\n\treturn ArrayBuffer.isView( array ) && ! ( array instanceof DataView );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nlet _setConsoleFunction = null;\n\nfunction setConsoleFunction( fn ) {\n\n\t_setConsoleFunction = fn;\n\n}\n\nfunction getConsoleFunction() {\n\n\treturn _setConsoleFunction;\n\n}\n\nfunction log( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'log', message, ...params );\n\n\t} else {\n\n\t\tconsole.log( message, ...params );\n\n\t}\n\n}\n\nfunction warn( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'warn', message, ...params );\n\n\t} else {\n\n\t\tconsole.warn( message, ...params );\n\n\t}\n\n}\n\nfunction error( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'error', message, ...params );\n\n\t} else {\n\n\t\tconsole.error( message, ...params );\n\n\t}\n\n}\n\nfunction warnOnce( ...params ) {\n\n\tconst message = params.join( ' ' );\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\twarn( ...params );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js](https://github.com/mrdoob/eventdispatcher.js/)\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `` to range ``\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A collection of math utility functions.\n * @hideconstructor\n */\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\t/**\n\t * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n\t * (universally unique identifier).\n\t *\n\t * @static\n\t * @method\n\t * @return {string} The UUID.\n\t */\n\tgenerateUUID: generateUUID,\n\t/**\n\t * Clamps the given value between min and max.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to clamp.\n\t * @param {number} min - The min value.\n\t * @param {number} max - The max value.\n\t * @return {number} The clamped value.\n\t */\n\tclamp: clamp,\n\t/**\n\t * Computes the Euclidean modulo of the given parameters that\n\t * is `( ( n % m ) + m ) % m`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} n - The first parameter.\n\t * @param {number} m - The second parameter.\n\t * @return {number} The Euclidean modulo.\n\t */\n\teuclideanModulo: euclideanModulo,\n\t/**\n\t * Performs a linear mapping from range `` to range ``\n\t * for the given value.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @return {number} The mapped value.\n\t */\n\tmapLinear: mapLinear,\n\t/**\n\t * Returns the percentage in the closed interval `[0, 1]` of the given value\n\t * between the start and end point.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} value - A value between start and end.\n\t * @return {number} The interpolation factor.\n\t */\n\tinverseLerp: inverseLerp,\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval -\n\t * `t = 0` will return `x` and `t = 1` will return `y`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {number} The interpolated value.\n\t */\n\tlerp: lerp,\n\t/**\n\t * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n\t * time to maintain frame rate independent movement. For details, see\n\t * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The current point.\n\t * @param {number} y - The target point.\n\t * @param {number} lambda - A higher lambda value will make the movement more sudden,\n\t * and a lower value will make the movement more gradual.\n\t * @param {number} dt - Delta time in seconds.\n\t * @return {number} The interpolated value.\n\t */\n\tdamp: damp,\n\t/**\n\t * Returns a value that alternates between `0` and the given `length` parameter.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to pingpong.\n\t * @param {number} [length=1] - The positive value the function will pingpong to.\n\t * @return {number} The alternated value.\n\t */\n\tpingpong: pingpong,\n\t/**\n\t * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n\t * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n\t * the `min` and `max`.\n\t *\n\t * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmoothstep: smoothstep,\n\t/**\n\t * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n\t * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmootherstep: smootherstep,\n\t/**\n\t * Returns a random integer from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random integer.\n\t */\n\trandInt: randInt,\n\t/**\n\t * Returns a random float from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random float.\n\t */\n\trandFloat: randFloat,\n\t/**\n\t * Returns a random integer from `<-range/2, range/2>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} range - Defines the value range.\n\t * @return {number} A random float.\n\t */\n\trandFloatSpread: randFloatSpread,\n\t/**\n\t * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} [s] - The integer seed.\n\t * @return {number} A random float.\n\t */\n\tseededRandom: seededRandom,\n\t/**\n\t * Converts degrees to radians.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} degrees - A value in degrees.\n\t * @return {number} The converted value in radians.\n\t */\n\tdegToRad: degToRad,\n\t/**\n\t * Converts radians to degrees.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} radians - A value in radians.\n\t * @return {number} The converted value in degrees.\n\t */\n\tradToDeg: radToDeg,\n\t/**\n\t * Returns `true` if the given number is a power of two.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to check.\n\t * @return {boolean} Whether the given number is a power of two or not.\n\t */\n\tisPowerOfTwo: isPowerOfTwo,\n\t/**\n\t * Returns the smallest power of two that is greater than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The smallest power of two that is greater than or equal to the given number.\n\t */\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\t/**\n\t * Returns the largest power of two that is less than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The largest power of two that is less than or equal to the given number.\n\t */\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\t/**\n\t * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n\t * defined by the given angles and order.\n\t *\n\t * Rotations are applied to the axes in the order specified by order:\n\t * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n\t *\n\t * @static\n\t * @method\n\t * @param {Quaternion} q - The quaternion to set.\n\t * @param {number} a - The rotation applied to the first axis, in radians.\n\t * @param {number} b - The rotation applied to the second axis, in radians.\n\t * @param {number} c - The rotation applied to the third axis, in radians.\n\t * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n\t */\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\t/**\n\t * Normalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The float value in the range `[0,1]` to normalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The normalize value.\n\t */\n\tnormalize: normalize,\n\t/**\n\t * Denormalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to denormalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The denormalize (float) value in the range `[0,1]`.\n\t */\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tlet x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t <= 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t >= 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif ( dot < 0 ) {\n\n\t\t\t\tx1 = - x1;\n\t\t\t\ty1 = - y1;\n\t\t\t\tz1 = - z1;\n\t\t\t\tw1 = - w1;\n\n\t\t\t\tdot = - dot;\n\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif ( dot < 0.9995 ) {\n\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos( dot );\n\t\t\t\tconst sin = Math.sin( theta );\n\n\t\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t} else {\n\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twarn( 'Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < 1e-8 ) { // the epsilon value has been discussed in #31286\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t <= 0 ) return this;\n\n\t\tif ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot( qb );\n\n\t\tif ( dot < 0 ) {\n\n\t\t\tx = - x;\n\t\t\ty = - y;\n\t\t\tz = - z;\n\t\t\tw = - w;\n\n\t\t\tdot = - dot;\n\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif ( dot < 0.9995 ) {\n\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos( dot );\n\t\t\tconst sin = Math.sin( theta );\n\n\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis._onChangeCallback();\n\n\t\t} else {\n\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n * 21, 22, 23,\n * 31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n * 12, 22, 32,\n * 13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' }\n\t\t * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tworkingToColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\tcolorSpaceToWorking: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetToneMappingMode: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.toneMappingMode || 'standard';\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t},\n\n\t\t// Deprecated\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.workingToColorSpace( color, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.colorSpaceToWorking( color, sourceColorSpace );\n\n\t\t},\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @param {string} [type='image/png'] - Indicates the image format.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image, type = 'image/png' ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( type );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\n/**\n * Represents the data source of a texture.\n *\n * The main purpose of this class is to decouple the data definition from the texture\n * definition so the same data can be used with multiple texture instances.\n */\nclass Source {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {any} [data=null] - The data definition of a texture.\n\t */\n\tconstructor( data = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSource = true;\n\n\t\t/**\n\t\t * The ID of the source.\n\t\t *\n\t\t * @name Source#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\t/**\n\t\t * The UUID of the source.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The data definition of a texture.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * This property is only relevant when {@link Source#needsUpdate} is set to `true` and\n\t\t * provides more control on how texture data should be processed. When `dataReady` is set\n\t\t * to `false`, the engine performs the memory allocation (if necessary) but does not transfer\n\t\t * the data into the GPU memory.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.dataReady = true;\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Source#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Returns the dimensions of the source into the given target vector.\n\t *\n\t * @param {(Vector2|Vector3)} target - The target object the result is written into.\n\t * @return {(Vector2|Vector3)} The dimensions of the source.\n\t */\n\tgetSize( target ) {\n\n\t\tconst data = this.data;\n\n\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {\n\n\t\t\ttarget.set( data.videoWidth, data.videoHeight, 0 );\n\n\t\t} else if ( ( typeof VideoFrame !== 'undefined' ) && ( data instanceof VideoFrame ) ) {\n\n\t\t\ttarget.set( data.displayHeight, data.displayWidth, 0 );\n\n\t\t} else if ( data !== null ) {\n\n\t\t\ttarget.set( data.width, data.height, data.depth || 0 );\n\n\t\t} else {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * When the property is set to `true`, the engine allocates the memory\n\t * for the texture (if necessary) and triggers the actual texture upload\n\t * to the GPU next time the source is used.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Serializes the source into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized source.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nconst _tempVec3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Texture.DEFAULT_ANISOTROPY\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This can be used to only update a subregion or specific rows of the texture (for example, just the\n\t\t * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates if a texture should be handled like a texture array.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The width of the texture in pixels.\n\t */\n\tget width() {\n\n\t\treturn this.source.getSize( _tempVec3 ).x;\n\n\t}\n\n\t/**\n\t * The height of the texture in pixels.\n\t */\n\tget height() {\n\n\t\treturn this.source.getSize( _tempVec3 ).y;\n\n\t}\n\n\t/**\n\t * The depth of the texture in pixels.\n\t */\n\tget depth() {\n\n\t\treturn this.source.getSize( _tempVec3 ).z;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data texture to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\t\tthis.isArrayTexture = source.isArrayTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this texture's properties based on `values`.\n\t * @param {Object} values - A container with texture parameters.\n\t */\n\tsetValues( values ) {\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): property '${ key }' does not exist.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/**\n * A render target is a buffer where the video card draws pixels for a scene\n * that is being rendered in the background. It is used in different effects,\n * such as applying postprocessing to a rendered image before displaying it\n * on the screen.\n *\n * @augments EventDispatcher\n */\nclass RenderTarget extends EventDispatcher {\n\n\t/**\n\t * Render target options.\n\t *\n\t * @typedef {Object} RenderTarget~Options\n\t * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not.\n\t * @property {number} [magFilter=LinearFilter] - The mag filter.\n\t * @property {number} [minFilter=LinearFilter] - The min filter.\n\t * @property {number} [format=RGBAFormat] - The texture format.\n\t * @property {number} [type=UnsignedByteType] - The texture type.\n\t * @property {?string} [internalFormat=null] - The texture's internal format.\n\t * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [anisotropy=1] - The texture's anisotropy value.\n\t * @property {string} [colorSpace=NoColorSpace] - The texture's color space.\n\t * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not.\n\t * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not.\n\t * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not.\n\t * @property {boolean} [resolveStencilBuffer=true] - Whether to resolve the stencil buffer or not.\n\t * @property {?Texture} [depthTexture=null] - Reference to a depth texture.\n\t * @property {number} [samples=0] - The MSAA samples count.\n\t * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`.\n\t * @property {number} [depth=1] - The texture depth.\n\t * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering.\n\t */\n\n\t/**\n\t * Constructs a new render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1,\n\t\t\tdepth: 1,\n\t\t\tmultiview: false\n\t\t}, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget = true;\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The depth of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depth = options.depth;\n\n\t\t/**\n\t\t * A rectangular area inside the render target's viewport. Fragments that are\n\t\t * outside the area will be discarded.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\n\t\t/**\n\t\t * Indicates whether the scissor test should be enabled when rendering into\n\t\t * this render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissorTest = false;\n\n\t\t/**\n\t\t * A rectangular area representing the render target's viewport.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: options.depth };\n\n\t\tconst texture = new Texture( image );\n\n\t\t/**\n\t\t * An array of textures. Each color attachment is represented as a separate texture.\n\t\t * Has at least a single entry for the default color attachment.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis._setTextureOptions( options );\n\n\t\t/**\n\t\t * Whether to allocate a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthBuffer = options.depthBuffer;\n\n\t\t/**\n\t\t * Whether to allocate a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * A value of `0` disables MSAA.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.samples = options.samples;\n\n\t\t/**\n\t\t * Whether to this target is used in multiview rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.multiview = options.multiview;\n\n\t}\n\n\t_setTextureOptions( options = {} ) {\n\n\t\tconst values = {\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tinternalFormat: null\n\t\t};\n\n\t\tif ( options.mapping !== undefined ) values.mapping = options.mapping;\n\t\tif ( options.wrapS !== undefined ) values.wrapS = options.wrapS;\n\t\tif ( options.wrapT !== undefined ) values.wrapT = options.wrapT;\n\t\tif ( options.wrapR !== undefined ) values.wrapR = options.wrapR;\n\t\tif ( options.magFilter !== undefined ) values.magFilter = options.magFilter;\n\t\tif ( options.minFilter !== undefined ) values.minFilter = options.minFilter;\n\t\tif ( options.format !== undefined ) values.format = options.format;\n\t\tif ( options.type !== undefined ) values.type = options.type;\n\t\tif ( options.anisotropy !== undefined ) values.anisotropy = options.anisotropy;\n\t\tif ( options.colorSpace !== undefined ) values.colorSpace = options.colorSpace;\n\t\tif ( options.flipY !== undefined ) values.flipY = options.flipY;\n\t\tif ( options.generateMipmaps !== undefined ) values.generateMipmaps = options.generateMipmaps;\n\t\tif ( options.internalFormat !== undefined ) values.internalFormat = options.internalFormat;\n\n\t\tfor ( let i = 0; i < this.textures.length; i ++ ) {\n\n\t\t\tconst texture = this.textures[ i ];\n\t\t\ttexture.setValues( values );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture representing the default color attachment.\n\t *\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\t/**\n\t * Instead of saving the depth in a renderbuffer, a texture\n\t * can be used instead which is useful for further processing\n\t * e.g. in context of post-processing.\n\t *\n\t * @type {?DepthTexture}\n\t * @default null\n\t */\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\t/**\n\t * Sets the size of this render target.\n\t *\n\t * @param {number} width - The width.\n\t * @param {number} height - The height.\n\t * @param {number} [depth=1] - The depth.\n\t */\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t\tif ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693\n\n\t\t\t\t\t// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.\n\t\t\t\t\t// Maybe a method `isArrayTexture()` or just a getter could replace a flag since\n\t\t\t\t\t// both are evaluated on each call?\n\n\t\t\t\t\tthis.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * Returns a new render target with copied values from this instance.\n\t *\n\t * @return {RenderTarget} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the settings of the given render target. This is a structural copy so\n\t * no resources are shared between render targets after the copy. That includes\n\t * all MRT textures and the depth texture.\n\t *\n\t * @param {RenderTarget} source - The render target to copy.\n\t * @return {RenderTarget} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\n/**\n * A render target used in context of {@link WebGLRenderer}.\n *\n * @augments RenderTarget\n */\nclass WebGLRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\n/**\n * Creates an array of textures directly from raw buffer data.\n *\n * @augments Texture\n */\nclass DataArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataArrayTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire data texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * An array render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new array render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Creates a three-dimensional texture from raw data, with parameters to\n * divide it into width, height, and depth.\n *\n * @augments Texture\n */\nclass Data3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isData3DTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\n/**\n * A 3D render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tmin: this.min.toArray(),\n\t\t\tmax: this.max.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @param {Object} json - The serialized json to set the box from.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.min.fromArray( json.min );\n\t\tthis.max.fromArray( json.max );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tradius: this.radius,\n\t\t\tcenter: this.center.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @param {Object} json - The serialized json to set the sphere from.\n\t * @return {Sphere} A reference to this bounding sphere.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.radius = json.radius;\n\t\tthis.center.fromArray( json.center );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tif ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial](https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices)\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n * 21, 22, 23, 24,\n * 31, 32, 33, 34,\n * 41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n * 12, 22, 32, 42,\n * 13, 23, 33, 43,\n * 14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\tif ( this.determinant() === 0 ) {\n\n\t\t\txAxis.set( 1, 0, 0 );\n\t\t\tyAxis.set( 0, 1, 0 );\n\t\t\tzAxis.set( 0, 0, 1 );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tif ( m.determinant() === 0 ) {\n\n\t\t\treturn this.identity();\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix)\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion)\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\tconst t11 = n23 * n34 - n24 * n33;\n\t\tconst t12 = n22 * n34 - n24 * n32;\n\t\tconst t13 = n22 * n33 - n23 * n32;\n\n\t\tconst t21 = n21 * n34 - n24 * n31;\n\t\tconst t22 = n21 * n33 - n23 * n31;\n\t\tconst t23 = n21 * n32 - n22 * n31;\n\n\t\treturn n11 * ( n42 * t11 - n43 * t12 + n44 * t13 ) -\n\t\t\tn12 * ( n41 * t11 - n43 * t21 + n44 * t22 ) +\n\t\t\tn13 * ( n41 * t12 - n42 * t21 + n44 * t23 ) -\n\t\t\tn14 * ( n41 * t13 - n42 * t22 + n43 * t23 );\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\tif ( this.determinant() === 0 ) {\n\n\t\t\tscale.set( 1, 1, 1 );\n\t\t\tquaternion.identity();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = near / ( far - near );\n\t\t\td = ( far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = - far / ( far - near );\n\t\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 / ( right - left );\n\t\tconst y = 2 / ( top - bottom );\n\n\t\tconst a = - ( right + left ) / ( right - left );\n\t\tconst b = - ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = 1 / ( far - near );\n\t\t\td = far / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = -2 / ( far - near );\n\t\t\t\td = - ( far + near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = -1 / ( far - near );\n\t\t\t\td = - near / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\t\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = a;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = y;\t\tte[ 9 ] = 0; \t\tte[ 13 ] = b;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = c;\t\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\twarn( 'Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\n/**\n * A layers object assigns an 3D object to 1 or more of 32\n * layers numbered `0` to `31` - internally the layers are stored as a\n * bit mask], and by default all 3D objects are a member of layer `0`.\n *\n * This can be used to control visibility - an object must share a layer with\n * a camera to be visible when that camera's view is\n * rendered.\n *\n * All classes that inherit from {@link Object3D} have an `layers` property which\n * is an instance of this class.\n */\nclass Layers {\n\n\t/**\n\t * Constructs a new layers instance, with membership\n\t * initially set to layer `0`.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A bit mask storing which of the 32 layers this layers object is currently\n\t\t * a member of.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\t/**\n\t * Sets membership to the given layer, and remove membership all other layers.\n\t *\n\t * @param {number} layer - The layer to set.\n\t */\n\tset( layer ) {\n\n\t\tthis.mask = ( 1 << layer | 0 ) >>> 0;\n\n\t}\n\n\t/**\n\t * Adds membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tenable( layer ) {\n\n\t\tthis.mask |= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Adds membership to all layers.\n\t */\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\t/**\n\t * Toggles the membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to toggle.\n\t */\n\ttoggle( layer ) {\n\n\t\tthis.mask ^= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Removes membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tdisable( layer ) {\n\n\t\tthis.mask &= ~ ( 1 << layer | 0 );\n\n\t}\n\n\t/**\n\t * Removes the membership from all layers.\n\t */\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if this and the given layers object have at least one\n\t * layer in common.\n\t *\n\t * @param {Layers} layers - The layers to test.\n\t * @return {boolean } Whether this and the given layers object have at least one layer in common or not.\n\t */\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given layer is enabled.\n\t *\n\t * @param {number} layer - The layer to test.\n\t * @return {boolean } Whether the given layer is enabled or not.\n\t */\n\tisEnabled( layer ) {\n\n\t\treturn ( this.mask & ( 1 << layer | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a child object has been removed.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * Custom depth material to be used when rendering to the depth map. Can only be used\n\t\t * in context of meshes. When shadow-casting with a {@link DirectionalLight} or {@link SpotLight},\n\t\t * if you are modifying vertex positions in the vertex shader you must specify a custom depth\n\t\t * material for proper shadows.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDepthMaterial = undefined;\n\n\t\t/**\n\t\t * Same as {@link Object3D#customDepthMaterial}, but used with {@link PointLight}.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDistanceMaterial = undefined;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\terror( 'Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\terror( 'Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array} result - The method stores the result in this array.\n\t * @return {Array} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default. Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.geometryInfo = this._geometryInfo.map( info => ( {\n\t\t\t\t...info,\n\t\t\t\tboundingBox: info.boundingBox ? info.boundingBox.toJSON() : undefined,\n\t\t\t\tboundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : undefined\n\t\t\t} ) );\n\t\t\tobject.instanceInfo = this._instanceInfo.map( info => ( { ...info } ) );\n\n\t\t\tobject.availableInstanceIds = this._availableInstanceIds.slice();\n\t\t\tobject.availableGeometryIds = this._availableGeometryIds.slice();\n\n\t\t\tobject.nextIndexStart = this._nextIndexStart;\n\t\t\tobject.nextVertexStart = this._nextVertexStart;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tobject.indirectTexture = this._indirectTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\t\tobject.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = this.boundingSphere.toJSON();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = this.boundingBox.toJSON();\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear working\n * color space, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see Color management. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\twarn( 'Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\twarn( 'Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\twarn( 'Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\twarn( 'Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default AddEquation\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {?(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Whether it's possible to override the material with {@link Scene#overrideMaterial} or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.allowOverride = true;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language).\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\t/**\n\t * This method can be used to set default values from parameter objects.\n\t * It is a generic implementation so it can be used with different types\n\t * of materials.\n\t *\n\t * @param {Object} [values] - The material values to set.\n\t */\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.sheenColorMap && this.sheenColorMap.isTexture ) {\n\n\t\t\tdata.sheenColorMap = this.sheenColorMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture ) {\n\n\t\t\tdata.sheenRoughnessMap = this.sheenRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\t\tif ( this.allowOverride === false ) data.allowOverride = false;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\t\tthis.allowOverride = source.allowOverride;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n *\n * This material is not affected by lights.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshBasicMaterial\n */\nclass MeshBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$2 = 0;\n\n/**\n * This class stores data for an attribute (such as vertex positions, face\n * indices, normals, colors, UVs, and any custom attributes ) associated with\n * a geometry, which allows for more efficient passing of data to the GPU.\n *\n * When working with vector-like data, the `fromBufferAttribute( attribute, index )`\n * helper methods on vector and color class might be helpful. E.g. {@link Vector3#fromBufferAttribute}.\n */\nclass BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferAttribute = true;\n\n\t\t/**\n\t\t * The ID of the buffer attribute.\n\t\t *\n\t\t * @name BufferAttribute#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The array holding the attribute data. It should have `itemSize * numVertices`\n\t\t * elements, where `numVertices` is the number of vertices in the associated geometry.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of values of the array that should be associated with a particular vertex.\n\t\t * For instance, if this attribute is storing a 3-component vector (such as a position,\n\t\t * normal, or color), then the value should be `3`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * Represents the number of items this buffer attribute stores. It is internally computed\n\t\t * by dividing the `array` length by the `itemSize`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `array` is an instance of `UInt16Array`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the array data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * Configures the bound GPU type for use in shaders.\n\t\t *\n\t\t * Note: this only has an effect for integer arrays and is not configurable for float arrays.\n\t\t * For lower precision float types, use `Float16BufferAttribute`.\n\t\t *\n\t\t * @type {(FloatType|IntType)}\n\t\t * @default FloatType\n\t\t */\n\t\tthis.gpuType = FloatType;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute\n\t * array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this buffer attribute.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {BufferAttribute} A reference to this buffer attribute.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given buffer attribute to this instance.\n\t *\n\t * @param {BufferAttribute} source - The buffer attribute to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given buffer attribute to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this buffer attribute.\n\t * @param {BufferAttribute} attribute - The buffer attribute to copy from.\n\t * @param {number} index2 - The source index into the given buffer attribute.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given array data into this buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} array - The array to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 matrix to the given attribute. Works with\n\t * item size `2` and `3`.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this buffer attribute's array.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the attribute array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when attribute data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * @return {BufferAttribute} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8Clamped` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8ClampedArray)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float16` buffer attribute with\n * a plain `Array` instance.\n *\n * This class automatically converts to and from FP16 via `Uint16Array` since `Float16Array`\n * browser support is still problematic.\n *\n * @augments BufferAttribute\n */\nclass Float16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Float32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Float32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\n/**\n * A representation of mesh, line, or point geometry. Includes vertex\n * positions, face indices, normals, colors, UVs, and custom attributes\n * within buffers, reducing the cost of passing all this data to the GPU.\n *\n * ```js\n * const geometry = new THREE.BufferGeometry();\n * // create a simple square shape. We duplicate the top left and bottom right\n * // vertices because each vertex needs to appear once per triangle.\n * const vertices = new Float32Array( [\n * \t-1.0, -1.0, 1.0, // v0\n * \t 1.0, -1.0, 1.0, // v1\n * \t 1.0, 1.0, 1.0, // v2\n *\n * \t 1.0, 1.0, 1.0, // v3\n * \t-1.0, 1.0, 1.0, // v4\n * \t-1.0, -1.0, 1.0 // v5\n * ] );\n * // itemSize = 3 because there are 3 values (components) per vertex\n * geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n * const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n *\n * @augments EventDispatcher\n */\nclass BufferGeometry extends EventDispatcher {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferGeometry = true;\n\n\t\t/**\n\t\t * The ID of the geometry.\n\t\t *\n\t\t * @name BufferGeometry#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\t/**\n\t\t * The UUID of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is\n\t\t * called using \"indexed triangles\". Each triangle is associated with the\n\t\t * indices of three vertices. This attribute therefore stores the index of\n\t\t * each vertex for each triangular face. If this attribute is not set, the\n\t\t * renderer assumes that each three contiguous positions represent a single triangle.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * A (storage) buffer attribute which was generated with a compute shader and\n\t\t * now defines indirect draw calls.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.indirect = null;\n\n\t\t/**\n\t\t * The offset, in bytes, into the indirect drawing buffer where the value data begins. If an array is provided, multiple indirect draw calls will be made for each offset.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {number|Array}\n\t\t * @default 0\n\t\t */\n\t\tthis.indirectOffset = 0;\n\n\t\t/**\n\t\t * This dictionary has as id the name of the attribute to be set and as value\n\t\t * the buffer attribute to set it to. Rather than accessing this property directly,\n\t\t * use `setAttribute()` and `getAttribute()` to access attributes of this geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * This dictionary holds the morph targets of the geometry.\n\t\t *\n\t\t * Note: Once the geometry has been rendered, the morph attribute data cannot\n\t\t * be changed. You will have to call `dispose()`, and create a new geometry instance.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Used to control the morph target behavior; when set to `true`, the morph\n\t\t * target data is treated as relative offsets, rather than as absolute\n\t\t * positions/normals.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.morphTargetsRelative = false;\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a\n\t\t * separate draw call. This allows an array of materials to be used with the geometry.\n\t\t *\n\t\t * Use `addGroup()` and `clearGroups()` to edit groups, rather than modifying this array directly.\n\t\t *\n\t\t * Every vertex and index must belong to exactly one group — groups must not share vertices or\n\t\t * indices, and must not leave vertices or indices unused.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * Bounding box for the geometry which can be calculated with `computeBoundingBox()`.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * Bounding sphere for the geometry which can be calculated with `computeBoundingSphere()`.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Determines the part of the geometry to render. This should not be set directly,\n\t\t * instead use `setDrawRange()`.\n\t\t *\n\t\t * @type {{start:number,count:number}}\n\t\t */\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the geometry.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * Returns the index of this geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` if no index is defined.\n\t */\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\t/**\n\t * Sets the given index to this geometry.\n\t *\n\t * @param {Array|BufferAttribute} index - The index to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given indirect attribute to this geometry.\n\t *\n\t * @param {BufferAttribute} indirect - The attribute holding indirect draw calls.\n\t * @param {number|Array} [indirectOffset=0] - The offset, in bytes, into the indirect drawing buffer where the value data begins. If an array is provided, multiple indirect draw calls will be made for each offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndirect( indirect, indirectOffset = 0 ) {\n\n\t\tthis.indirect = indirect;\n\t\tthis.indirectOffset = indirectOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the indirect attribute of this geometry.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined.\n\t */\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\t/**\n\t * Returns the buffer attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute.\n\t * Returns `undefined` if not attribute has been found.\n\t */\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\t/**\n\t * Sets the given attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes the attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name to delete.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this geometry has an attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether this geometry has an attribute for the given name or not.\n\t */\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Adds a group to this geometry.\n\t *\n\t * @param {number} start - The first element in this draw call. That is the first\n\t * vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - Specifies how many vertices (or indices) are part of this group.\n\t * @param {number} [materialIndex=0] - The material array index to use.\n\t */\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\t/**\n\t * Sets the draw range for this geometry.\n\t *\n\t * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render.\n\t * For indexed BufferGeometry, `count` is the number of indices to render.\n\t */\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the rotation represented by the Quaternion to the geometry.\n\t *\n\t * @param {Quaternion} q - The Quaternion to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the X axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Y axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Z axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#position} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x offset.\n\t * @param {number} y - The y offset.\n\t * @param {number} z - The z offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#scale} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x scale.\n\t * @param {number} y - The y scale.\n\t * @param {number} z - The z scale.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry to face a point in 3D space. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#lookAt} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {Vector3} vector - The target point.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Center the geometry based on its bounding box.\n\t *\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines a geometry by creating a `position` attribute based on the given array of points. The array\n\t * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is\n\t * set to `0`.\n\t *\n\t * If the method is used with an existing `position` attribute, the vertex data are overwritten with the\n\t * data from the array. The length of the array must match the vertex count.\n\t *\n\t * @param {Array|Array} points - The points.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\twarn( 'BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the geometry, and updates the `boundingBox` member.\n\t * The bounding box is not computed by the engine; it must be computed by your app.\n\t * You may need to recompute the bounding box if the geometry vertices are modified.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member.\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if the geometry vertices are modified.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\terror( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and adds a tangent attribute to this geometry.\n\t *\n\t * The computation is only supported for indexed geometries and if position, normal, and uv attributes\n\t * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by\n\t * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead.\n\t */\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\terror( 'BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes vertex normals for the given vertex data. For indexed geometries, the method sets\n\t * each vertex normal to be the average of the face normals of the faces that share that vertex.\n\t * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal\n\t * to be the same as the face normal.\n\t */\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensures every normal vector in a geometry will have a magnitude of `1`. This will\n\t * correct lighting on the geometry surfaces.\n\t */\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a new non-index version of this indexed geometry. If the geometry\n\t * is already non-indexed, the method is a NOOP.\n\t *\n\t * @return {BufferGeometry} The non-indexed version of this indexed geometry.\n\t */\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\twarn( 'BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\t/**\n\t * Serializes the geometry into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized geometry.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = boundingSphere.toJSON();\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new geometry with copied values from this instance.\n\t *\n\t * @return {BufferGeometry} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given geometry to this instance.\n\t *\n\t * @param {BufferGeometry} source - The geometry to copy.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires BufferGeometry#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\t/**\n\t\t * The number of instances of this mesh.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#BoxGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Provides utility functions for managing uniforms.\n *\n * @module UniformsUtils\n */\n\n/**\n * Clones the given uniform definitions by performing a deep-copy. That means\n * if the value of a uniform refers to an object like a Vector3 or Texture,\n * the cloned uniform will refer to a new object reference.\n *\n * @param {Object} src - An object representing uniform definitions.\n * @return {Object} The cloned uniforms.\n */\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\twarn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\n/**\n * Merges the given uniform definitions into a single object. Since the\n * method internally uses cloneUniforms(), it performs a deep-copy when\n * producing the merged uniform definitions.\n *\n * @param {Array} uniforms - An array of objects containing uniform definitions.\n * @return {Object} The merged uniforms.\n */\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * A material rendered with custom shaders. A shader is a small program written in GLSL.\n * that runs on the GPU. You may want to use a custom shader if you need to implement an\n * effect not included with any of the built-in materials.\n *\n * There are the following notes to bear in mind when using a `ShaderMaterial`:\n *\n * - `ShaderMaterial` can only be used with {@link WebGLRenderer}.\n * - Built in attributes and uniforms are passed to the shaders along with your code. If\n * you don't want that, use {@link RawShaderMaterial} instead.\n * - You can use the directive `#pragma unroll_loop_start` and `#pragma unroll_loop_end`\n * in order to unroll a `for` loop in GLSL by the shader preprocessor. The directive has\n * to be placed right above the loop. The loop formatting has to correspond to a defined standard.\n * - The loop has to be [normalized](https://en.wikipedia.org/wiki/Normalized_loop).\n * - The loop variable has to be *i*.\n * - The value `UNROLLED_LOOP_INDEX` will be replaced with the explicitly\n * value of *i* for the given iteration and can be used in preprocessor\n * statements.\n *\n * ```js\n * const material = new THREE.ShaderMaterial( {\n * \tuniforms: {\n * \t\ttime: { value: 1.0 },\n * \t\tresolution: { value: new THREE.Vector2() }\n * \t},\n * \tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n * \tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n * } );\n * ```\n *\n * @augments Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * Constructs a new shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\t/**\n\t\t * Defines custom constants using `#define` directives within the GLSL code\n\t\t * for both the vertex shader and the fragment shader; each key/value pair\n\t\t * yields another directive.\n\t\t * ```js\n\t\t * defines: {\n\t\t * \tFOO: 15,\n\t\t * \tBAR: true\n\t\t * }\n\t\t * ```\n\t\t * Yields the lines:\n\t\t * ```\n\t\t * #define FOO 15\n\t\t * #define BAR true\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * An object of the form:\n\t\t * ```js\n\t\t * {\n\t\t * \t\"uniform1\": { value: 1.0 },\n\t\t * \t\"uniform2\": { value: 2 }\n\t\t * }\n\t\t * ```\n\t\t * specifying the uniforms to be passed to the shader code; keys are uniform\n\t\t * names, values are definitions of the form\n\t\t * ```\n\t\t * {\n\t\t * \tvalue: 1.0\n\t\t * }\n\t\t * ```\n\t\t * where `value` is the value of the uniform. Names must match the name of\n\t\t * the uniform, as defined in the GLSL code. Note that uniforms are refreshed\n\t\t * on every frame, so updating the value of the uniform will immediately\n\t\t * update the value available to the GLSL code.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * An array holding uniforms groups for configuring UBOs.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniformsGroups = [];\n\n\t\t/**\n\t\t * Vertex shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = default_vertex;\n\n\t\t/**\n\t\t * Fragment shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = default_fragment;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * WebGL and WebGPU ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines whether the material color is affected by global fog settings; `true`\n\t\t * to pass fog uniforms to the shader.\n\t\t *\n\t\t * Setting this property to `true` requires the definition of fog uniforms. It is\n\t\t * recommended to use `UniformsUtils.merge()` to combine the custom shader uniforms\n\t\t * with predefined fog uniforms.\n\t\t *\n\t\t * ```js\n\t\t * const material = new ShaderMaterial( {\n\t\t * uniforms: UniformsUtils.merge( [ UniformsLib[ 'fog' ], shaderUniforms ] );\n\t\t * vertexShader: vertexShader,\n\t\t * fragmentShader: fragmentShader,\n\t\t * fog: true\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fog = false;\n\n\t\t/**\n\t\t * Defines whether this material uses lighting; `true` to pass uniform data\n\t\t * related to lighting to this shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Defines whether this material supports clipping; `true` to let the renderer\n\t\t * pass the clippingPlanes uniform.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * Overwritten and set to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceSinglePass = true;\n\n\t\t/**\n\t\t * This object allows to enable certain WebGL 2 extensions.\n\t\t *\n\t\t * - clipCullDistance: set to `true` to use vertex shader clipping\n\t\t * - multiDraw: set to `true` to use vertex shader multi_draw / enable gl_DrawID\n\t\t *\n\t\t * @type {{clipCullDistance:false,multiDraw:false}}\n\t\t */\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t/**\n\t\t * When the rendered geometry doesn't include these attributes but the\n\t\t * material does, these default values will be passed to the shaders. This\n\t\t * avoids errors when buffer data is missing.\n\t\t *\n\t\t * - color: [ 1, 1, 1 ]\n\t\t * - uv: [ 0, 0 ]\n\t\t * - uv1: [ 0, 0 ]\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\t/**\n\t\t * If set, this calls [gl.bindAttribLocation](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindAttribLocation)\n\t\t * to bind a generic vertex index to an attribute variable.\n\t\t *\n\t\t * @type {string|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.index0AttributeName = undefined;\n\n\t\t/**\n\t\t * Can be used to force a uniform update while changing uniforms in\n\t\t * {@link Object3D#onBeforeRender}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\t/**\n\t\t * Defines the GLSL version of custom shader code.\n\t\t *\n\t\t * @type {?(GLSL1|GLSL3)}\n\t\t * @default null\n\t\t */\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\tthis.defaultAttributeValues = Object.assign( {}, source.defaultAttributeValues );\n\n\t\tthis.index0AttributeName = source.index0AttributeName;\n\n\t\tthis.uniformsNeedUpdate = source.uniformsNeedUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t\tthis._reversedDepth = false;\n\n\t}\n\n\t/**\n\t * The flag that indicates whether the camera uses a reversed depth buffer.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget reversedDepth() {\n\n\t\treturn this._reversedDepth;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection](https://en.wikipedia.org/wiki/Perspective_(graphical)).\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is not a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a cube texture made up of six images.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader();\n * loader.setPath( 'textures/cube/pisa/' );\n *\n * const textureCube = loader.load( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );\n * ```\n *\n * @augments Texture\n */\nclass CubeTexture extends Texture {\n\n\t/**\n\t * Constructs a new cube texture.\n\t *\n\t * @param {Array} [images=[]] - An array holding a image for each side of a cube.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space value.\n\t */\n\tconstructor( images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeTexture#image}.\n\t *\n\t * @type {Array}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * A cube render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new CubeTexture( images );\n\t\tthis._setTextureOptions( options );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {WebGLCubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\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`,\n\n\t\t\tfragmentShader: /* glsl */`\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`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears this cube render target.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( renderer, color = true, depth = true, stencil = true ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\n/**\n * Class for representing a XR controller with its\n * different coordinate systems.\n *\n * @private\n */\nclass WebXRController {\n\n\t/**\n\t * Constructs a new XR controller.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A group representing the target ray space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._targetRay = null;\n\n\t\t/**\n\t\t * A group representing the grip space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._grip = null;\n\n\t\t/**\n\t\t * A group representing the hand space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._hand = null;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand space of the XR controller.\n\t *\n\t * @return {Group} A group representing the hand space of the XR controller.\n\t */\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\t/**\n\t * Returns a group representing the target ray space of the XR controller.\n\t *\n\t * @return {Group} A group representing the target ray space of the XR controller.\n\t */\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\t/**\n\t * Returns a group representing the grip space of the XR controller.\n\t *\n\t * @return {Group} A group representing the grip space of the XR controller.\n\t */\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\t/**\n\t * Dispatches the given event to the groups representing\n\t * the different coordinate spaces of the XR controller.\n\t *\n\t * @param {Object} event - The event to dispatch.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects the controller with the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects the controller from the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the controller with the given input source, XR frame and reference space.\n\t * This updates the transformations of the groups that represent the different\n\t * coordinate systems of the controller.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @param {XRFrame} frame - The XR frame.\n\t * @param {XRReferenceSpace} referenceSpace - The reference space.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand joint for the given input joint.\n\t *\n\t * @private\n\t * @param {Group} hand - The group representing the hand space.\n\t * @param {XRJointSpace} inputjoint - The hand joint data.\n\t * @return {Group} A group representing the hand joint for the given input joint.\n\t */\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material. It is possible\n\t\t * to exclude materials from override by setting {@link Material#allowOverride} to `false`.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * \"Interleaved\" means that multiple attributes, possibly of different types,\n * (e.g., position, normal, uv, color) are packed into a single array buffer.\n *\n * An introduction into interleaved arrays can be found here: [Interleaved array basics](https://blog.tojicode.com/2011/05/interleaved-array-basics.html)\n */\nclass InterleavedBuffer {\n\n\t/**\n\t * Constructs a new interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t */\n\tconstructor( array, stride ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBuffer = true;\n\n\t\t/**\n\t\t * A typed array with a shared buffer storing attribute data.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * The total number of elements in the array\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The UUID of the interleaved buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute array\n\t * data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this interleaved buffer.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {InterleavedBuffer} A reference to this interleaved buffer.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given interleaved buffer to this instance.\n\t *\n\t * @param {InterleavedBuffer} source - The interleaved buffer to copy.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given interleaved buffer to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this interleaved buffer.\n\t * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from.\n\t * @param {number} index2 - The source index into the given interleaved buffer.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopyAt( index1, interleavedBuffer, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= interleavedBuffer.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = interleavedBuffer.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the interleaved buffer.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this interleaved buffer's array.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new interleaved buffer with copied values from this instance.\n\t *\n\t * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures.\n\t * @return {InterleavedBuffer} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the interleaved buffer into JSON.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized interleaved buffer.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\n/**\n * An alternative version of a buffer attribute with interleaved data. Interleaved\n * attributes share a common interleaved data storage ({@link InterleavedBuffer}) and refer with\n * different offsets into the buffer.\n */\nclass InterleavedBufferAttribute {\n\n\t/**\n\t * Constructs a new interleaved buffer attribute.\n\t *\n\t * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data.\n\t * @param {number} itemSize - The item size.\n\t * @param {number} offset - The attribute offset into the buffer.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer holding the interleaved data.\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.data = interleavedBuffer;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The attribute offset into the buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Whether the data are normalized or not, see {@link BufferAttribute#normalized}\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t}\n\n\t/**\n\t * The item count of this buffer attribute.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\t/**\n\t * The array holding the interleaved buffer attribute data.\n\t *\n\t * @type {TypedArray}\n\t */\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property.\n\t * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A material for rendering instances of {@link Sprite}.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'textures/sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );\n *\n * const sprite = new THREE.Sprite( material );\n * sprite.scale.set(200, 200, 1)\n * scene.add( sprite );\n * ```\n *\n * @augments Material\n */\nclass SpriteMaterial extends Material {\n\n\t/**\n\t * Constructs a new sprite material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The rotation of the sprite in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Specifies whether size of the sprite is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Overwritten since sprite materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {(SpriteMaterial|SpriteNodeMaterial)}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\t/**\n\t\t * The number of instances of this sprite.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\terror( 'Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {?Object3D} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n * @demo scenes/bones-browser.html\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\twarn( 'SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\n/**\n * Creates a texture directly from raw buffer data.\n *\n * The interpretation of the data depends on type and format: If the type is\n * `UnsignedByteType`, a `Uint8Array` will be useful for addressing the\n * texel data. If the format is `RGBAFormat`, data needs four values for\n * one texel; Red, Green, Blue and Alpha (typically the opacity).\n *\n * @augments Texture\n */\nclass DataTexture extends Texture {\n\n\t/**\n\t * Constructs a new data texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number}}\n\t\t */\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array} [bones] - An array of bones.\n\t * @param {Array} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * An array buffer holding the bone data of the previous frame.\n\t\t * Required for computing velocity. Maintained in {@link SkinningNode}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.previousBoneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\twarn( 'Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Object} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\twarn( 'Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An instanced version of a buffer attribute.\n *\n * @augments BufferAttribute\n */\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new instanced buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated.\n\t */\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated. A\n\t\t * value of one means that each value of the instanced attribute is used for\n\t\t * a single instance. A value of two means that each value is used for two\n\t\t * consecutive instances (and so on).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tplanes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far\n\t\t\tplanes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near\n\n\t\t} else {\n\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\n\t\tconst offset = _defaultSpriteCenter.distanceTo( sprite.center );\n\n\t\t_sphere$3.radius = 0.7071067811865476 + offset;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _frustum$1 = /*@__PURE__*/ new Frustum();\n\n/**\n * FrustumArray is used to determine if an object is visible in at least one camera\n * from an array of cameras. This is particularly useful for multi-view renderers.\n*/\nclass FrustumArray {\n\n\t/**\n\t * Constructs a new frustum array.\n\t *\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The coordinate system to use.\n\t\t *\n\t\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t\t * @default WebGLCoordinateSystem\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the 3D object is visible in any camera.\n\t */\n\tintersectsObject( object, cameraArray ) {\n\n\t\tif ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsObject( object ) ) {\n\n\t\t\t\treturn true; // Object is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sprite is visible in any camera.\n\t */\n\tintersectsSprite( sprite, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSprite( sprite ) ) {\n\n\t\t\t\treturn true; // Sprite is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sphere is visible in any camera.\n\t */\n\tintersectsSphere( sphere, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSphere( sphere ) ) {\n\n\t\t\t\treturn true; // Sphere is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the box is visible in any camera.\n\t */\n\tintersectsBox( box, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsBox( box ) ) {\n\n\t\t\t\treturn true; // Box is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within any frustum\n\t * from the camera array.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the point is visible in any camera.\n\t */\n\tcontainsPoint( point, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.containsPoint( point ) ) {\n\n\t\t\t\treturn true; // Point is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns a new frustum array with copied values from this instance.\n\t *\n\t * @return {FrustumArray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FrustumArray();\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward$1 = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in BatchedMesh to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\t\t\t\t\tindex.needsUpdate = true;\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._availableInstanceIds = source._availableInstanceIds.slice();\n\t\tthis._availableGeometryIds = source._availableGeometryIds.slice();\n\n\t\tthis._nextIndexStart = source._nextIndexStart;\n\t\tthis._nextVertexStart = source._nextVertexStart;\n\t\tthis._geometryCount = source._geometryCount;\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._indirectTexture = source._indirectTexture.clone();\n\t\tthis._indirectTexture.image.data = this._indirectTexture.image.data.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled && ! camera.isArrayCamera ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward$1.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward$1 );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n * ```\n *\n * @augments Material\n */\nclass LineBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new line basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * Sets the color of the lines using data from a texture. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}. WebGL and WebGPU\n\t\t * ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of line ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('butt'|'round'|'square')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of line joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\n/**\n * A material for rendering point primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const vertices = [];\n *\n * for ( let i = 0; i < 10000; i ++ ) {\n * \tconst x = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst y = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst z = THREE.MathUtils.randFloatSpread( 2000 );\n *\n * \tvertices.push( x, y, z );\n * }\n *\n * const geometry = new THREE.BufferGeometry();\n * geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n * const material = new THREE.PointsMaterial( { color: 0x888888 } );\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Constructs a new points material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Defines the size of the points in pixels.\n\t\t *\n\t\t * Might be capped if the value exceeds hardware dependent parameters like [gl.ALIASED_POINT_SIZE_RANGE](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParamete).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specifies whether size of individual points is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * A texture for use with a video.\n *\n * ```js\n * // assuming you have created a HTML video element with id=\"video\"\n * const video = document.getElementById( 'video' );\n * const texture = new THREE.VideoTexture( video );\n * ```\n *\n * Note: When using video textures with {@link WebGPURenderer}, {@link Texture#colorSpace} must be\n * set to THREE.SRGBColorSpace.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments Texture\n */\nclass VideoTexture extends Texture {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {HTMLVideoElement} video - The video element to use as a data source for the texture.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoTexture = true;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The video frame request callback identifier, which is a positive integer.\n\t\t *\n\t\t * Value of 0 represents no scheduled rVFC.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tscope._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tthis._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\t/**\n\t * This method is called automatically by the renderer and sets {@link Texture#needsUpdate}\n\t * to `true` every time a new frame is available.\n\t *\n\t * Only relevant if `requestVideoFrameCallback` is not supported in the browser.\n\t */\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._requestVideoFrameCallbackId !== 0 ) {\n\n\t\t\tthis.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );\n\n\t\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n/**\n * This class can be used as an alternative way to define video data. Instead of using\n * an instance of `HTMLVideoElement` like with `VideoTexture`, `VideoFrameTexture` expects each frame is\n * defined manually via {@link VideoFrameTexture#setFrame}. A typical use case for this module is when\n * video frames are decoded with the WebCodecs API.\n *\n * ```js\n * const texture = new THREE.VideoFrameTexture();\n * texture.setFrame( frame );\n * ```\n *\n * @augments VideoTexture\n */\nclass VideoFrameTexture extends VideoTexture {\n\n\t/**\n\t * Constructs a new video frame texture.\n\t *\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\t/**\n\t * This method overwritten with an empty implementation since\n\t * this type of texture is updated via `setFrame()`.\n\t */\n\tupdate() {}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\t/**\n\t * Sets the current frame of the video. This will automatically update the texture\n\t * so the data can be used for rendering.\n\t *\n\t * @param {VideoFrame} frame - The video frame.\n\t */\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can only be used in combination with `copyFramebufferToTexture()` methods\n * of renderers. It extracts the contents of the current bound framebuffer and provides it\n * as a texture for further usage.\n *\n * ```js\n * const pixelRatio = window.devicePixelRatio;\n * const textureSize = 128 * pixelRatio;\n *\n * const frameTexture = new FramebufferTexture( textureSize, textureSize );\n *\n * // calculate start position for copying part of the frame data\n * const vector = new Vector2();\n * vector.x = ( window.innerWidth * pixelRatio / 2 ) - ( textureSize / 2 );\n * vector.y = ( window.innerHeight * pixelRatio / 2 ) - ( textureSize / 2 );\n *\n * renderer.render( scene, camera );\n *\n * // copy part of the rendered frame into the framebuffer texture\n * renderer.copyFramebufferToTexture( frameTexture, vector );\n * ```\n *\n * @augments Texture\n */\nclass FramebufferTexture extends Texture {\n\n\t/**\n\t * Constructs a new framebuffer texture.\n\t *\n\t * @param {number} [width] - The width of the texture.\n\t * @param {number} [height] - The height of the texture.\n\t */\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFramebufferTexture = true;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments Texture\n */\nclass CompressedTexture extends Texture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t */\n\t\tthis.image = { width: width, height: height };\n\n\t\t/**\n\t\t * This array holds for all mipmaps (including the bases mip) the data and dimensions.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = mipmaps;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not possible to\n\t\t * flip compressed textures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not\n\t\t * possible to generate mipmaps for compressed data. Mipmaps\n\t\t * must be embedded in the compressed texture file.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\n/**\n * Creates a texture 2D array based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedArrayTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed array texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} depth - The depth of the texture.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t */\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedArrayTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @name CompressedArrayTexture#image\n\t\t * @type {{width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image.depth = depth;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire compressed texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * Creates a cube texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedCubeTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} images - An array of compressed textures.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t */\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedCubeTexture = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\n/**\n * Creates a texture from a canvas element.\n *\n * This is almost the same as the base texture class, except that it sets {@link Texture#needsUpdate}\n * to `true` immediately since a canvas can directly be used for rendering.\n *\n * @augments Texture\n */\nclass CanvasTexture extends Texture {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {HTMLCanvasElement} [canvas] - The HTML canvas element.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * rendering into a texture.\n *\n * @augments Texture\n */\nclass DepthTexture extends Texture {\n\n\t/**\n\t * Constructs a new depth texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1 ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tconst image = { width: width, height: height, depth: depth };\n\n\t\tsuper( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDepthTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * Code corresponding to the depth compare function.\n\t\t *\n\t\t * @type {?(NeverCompare|LessCompare|EqualCompare|LessEqualCompare|GreaterCompare|NotEqualCompare|GreaterEqualCompare|AlwaysCompare)}\n\t\t * @default null\n\t\t */\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * cube rendering into a cube texture with depth format. Used for PointLight shadows.\n *\n * @augments DepthTexture\n */\nclass CubeDepthTexture extends DepthTexture {\n\n\t/**\n\t * Constructs a new cube depth texture.\n\t *\n\t * @param {number} size - The size (width and height) of each cube face.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t */\n\tconstructor( size, type = UnsignedIntType, mapping = CubeReflectionMapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat ) {\n\n\t\t// Create 6 identical image descriptors for the cube faces\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t// Call DepthTexture constructor with width, height\n\t\tsuper( size, size, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format );\n\n\t\t// Replace the single image with the array of 6 images\n\t\tthis.image = images;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeDepthTexture = true;\n\n\t\t/**\n\t\t * Set to true for cube texture handling in WebGLTextures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeDepthTexture#image}.\n\t *\n\t * @type {Array}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * Represents a texture created externally with the same renderer context.\n *\n * This may be a texture from a protected media stream, device camera feed,\n * or other data feeds like a depth sensor.\n *\n * Note that this class is only supported in {@link WebGLRenderer}, and in\n * the {@link WebGPURenderer} WebGPU backend.\n *\n * @augments Texture\n */\nclass ExternalTexture extends Texture {\n\n\t/**\n\t * Creates a new raw texture.\n\t *\n\t * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.\n\t */\n\tconstructor( sourceTexture = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The external source texture.\n\t\t *\n\t\t * @type {?(WebGLTexture|GPUTexture)}\n\t\t * @default null\n\t\t */\n\t\tthis.sourceTexture = sourceTexture;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isExternalTexture = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sourceTexture = source.sourceTexture;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a capsule.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CapsuleGeometry\n */\nclass CapsuleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor( radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t};\n\n\t\theight = Math.max( 0, height );\n\t\tcapSegments = Math.max( 1, Math.floor( capSegments ) );\n\t\tradialSegments = Math.max( 3, Math.floor( radialSegments ) );\n\t\theightSegments = Math.max( 1, Math.floor( heightSegments ) );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = ( Math.PI / 2 ) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor ( let iy = 0; iy <= numVerticalSegments; iy ++ ) {\n\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif ( iy <= capSegments ) {\n\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = - halfHeight - radius * Math.cos( angle );\n\t\t\t\tprofileRadius = radius * Math.sin( angle );\n\t\t\t\tnormalYComponent = - radius * Math.cos( angle );\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\n\t\t\t} else if ( iy <= capSegments + heightSegments ) {\n\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = ( iy - capSegments ) / heightSegments;\n\t\t\t\tprofileY = - halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\n\t\t\t} else {\n\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t( iy - capSegments - heightSegments ) / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin( angle );\n\t\t\t\tprofileRadius = radius * Math.cos( angle );\n\t\t\t\tnormalYComponent = radius * Math.sin( angle );\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\n\t\t\t}\n\n\t\t\tconst v = Math.max( 0, Math.min( 1, currentArcLength / totalArcLength ) );\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\n\t\t\t} else if ( iy === numVerticalSegments ) {\n\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t- profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, v );\n\n\t\t\t}\n\n\t\t\tif ( iy > 0 ) {\n\n\t\t\t\tconst prevIndexRow = ( iy - 1 ) * verticesPerRow;\n\t\t\t\tfor ( let ix = 0; ix < radialSegments; ix ++ ) {\n\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push( i1, i2, i3 );\n\t\t\t\t\tindices.push( i2, i4, i3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CircleGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CylinderGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n * @demo scenes/geometry-browser.html#ConeGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#DodecahedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\twarn( 'Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array, normals: Array, binormals: Array}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Interpolations contains spline and Bézier functions internally used by concrete curve classes.\n *\n * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n *\n * @module Interpolations\n */\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 } The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array,holes:Array>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* eslint-disable */\n// copy of mapbox/earcut version 3.0.2\n// https://github.com/mapbox/earcut/tree/v3.0.2\n\nfunction earcut(data, holeIndices, dim = 2) {\n\n const hasHoles = holeIndices && holeIndices.length;\n const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n let outerNode = linkedList(data, 0, outerLen, dim, true);\n const triangles = [];\n\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n let minX, minY, invSize;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = data[0];\n minY = data[1];\n let maxX = minX;\n let maxY = minY;\n\n for (let i = dim; i < outerLen; i += dim) {\n const x = data[i];\n const y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 32767 / invSize : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n let last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n } else {\n for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n let p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n let stop = ear;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n const prev = ear.prev;\n const next = ear.next;\n\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n removeNode(ear);\n\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(filterPoints(ear), triangles);\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n let p = c.next;\n while (p !== a) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n // z-order range for the current triangle bbox;\n const minZ = zOrder(x0, y0, minX, minY, invSize),\n maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n let p = ear.prevZ,\n n = ear.nextZ;\n\n // look for points inside the triangle in both directions\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n // look for remaining points in decreasing z-order\n while (p && p.z >= minZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n // look for remaining points in increasing z-order\n while (n && n.z <= maxZ) {\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n let p = start;\n do {\n const a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i, p.i, b.i);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n let a = start;\n do {\n let b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n let c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n const queue = [];\n\n for (let i = 0, len = holeIndices.length; i < len; i++) {\n const start = holeIndices[i] * dim;\n const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n const list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareXYSlope);\n\n // process holes from left to right\n for (let i = 0; i < queue.length; i++) {\n outerNode = eliminateHole(queue[i], outerNode);\n }\n\n return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n let result = a.x - b.x;\n // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n // the bridge to the outer shell is always the point that they meet at.\n if (result === 0) {\n result = a.y - b.y;\n if (result === 0) {\n const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n result = aSlope - bSlope;\n }\n }\n return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole(hole, outerNode) {\n const bridge = findHoleBridge(hole, outerNode);\n if (!bridge) {\n return outerNode;\n }\n\n const bridgeReverse = splitPolygon(bridge, hole);\n\n // filter collinear points around the cuts\n filterPoints(bridgeReverse, bridgeReverse.next);\n return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n let p = outerNode;\n const hx = hole.x;\n const hy = hole.y;\n let qx = -Infinity;\n let m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n // unless they intersect at a vertex, then choose the vertex\n if (equals(hole, p)) return p;\n do {\n if (equals(hole, p.next)) return p.next;\n else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n const stop = m;\n const mx = m.x;\n const my = m.y;\n let tanMin = Infinity;\n\n p = m;\n\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if (locallyInside(p, hole) &&\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n } while (p !== stop);\n\n return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n let p = start;\n do {\n if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n let numMerges;\n let inSize = 1;\n\n do {\n let p = list;\n let e;\n list = null;\n let tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n let q = p;\n let pSize = 0;\n for (let i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n let qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = (x - minX) * invSize | 0;\n y = (y - minY) * invSize | 0;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n let p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n const o1 = sign(area(p1, q1, p2));\n const o2 = sign(area(p1, q1, q2));\n const o3 = sign(area(p2, q2, p1));\n const o4 = sign(area(p2, q2, q1));\n\n if (o1 !== o2 && o3 !== o4) return true; // general case\n\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n let p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n let p = a;\n let inside = false;\n const px = (a.x + b.x) / 2;\n const py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n const a2 = createNode(a.i, a.x, a.y),\n b2 = createNode(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n const p = createNode(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n return {\n i, // vertex index in coordinates array\n x, y, // vertex coordinates\n prev: null, // previous and next vertex nodes in a polygon ring\n next: null,\n z: 0, // z-order curve value\n prevZ: null, // previous and next nodes in z-order\n nextZ: null,\n steiner: false // indicates whether this is a steiner point\n };\n}\n\nfunction signedArea(data, start, end, dim) {\n let sum = 0;\n for (let i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm.\n * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).\n *\n * @see https://github.com/mapbox/earcut\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array} data - An array with 2D points.\n\t * @param {Array} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\treturn earcut( data, holeIndices, dim );\n\n\t}\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array} contour - An array of 2D points defining the contour.\n\t * @param {Array>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ExtrudeGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {ExtrudeGeometry~Options} [options] - The extrude settings.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\tconst isClosed = extrudePath.isCatmullRomCurve3 ? extrudePath.closed : false;\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, isClosed );\n\n\t\t\t\t// log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/**Merges index-adjacent points that are within a threshold distance of each other. Array is modified in-place. Threshold distance is empirical, and scaled based on the magnitude of point coordinates.\n\t\t\t * @param {Array} points\n\t\t\t*/\n\t\t\tfunction mergeOverlappingPoints( points ) {\n\n\t\t\t\tconst THRESHOLD = 1e-10;\n\t\t\t\tconst THRESHOLD_SQ = THRESHOLD * THRESHOLD;\n\t\t\t\tlet prevPos = points[ 0 ];\n\t\t\t\tfor ( let i = 1; i <= points.length; i ++ ) {\n\n\t\t\t\t\tconst currentIndex = i % points.length;\n\t\t\t\t\tconst currentPos = points[ currentIndex ];\n\t\t\t\t\tconst dx = currentPos.x - prevPos.x;\n\t\t\t\t\tconst dy = currentPos.y - prevPos.y;\n\t\t\t\t\tconst distSq = dx * dx + dy * dy;\n\n\t\t\t\t\tconst scalingFactorSqrt = Math.max(\n\t\t\t\t\t\tMath.abs( currentPos.x ),\n\t\t\t\t\t\tMath.abs( currentPos.y ),\n\t\t\t\t\t\tMath.abs( prevPos.x ),\n\t\t\t\t\t\tMath.abs( prevPos.y )\n\t\t\t\t\t);\n\t\t\t\t\tconst thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt;\n\t\t\t\t\tif ( distSq <= thresholdSqScaled ) {\n\n\t\t\t\t\t\tpoints.splice( currentIndex, 1 );\n\t\t\t\t\t\ti --;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tprevPos = currentPos;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmergeOverlappingPoints( vertices );\n\t\t\tholes.forEach( mergeOverlappingPoints );\n\n\t\t\tconst numHoles = holes.length;\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0; h < numHoles; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) error( 'ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\t\t\tlet faces;\n\n\t\t\tif ( bevelSegments === 0 ) {\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contour, holes );\n\n\t\t\t} else {\n\n\t\t\t\tconst contractedContourVertices = [];\n\t\t\t\tconst expandedHoleVertices = [];\n\n\t\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t\t// contract shape\n\n\t\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\tif ( t === 0 ) contractedContourVertices.push( vert );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand holes\n\n\t\t\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\t\t\t\t\t\tconst oneHoleVertices = [];\n\t\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\t\tif ( t === 0 ) oneHoleVertices.push( vert );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( t === 0 ) expandedHoleVertices.push( oneHoleVertices );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contractedContourVertices, expandedHoleVertices );\n\n\t\t\t}\n\n\t\t\tconst flen = faces.length;\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#IcosahedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#LatheGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#OctahedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#PlaneGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#RingGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ShapeGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#SphereGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#TetrahedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusKnotGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TubeGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * This material can receive shadows, but otherwise is completely transparent.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 2000, 2000 );\n * geometry.rotateX( - Math.PI / 2 );\n *\n * const material = new THREE.ShadowMaterial();\n * material.opacity = 0.2;\n *\n * const plane = new THREE.Mesh( geometry, material );\n * plane.position.y = -200;\n * plane.receiveShadow = true;\n * scene.add( plane );\n * ```\n *\n * @augments Material\n */\nclass ShadowMaterial extends Material {\n\n\t/**\n\t * Constructs a new shadow material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.color = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This class works just like {@link ShaderMaterial}, except that definitions\n * of built-in uniforms and attributes are not automatically prepended to the\n * GLSL shader code.\n *\n * `RawShaderMaterial` can only be used with {@link WebGLRenderer}.\n *\n * @augments ShaderMaterial\n */\nclass RawShaderMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new raw shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n *\n * Physically based rendering (PBR) has recently become the standard in many\n * 3D applications, such as [Unity](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/),\n * [Unreal](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/) and\n * [3D Studio Max](http://area.autodesk.com/blogs/the-3ds-max-blog/what039s-new-for-rendering-in-3ds-max-2017).\n *\n * This approach differs from older approaches in that instead of using\n * approximations for the way in which light interacts with a surface, a\n * physically correct model is used. The idea is that, instead of tweaking\n * materials to look good under specific lighting, a material can be created\n * that will react 'correctly' under all lighting scenarios.\n *\n * In practice this gives a more accurate and realistic looking result than\n * the {@link MeshLambertMaterial} or {@link MeshPhongMaterial}, at the cost of\n * being somewhat more computationally expensive. `MeshStandardMaterial` uses per-fragment\n * shading.\n *\n * Note that for best results you should always specify an environment map when using this material.\n *\n * For a non-technical introduction to the concept of PBR and how to set up a\n * PBR material, check out these articles by the people at [marmoset](https://www.marmoset.co):\n *\n * - [Basic Theory of Physically Based Rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/)\n * - [Physically Based Rendering and You Can Too](https://www.marmoset.co/posts/physically-based-rendering-and-you-can-too/)\n *\n * Technical details of the approach used in three.js (and most other PBR systems) can be found is this\n * [paper from Disney](https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf)\n * (pdf), by Brent Burley.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshStandardMaterial\n */\nclass MeshStandardMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh standard material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * How rough the material appears. `0.0` means a smooth mirror reflection, `1.0`\n\t\t * means fully diffuse. If `roughnessMap` is also provided,\n\t\t * both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.roughness = 1.0;\n\n\t\t/**\n\t\t * How much the material is like a metal. Non-metallic materials such as wood\n\t\t * or stone use `0.0`, metallic use `1.0`, with nothing (usually) in between.\n\t\t * A value between `0.0` and `1.0` could be used for a rusty metal look.\n\t\t * If `metalnessMap` is also provided, both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.metalness = 0.0;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map. To ensure a physically correct rendering, environment maps\n\t\t * are internally pre-processed with {@link PMREMGenerator}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An extension of the {@link MeshStandardMaterial}, providing more advanced\n * physically-based rendering properties:\n *\n * - Anisotropy: Ability to represent the anisotropic property of materials\n * as observable with brushed metals.\n * - Clearcoat: Some materials — like car paints, carbon fiber, and wet surfaces — require\n * a clear, reflective layer on top of another layer that may be irregular or rough.\n * Clearcoat approximates this effect, without the need for a separate transparent surface.\n * - Iridescence: Allows to render the effect where hue varies depending on the viewing\n * angle and illumination angle. This can be seen on soap bubbles, oil films, or on the\n * wings of many insects.\n * - Physically-based transparency: One limitation of {@link Material#opacity} is that highly\n * transparent materials are less reflective. Physically-based transmission provides a more\n * realistic option for thin, transparent surfaces like glass.\n * - Advanced reflectivity: More flexible reflectivity for non-metallic materials.\n * - Sheen: Can be used for representing cloth and fabric materials.\n *\n * As a result of these complex shading features, `MeshPhysicalMaterial` has a\n * higher performance cost, per pixel, than other three.js materials. Most\n * effects are disabled by default, and add cost as they are enabled. For\n * best results, always specify an environment map when using this material.\n *\n * @augments MeshStandardMaterial\n * @demo scenes/material-browser.html#MeshPhysicalMaterial\n */\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\t/**\n\t * Constructs a new mesh physical material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\t/**\n\t\t * The rotation of the anisotropy in tangent, bitangent space, measured in radians\n\t\t * counter-clockwise from the tangent. When `anisotropyMap` is present, this\n\t\t * property provides additional rotation to the vectors in the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropyRotation = 0;\n\n\t\t/**\n\t\t * Red and green channels represent the anisotropy direction in `[-1, 1]` tangent,\n\t\t * bitangent space, to be rotated by `anisotropyRotation`. The blue channel\n\t\t * contains strength as `[0, 1]` to be multiplied by `anisotropy`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `clearcoat`,\n\t\t * for per-pixel control over a coating's intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * Roughness of the clear coat layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * The green channel of this texture is multiplied against\n\t\t * `clearcoatRoughness`, for per-pixel control over a coating's roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * How much `clearcoatNormalMap` affects the clear coat layer, from\n\t\t * `(0,0)` to `(1,1)`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * Can be used to enable independent normals for the clear coat layer.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * Index-of-refraction for non-metallic materials, from `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.5\n\t\t */\n\t\tthis.ior = 1.5;\n\n\t\t/**\n\t\t * Degree of reflectivity, from `0.0` to `1.0`. Default is `0.5`, which\n\t\t * corresponds to an index-of-refraction of `1.5`.\n\t\t *\n\t\t * This models the reflectivity of non-metallic materials. It has no effect\n\t\t * when `metalness` is `1.0`\n\t\t *\n\t\t * @name MeshPhysicalMaterial#reflectivity\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `iridescence`, for per-pixel\n\t\t * control over iridescence.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceMap = null;\n\n\t\t/**\n\t\t * Strength of the iridescence RGB color shift effect, represented by an index-of-refraction.\n\t\t * Between `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.3\n\t\t */\n\t\tthis.iridescenceIOR = 1.3;\n\n\t\t/**\n\t\t *Array of exactly 2 elements, specifying minimum and maximum thickness of the iridescence layer.\n\t\t Thickness of iridescence layer has an equivalent effect of the one `thickness` has on `ior`.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default [100,400]\n\t\t */\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t/**\n\t\t * A texture that defines the thickness of the iridescence layer, stored in the green channel.\n\t\t * Minimum and maximum values of thickness are defined by `iridescenceThicknessRange` array:\n\t\t * - `0.0` in the green channel will result in thickness equal to first element of the array.\n\t\t * - `1.0` in the green channel will result in thickness equal to second element of the array.\n\t\t * - Values in-between will linearly interpolate between the elements of the array.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\t/**\n\t\t * The sheen tint.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.sheenColor = new Color( 0x000000 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `sheenColor`, for per-pixel control\n\t\t * over sheen tint.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenColorMap = null;\n\n\t\t/**\n\t\t * Roughness of the sheen layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sheenRoughness = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `sheenRoughness`, for per-pixel control\n\t\t * over sheen roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `transmission`, for per-pixel control over\n\t\t * optical transparency.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionMap = null;\n\n\t\t/**\n\t\t * The thickness of the volume beneath the surface. The value is given in the\n\t\t * coordinate space of the mesh. If the value is `0` the material is\n\t\t * thin-walled. Otherwise the material is a volume boundary.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.thickness = 0;\n\n\t\t/**\n\t\t * A texture that defines the thickness, stored in the green channel. This will\n\t\t * be multiplied by `thickness`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessMap = null;\n\n\t\t/**\n\t\t * Density of the medium given as the average distance that light travels in\n\t\t * the medium before interacting with a particle. The value is given in world\n\t\t * space units, and must be greater than zero.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.attenuationDistance = Infinity;\n\n\t\t/**\n\t\t * The color that white light turns into due to absorption when reaching the\n\t\t * attenuation distance.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * A float that scales the amount of specular reflection for non-metals only.\n\t\t * When set to zero, the model is effectively Lambertian. From `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.specularIntensity = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `specularIntensity`,\n\t\t * for per-pixel control over specular intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityMap = null;\n\n\t\t/**\n\t\t * Tints the specular reflection at normal incidence for non-metals only.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `specularColor`,\n\t\t * for per-pixel control over specular color.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The anisotropy strength, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\t/**\n\t * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use\n\t * clear coat related properties to enable multilayer materials that have a\n\t * thin translucent layer over the base layer.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\t/**\n\t * The intensity of the iridescence layer, simulating RGB color shift based on the angle between\n\t * the surface and the viewer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\t/**\n\t * Defines the strength of the angular separation of colors (chromatic aberration) transmitting\n\t * through a relatively clear volume. Any value zero or larger is valid, the typical range of\n\t * realistic values is `[0, 1]`. This property can be only be used with transmissive objects.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\t/**\n\t * The intensity of the sheen layer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\t/**\n\t * Degree of transmission (or optical transparency), from `0.0` to `1.0`.\n\t *\n\t * Thin, transparent or semitransparent, plastic or glass materials remain\n\t * largely reflective even if they are fully transmissive. The transmission\n\t * property can be used to model these materials.\n\t *\n\t * When transmission is non-zero, `opacity` should be set to `1`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n *\n * The material uses a non-physically based [Blinn-Phong](https://en.wikipedia.org/wiki/Blinn-Phong_shading_model)\n * model for calculating reflectance. Unlike the Lambertian model used in the\n * {@link MeshLambertMaterial} this can simulate shiny surfaces with specular\n * highlights (such as varnished wood). `MeshPhongMaterial` uses per-fragment shading.\n *\n * Performance will generally be greater when using this material over the\n * {@link MeshStandardMaterial} or {@link MeshPhysicalMaterial}, at the cost of\n * some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshPhongMaterial\n */\nclass MeshPhongMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh phong material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * Specular color of the material. The default color is set to `0x111111` (very dark grey)\n\t\t *\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.specular = new Color( 0x111111 );\n\n\t\t/**\n\t\t * How shiny the specular highlight is; a higher value gives a sharper highlight.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface\n\t\t * highlight contributes and how much of the environment map affects the\n\t\t * surface.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material implementing toon shading.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshToonMaterial\n */\nclass MeshToonMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh toon material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Gradient map for toon shading. It's required to set\n\t\t * {@link Texture#minFilter} and {@link Texture#magFilter} to {@linkNearestFilter}\n\t\t * when using this type of texture.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.gradientMap = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material that maps the normal vectors to RGB colors.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshNormalMaterial\n */\nclass MeshNormalMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh normal material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n *\n * The material uses a non-physically based [Lambertian](https://en.wikipedia.org/wiki/Lambertian_reflectance)\n * model for calculating reflectance. This can simulate some surfaces (such\n * as untreated wood or stone) well, but cannot simulate shiny surfaces with\n * specular highlights (such as varnished wood). `MeshLambertMaterial` uses per-fragment\n * shading.\n *\n * Due to the simplicity of the reflectance and illumination models,\n * performance will be greater when using this material over the\n * {@link MeshPhongMaterial}, {@link MeshStandardMaterial} or\n * {@link MeshPhysicalMaterial}, at the cost of some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshLambertMaterial\n */\nclass MeshLambertMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh lambert material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth. Depth is based off of the camera\n * near and far plane. White is nearest, black is farthest.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshDepthMaterial\n */\nclass MeshDepthMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh depth material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\t/**\n\t\t * Type for depth packing.\n\t\t *\n\t\t * @type {(BasicDepthPacking|RGBADepthPacking|RGBDepthPacking|RGDepthPacking)}\n\t\t * @default BasicDepthPacking\n\t\t */\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material used internally for implementing shadow mapping with\n * point lights.\n *\n * Can also be used to customize the shadow casting of an object by assigning\n * an instance of `MeshDistanceMaterial` to {@link Object3D#customDistanceMaterial}.\n * The following examples demonstrates this approach in order to ensure\n * transparent parts of objects do not cast shadows.\n *\n * @augments Material\n */\nclass MeshDistanceMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh distance material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This material is defined by a MatCap (or Lit Sphere) texture, which encodes the\n * material color and shading.\n *\n * `MeshMatcapMaterial` does not respond to lights since the matcap image file encodes\n * baked lighting. It will cast a shadow onto an object that receives shadows\n * (and shadow clipping works), but it will not self-shadow or receive\n * shadows.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshMatcapMaterial\n */\nclass MeshMatcapMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh matcap material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The matcap map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.matcap = null;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineDashedMaterial( {\n * \tcolor: 0xffffff,\n * \tscale: 1,\n * \tdashSize: 3,\n * \tgapSize: 1,\n * } );\n * ```\n *\n * @augments LineBasicMaterial\n */\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\t/**\n\t * Constructs a new line dashed material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\t/**\n\t\t * The scale of the dashed part of a line.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The size of the dash. This is both the gap with the stroke.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.dashSize = 3;\n\n\t\t/**\n\t\t * The size of the gap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Converts an array to a specific type.\n *\n * @param {TypedArray|Array} array - The array to convert.\n * @param {TypedArray.constructor} type - The constructor of a typed array that defines the new type.\n * @return {TypedArray} The converted array.\n */\nfunction convertArray( array, type ) {\n\n\tif ( ! array || array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\n/**\n * Returns an array by which times and values can be sorted.\n *\n * @param {Array} times - The keyframe time values.\n * @return {Array} The array.\n */\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n/**\n * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n *\n * @param {Array} values - The values to sort.\n * @param {number} stride - The stride.\n * @param {Array} order - The sort order.\n * @return {Array} The sorted values.\n */\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Used for parsing AOS keyframe formats.\n *\n * @param {Array} jsonKeys - A list of JSON keyframes.\n * @param {Array} times - This array will be filled with keyframe times by this function.\n * @param {Array} values - This array will be filled with keyframe values by this function.\n * @param {string} valuePropertyName - The name of the property to use.\n */\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\n/**\n * Creates a new clip, containing only the segment of the original clip between the given frames.\n *\n * @param {AnimationClip} sourceClip - The values to sort.\n * @param {string} name - The name of the clip.\n * @param {number} startFrame - The start frame.\n * @param {number} endFrame - The end frame.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The new sub clip.\n */\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\n/**\n * Converts the keyframes of the given animation clip to an additive format.\n *\n * @param {AnimationClip} targetClip - The clip to make additive.\n * @param {number} [referenceFrame=0] - The reference frame.\n * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The updated clip which is now additive.\n */\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\n/**\n * A class with various methods to assist with animations.\n *\n * @hideconstructor\n */\nclass AnimationUtils {\n\n\t/**\n\t * Converts an array to a specific type\n\t *\n\t * @static\n\t * @param {TypedArray|Array} array - The array to convert.\n\t * @param {TypedArray.constructor} type - The constructor of a type array.\n\t * @return {TypedArray} The converted array\n\t */\n\tstatic convertArray( array, type ) {\n\n\t\treturn convertArray( array, type );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object is a typed array.\n\t *\n\t * @static\n\t * @param {any} object - The object to check.\n\t * @return {boolean} Whether the given object is a typed array.\n\t */\n\tstatic isTypedArray( object ) {\n\n\t\treturn isTypedArray( object );\n\n\t}\n\n\t/**\n\t * Returns an array by which times and values can be sorted.\n\t *\n\t * @static\n\t * @param {Array} times - The keyframe time values.\n\t * @return {Array} The array.\n\t */\n\tstatic getKeyframeOrder( times ) {\n\n\t\treturn getKeyframeOrder( times );\n\n\t}\n\n\t/**\n\t * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n\t *\n\t * @static\n\t * @param {Array} values - The values to sort.\n\t * @param {number} stride - The stride.\n\t * @param {Array} order - The sort order.\n\t * @return {Array} The sorted values.\n\t */\n\tstatic sortedArray( values, stride, order ) {\n\n\t\treturn sortedArray( values, stride, order );\n\n\t}\n\n\t/**\n\t * Used for parsing AOS keyframe formats.\n\t *\n\t * @static\n\t * @param {Array} jsonKeys - A list of JSON keyframes.\n\t * @param {Array} times - This array will be filled with keyframe times by this method.\n\t * @param {Array} values - This array will be filled with keyframe values by this method.\n\t * @param {string} valuePropertyName - The name of the property to use.\n\t */\n\tstatic flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tflattenJSON( jsonKeys, times, values, valuePropertyName );\n\n\t}\n\n\t/**\n\t * Creates a new clip, containing only the segment of the original clip between the given frames.\n\t *\n\t * @static\n\t * @param {AnimationClip} sourceClip - The values to sort.\n\t * @param {string} name - The name of the clip.\n\t * @param {number} startFrame - The start frame.\n\t * @param {number} endFrame - The end frame.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The new sub clip.\n\t */\n\tstatic subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\treturn subclip( sourceClip, name, startFrame, endFrame, fps );\n\n\t}\n\n\t/**\n\t * Converts the keyframes of the given animation clip to an additive format.\n\t *\n\t * @static\n\t * @param {AnimationClip} targetClip - The clip to make additive.\n\t * @param {number} [referenceFrame=0] - The reference frame.\n\t * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The updated clip which is now additive.\n\t */\n\tstatic makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\treturn makeClipAdditive( targetClip, referenceFrame, referenceClip, fps );\n\n\t}\n\n}\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\n/**\n * Represents s a timed sequence of keyframes, which are composed of lists of\n * times and related values, and which are used to animate a specific property\n * of an object.\n */\nclass KeyframeTrack {\n\n\t/**\n\t * Constructs a new keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\t/**\n\t\t * The track's name can refer to morph targets or bones or\n\t\t * possibly other values within an animated object. See {@link PropertyBinding#parseTrackName}\n\t\t * for the forms of strings that can be parsed for property binding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The keyframe times.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\n\t\t/**\n\t\t * The keyframe values.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t/**\n\t * Converts the keyframe track to JSON.\n\t *\n\t * @static\n\t * @param {KeyframeTrack} track - The keyframe track to serialize.\n\t * @return {Object} The serialized keyframe track as JSON.\n\t */\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Factory method for creating a new discrete interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {DiscreteInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new linear interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {LinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new smooth interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {CubicInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Defines the interpolation factor method for this keyframe track.\n\t *\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\twarn( 'KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current interpolation type.\n\t *\n\t * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type.\n\t */\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the value size.\n\t *\n\t * @return {number} The value size.\n\t */\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t/**\n\t * Moves all keyframes either forward or backward in time.\n\t *\n\t * @param {number} timeOffset - The offset to move the time values.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scale all keyframe times by a factor (useful for frame - seconds conversions).\n\t *\n\t * @param {number} timeScale - The time scale.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes keyframes before and after animation without changing any values within the defined time range.\n\t *\n\t * Note: The method does not shift around keys to the start of the track time, because for interpolated\n\t * keys this will change their values\n\t *\n\t * @param {number} startTime - The start time.\n\t * @param {number} endTime - The end time.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on the keyframe track. Returns `true` if the values\n\t * are valid.\n\t *\n\t * @return {boolean} Whether the keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\terror( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\terror( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\terror( 'KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes this keyframe track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new keyframe track with copied values from this instance.\n\t *\n\t * @return {KeyframeTrack} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default ''\n */\nKeyframeTrack.prototype.ValueTypeName = '';\n\n/**\n * The time buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateLinear\n */\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A track for boolean keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new boolean keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for color keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new color keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A track for numeric keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new number keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A track for Quaternion keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new Quaternion keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n\t/**\n\t * Overwritten so the method returns Quaternion based interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {QuaternionLinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for string keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new string keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nStringKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for vector keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new vector keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\n/**\n * A reusable set of keyframe tracks which represent an animation.\n */\nclass AnimationClip {\n\n\t/**\n\t * Constructs a new animation clip.\n\t *\n\t * Note: Instead of instantiating an AnimationClip directly with the constructor, you can\n\t * use the static interface of this class for creating clips. In most cases though, animation clips\n\t * will automatically be created by loaders when importing animated 3D assets.\n\t *\n\t * @param {string} [name=''] - The clip's name.\n\t * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed,\n\t * the duration will be calculated from the passed keyframes.\n\t * @param {Array} tracks - An array of keyframe tracks.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation\n\t * is blended/combined when two or more animations are simultaneously played.\n\t */\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\t/**\n\t\t * The clip's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * An array of keyframe tracks.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The clip's duration in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\t/**\n\t\t * The UUID of the animation clip.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the animation clip.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an animation clip from the given JSON.\n\t *\n\t * @static\n\t * @param {Object} json - The serialized animation clip.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes the given animation clip into JSON.\n\t *\n\t * @static\n\t * @param {AnimationClip} clip - The animation clip to serialize.\n\t * @return {Object} The JSON object.\n\t */\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip from the passed morph targets array of a\n\t * geometry, taking a name and the number of frames per second.\n\t *\n\t * Note: The fps parameter is required, but the animation speed can be\n\t * overridden via {@link AnimationAction#setDuration}.\n\t *\n\t * @static\n\t * @param {string} name - The name of the animation clip.\n\t * @param {Array} morphTargetSequence - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\t/**\n\t * Searches for an animation clip by name, taking as its first parameter\n\t * either an array of clips, or a mesh or geometry that contains an\n\t * array named \"animations\" property.\n\t *\n\t * @static\n\t * @param {(Array|Object3D)} objectOrClipArray - The array or object to search through.\n\t * @param {string} name - The name to search for.\n\t * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found.\n\t */\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns an array of new AnimationClips created from the morph target\n\t * sequences of a geometry, trying to sort morph target names into\n\t * animation-group-based patterns like \"Walk_001, Walk_002, Run_001, Run_002...\".\n\t *\n\t * See {@link MD2Loader#parse} as an example for how the method should be used.\n\t *\n\t * @static\n\t * @param {Array} morphTargets - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {Array} An array of new animation clips.\n\t */\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t/**\n\t * Parses the `animation.hierarchy` format and returns a new animation clip.\n\t *\n\t * @static\n\t * @deprecated since r175.\n\t * @param {Object} animation - A serialized animation clip as JSON.\n\t * @param {Array} bones - An array of bones.\n\t * @return {?AnimationClip} The new animation clip.\n\t */\n\tstatic parseAnimation( animation, bones ) {\n\n\t\twarn( 'AnimationClip: parseAnimation() is deprecated and will be removed with r185' );\n\n\t\tif ( ! animation ) {\n\n\t\t\terror( 'AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Sets the duration of this clip to the duration of its longest keyframe track.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Trims all tracks to the clip's duration.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on each track in the clip. Returns `true` if all\n\t * tracks are valid.\n\t *\n\t * @return {boolean} Whether the clip's keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes each track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip with copied values from this instance.\n\t *\n\t * @return {AnimationClip} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes this animation clip into JSON.\n\t *\n\t * @return {Object} The JSON object.\n\t */\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A simple caching system, used internally by {@link FileLoader}.\n * To enable caching across all loaders that use {@link FileLoader}, add `THREE.Cache.enabled = true.` once in your app.\n * @hideconstructor\n */\nconst Cache = {\n\n\t/**\n\t * Whether caching is enabled or not.\n\t *\n\t * @static\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenabled: false,\n\n\t/**\n\t * A dictionary that holds cached files.\n\t *\n\t * @static\n\t * @type {Object}\n\t */\n\tfiles: {},\n\n\t/**\n\t * Adds a cache entry with a key to reference the file. If this key already\n\t * holds a file, it is overwritten.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @param {Object} file - The file to be cached.\n\t */\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\t/**\n\t * Gets the cached value for the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned.\n\t */\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\t/**\n\t * Removes the cached file associated with the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t */\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\t/**\n\t * Remove all values from the cache.\n\t *\n\t * @static\n\t */\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n *\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n *\n * ```js\n * const manager = new THREE.LoadingManager();\n * manager.onLoad = () => console.log( 'Loading complete!' );\n *\n * const loader1 = new OBJLoader( manager );\n * const loader2 = new ColladaLoader( manager );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t *\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\n\t\t/**\n\t\t * Used for aborting ongoing requests in loaders using this manager.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController | null}\n\t\t */\n\t\tthis._abortController = null;\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t * @return {string} The resolved URL.\n\t\t */\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t *\n\t\t * ```js\n\t\t * const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};\n\t\t *\n\t\t * const manager = new THREE.LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier( ( url ) => {\n\t\t *\n\t\t * \turl = URL.createObjectURL( blobs[ url ] );\n\t\t * \tobjectURLs.push( url );\n\t\t * \treturn url;\n\t\t *\n\t\t * } );\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader( manager );\n\t\t * loader.load( 'fish.gltf', (gltf) => {\n\t\t *\n\t\t * \tscene.add( gltf.scene );\n\t\t * \tobjectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );\n\t\t *\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @param {function(string):string} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Registers a loader with the given regular expression. Can be used to\n\t\t * define what loader should be used in order to load specific files. A\n\t\t * typical use case is to overwrite the default loader for textures.\n\t\t *\n\t\t * ```js\n\t\t * // add handler for TGA textures\n\t\t * manager.addHandler( /\\.tga$/i, new TGALoader() );\n\t\t * ```\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @param {Loader} loader - A loader that should handle matched cases.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Removes the loader for the given regular expression.\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to retrieve the registered loader for the given file path.\n\t\t *\n\t\t * @param {string} file - The file path.\n\t\t * @return {?Loader} The registered loader. Returns `null` if no loader was found.\n\t\t */\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to abort ongoing loading requests in loaders using this manager.\n\t\t * The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`\n\t\t * is supported in the browser.\n\t\t *\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.abort = function () {\n\n\n\t\t\tthis.abortController.abort();\n\t\t\tthis._abortController = null;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}\n\n\t// TODO: Revert this back to a single member variable once this issue has been fixed\n\t// https://github.com/cloudflare/workerd/issues/3657\n\n\t/**\n\t * Used for aborting ongoing requests in loaders using this manager.\n\t *\n\t * @type {AbortController}\n\t */\n\tget abortController() {\n\n\t\tif ( ! this._abortController ) {\n\n\t\t\tthis._abortController = new AbortController();\n\n\t\t}\n\n\t\treturn this._abortController;\n\n\t}\n\n}\n\n/**\n * The global default loading manager.\n *\n * @constant\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @abstract\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @abstract\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method can be implemented in loaders for aborting ongoing requests.\n\t *\n\t * @abstract\n\t * @return {Loader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n *\n * This loader supports caching. If you want to use it, add `THREE.Cache.enabled = true;`\n * once to your application.\n *\n * ```js\n * const loader = new THREE.FileLoader();\n * const data = await loader.loadAsync( 'example.txt' );\n * ```\n *\n * @augments Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The expected mime type. Valid values can be found\n\t\t * [here](hhttps://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#mimetype)\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.mimeType = '';\n\n\t\t/**\n\t\t * The expected response type.\n\t\t *\n\t\t * @type {('arraybuffer'|'blob'|'document'|'json'|'')}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(any)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @return {any|undefined} The cached resource if available.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( `file:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\twarn( 'FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === '' ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( `file:${url}`, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t *\n\t * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t *\n\t * @param {string} value - The mime type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {FileLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Class for loading animation clips in the JSON format. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.AnimationLoader();\n * const animations = await loader.loadAsync( 'animations/animation.js' );\n * ```\n *\n * @augments Loader\n */\nclass AnimationLoader extends Loader {\n\n\t/**\n\t * Constructs a new animation loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded animations as an array\n\t * holding instances of {@link AnimationClip} to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Array)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns an array of animation clips.\n\t *\n\t * @param {Object} json - The serialized animation clips.\n\t * @return {Array} The parsed animation clips.\n\t */\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading compressed texture formats S3TC, ASTC or ETC.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass CompressedTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new compressed texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded compressed texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CompressedTexture} The compressed texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nconst _loading = new WeakMap();\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n *\n * ```js\n * const loader = new THREE.ImageLoader();\n * const image = await loader.loadAsync( 'image.png' );\n * ```\n * Please note that `ImageLoader` has dropped support for progress\n * events in `r84`. For an `ImageLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639).\n *\n * @augments Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Image)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Image} The image.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tif ( cached.complete === true ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tlet arr = _loading.get( cached );\n\n\t\t\t\tif ( arr === undefined ) {\n\n\t\t\t\t\tarr = [];\n\t\t\t\t\t_loading.set( cached, arr );\n\n\t\t\t\t}\n\n\t\t\t\tarr.push( { onLoad, onError } );\n\n\t\t\t}\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onLoad ) callback.onLoad( this );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tCache.remove( `image:${url}` );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tCache.add( `image:${url}`, image );\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\n/**\n * Class for loading cube textures. Images are internally loaded via {@link ImageLoader}.\n *\n * The loader returns an instance of {@link CubeTexture} and expects the cube map to\n * be defined as six separate images representing the sides of a cube. Other cube map definitions\n * like vertical and horizontal cross, column and row layouts are not supported.\n *\n * Note that, by convention, cube maps are specified in a coordinate system\n * in which positive-x is to the right when looking up the positive-z axis --\n * in other words, using a left-handed coordinate system. Since three.js uses\n * a right-handed coordinate system, environment maps used in three.js will\n * have pos-x and neg-x swapped.\n *\n * The loaded cube texture is in sRGB color space. Meaning {@link Texture#colorSpace}\n * is set to `SRGBColorSpace` by default.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader().setPath( 'textures/cubeMaps/' );\n * const cubeTexture = await loader.loadAsync( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n * scene.background = cubeTexture;\n * ```\n *\n * @augments Loader\n */\nclass CubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded cube texture\n\t * to the `onLoad()` callback. The method also returns a new cube texture object which can\n\t * directly be used for material creation. If you do it this way, the cube texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {Array} urls - Array of 6 URLs to images, one for each side of the\n\t * cube texture. The urls should be specified in the following order: pos-x,\n\t * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading binary texture formats RGBE, EXR or TGA.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass DataTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new data texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded data texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The data texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Class for loading textures. Images are internally\n * loaded via {@link ImageLoader}.\n *\n * ```js\n * const loader = new THREE.TextureLoader();\n * const texture = await loader.loadAsync( 'textures/land_ocean_ice_cloud_2048.jpg' );\n *\n * const material = new THREE.MeshBasicMaterial( { map:texture } );\n * ```\n * Please note that `TextureLoader` has dropped support for progress\n * events in `r84`. For a `TextureLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145).\n *\n * @augments Loader\n */\nclass TextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Texture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Texture} The texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.groundColor = this.groundColor.getHex();\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different light types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The type of shadow texture. The default is `UnsignedByteType`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.mapType = UnsignedByteType;\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix, shadowCamera.coordinateSystem, shadowCamera.reversedDepth );\n\n\t\tif ( shadowCamera.reversedDepth ) {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t}\n\n\t\tshadowMatrix.multiply( _projScreenMatrix );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.needsUpdate = source.needsUpdate;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.blurSamples = source.blurSamples;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t\t/**\n\t\t * Texture aspect ratio.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = ( this.mapSize.width / this.mapSize.height ) * this.aspect;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\t\tthis.map = source.map;\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.distance = this.distance;\n\t\tdata.object.angle = this.angle;\n\t\tdata.object.decay = this.decay;\n\t\tdata.object.penumbra = this.penumbra;\n\n\t\tdata.object.target = this.target.uuid;\n\n\t\tif ( this.map && this.map.isTexture ) data.object.map = this.map.toJSON( meta ).uuid;\n\n\t\tdata.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.distance = this.distance;\n\t\tdata.object.decay = this.decay;\n\n\t\tdata.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection).\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.shadow = this.shadow.toJSON();\n\t\tdata.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); // only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading materials. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.MaterialLoader();\n * const material = await loader.loadAsync( 'material.json' );\n * ```\n * This loader does not support node materials. Use {@link NodeMaterialLoader} instead.\n *\n * @augments Loader\n */\nclass MaterialLoader extends Loader {\n\n\t/**\n\t * Constructs a new material loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A dictionary holding textures used by the material.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.textures = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Material)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a material.\n\t *\n\t * @param {Object} json - The serialized material.\n\t * @return {Material} The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\twarn( 'MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\t\tif ( json.allowOverride !== undefined ) material.allowOverride = json.allowOverride;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Textures are not embedded in the material JSON so they have\n\t * to be injected before the loading process starts.\n\t *\n\t * @param {Object} value - A dictionary holding textures for material properties.\n\t * @return {MaterialLoader} A reference to this material loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @static\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\n/**\n * A class with loader utility functions.\n */\nclass LoaderUtils {\n\n\t/**\n\t * Extracts the base URL from the given URL.\n\t *\n\t * @param {string} url -The URL to extract the base URL from.\n\t * @return {string} The extracted base URL.\n\t */\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\t/**\n\t * Resolves relative URLs against the given path. Absolute paths, data urls,\n\t * and blob URLs will be returned as is. Invalid URLs will return an empty\n\t * string.\n\t *\n\t * @param {string} url -The URL to resolve.\n\t * @param {string} path - The base path for relative URLs to be resolved against.\n\t * @return {string} The resolved URL.\n\t */\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\n/**\n * An instanced version of a geometry.\n */\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new instanced buffer geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\n\t\t/**\n\t\t * The instance count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.BufferGeometryLoader();\n * const geometry = await loader.loadAsync( 'models/json/pressure.json' );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );\n * const object = new THREE.Mesh( geometry, material );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass BufferGeometryLoader extends Loader {\n\n\t/**\n\t * Constructs a new geometry loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a geometry.\n\t *\n\t * @param {Object} json - The serialized geometry.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tgeometry.boundingSphere = new Sphere().fromJSON( boundingSphere );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * A loader for loading a JSON resource in the [JSON Object/Scene format](https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4).\n * The files are internally loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.ObjectLoader();\n * const obj = await loader.loadAsync( 'models/json/example.json' );\n * scene.add( obj );\n *\n * // Alternatively, to parse a previously loaded JSON structure\n * const object = await loader.parseAsync( a_json_object );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass ObjectLoader extends Loader {\n\n\t/**\n\t * Constructs a new object loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#load}.\n\t *\n\t * @async\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves with the loaded 3D object.\n\t */\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\t/**\n\t * Parses the given JSON. This is used internally by {@link ObjectLoader#load}\n\t * but can also be used directly to parse a previously loaded JSON structure.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded.\n\t * @return {Object3D} The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#parse}.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @return {Promise} A Promise that resolves with the parsed 3D object.\n\t */\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\t// internals\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( `ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\twarn( 'ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\twarn( 'ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tconst sh = new SphericalHarmonics3().fromArray( data.sh );\n\t\t\t\tobject = new LightProbe( sh, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._geometryInfo = data.geometryInfo.map( info => {\n\n\t\t\t\t\tlet box = null;\n\t\t\t\t\tlet sphere = null;\n\t\t\t\t\tif ( info.boundingBox !== undefined ) {\n\n\t\t\t\t\t\tbox = new Box3().fromJSON( info.boundingBox );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( info.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\tsphere = new Sphere().fromJSON( info.boundingSphere );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...info,\n\t\t\t\t\t\tboundingBox: box,\n\t\t\t\t\t\tboundingSphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\t\t\t\tobject._instanceInfo = data.instanceInfo;\n\n\t\t\t\tobject._availableInstanceIds = data._availableInstanceIds;\n\t\t\t\tobject._availableGeometryIds = data._availableGeometryIds;\n\n\t\t\t\tobject._nextIndexStart = data.nextIndexStart;\n\t\t\t\tobject._nextVertexStart = data.nextVertexStart;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tobject._indirectTexture = getTexture( data.indirectTexture.uuid );\n\n\t\t\t\tif ( data.colorsTexture !== undefined ) {\n\n\t\t\t\t\tobject._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingSphere !== undefined ) {\n\n\t\t\t\t\tobject.boundingSphere = new Sphere().fromJSON( data.boundingSphere );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingBox !== undefined ) {\n\n\t\t\t\t\tobject.boundingBox = new Box3().fromJSON( data.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nconst _errorMap = new WeakMap();\n\n/**\n * A loader for loading images as an [ImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap).\n * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare\n * textures for rendering.\n *\n * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps.\n * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.\n *\n * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.\n *\n * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.\n *\n * ```js\n * const loader = new THREE.ImageBitmapLoader();\n * loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed\n * const imageBitmap = await loader.loadAsync( 'image.png' );\n *\n * const texture = new THREE.Texture( imageBitmap );\n * texture.needsUpdate = true;\n * ```\n *\n * @augments Loader\n */\nclass ImageBitmapLoader extends Loader {\n\n\t/**\n\t * Constructs a new image bitmap loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\t/**\n\t\t * Represents the loader options.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {premultiplyAlpha:'none'}\n\t\t */\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Sets the given loader options. The structure of the object must match the `options` parameter of\n\t * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).\n\t *\n\t * @param {Object} options - The loader options to set.\n\t * @return {ImageBitmapLoader} A reference to this image bitmap loader.\n\t */\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {ImageBitmap|undefined} The image bitmap.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image-bitmap:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\t// check if there is an error for the cached promise\n\n\t\t\t\t\tif ( _errorMap.has( cached ) === true ) {\n\n\t\t\t\t\t\tif ( onError ) onError( _errorMap.get( cached ) );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t\treturn imageBitmap;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\t\tfetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( `image-bitmap:${url}`, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\t_errorMap.set( promise, e );\n\n\t\t\tCache.remove( `image-bitmap:${url}` );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( `image-bitmap:${url}`, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {ImageBitmapLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\n/**\n * Class for loading audio buffers. Audios are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const audioListener = new THREE.AudioListener();\n * const ambientSound = new THREE.Audio( audioListener );\n *\n * const loader = new THREE.AudioLoader();\n * const audioBuffer = await loader.loadAsync( 'audio/ambient_ocean.ogg' );\n *\n * ambientSound.setBuffer( audioBuffer );\n * ambientSound.play();\n * ```\n *\n * @augments Loader\n */\nclass AudioLoader extends Loader {\n\n\t/**\n\t * Constructs a new audio loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded audio buffer\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\terror( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph](https://en.wikipedia.org/wiki/Anaglyph_3D) or\n * [Parallax Barrier](https://en.wikipedia.org/wiki/parallax_barrier).\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * Whether this camera is used with multiview rendering or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isMultiViewCamera = false;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\n/**\n * Class for keeping track of time.\n */\nclass Clock {\n\n\t/**\n\t * Constructs a new clock.\n\t *\n\t * @param {boolean} [autoStart=true] - Whether to automatically start the clock when\n\t * `getDelta()` is called for the first time.\n\t */\n\tconstructor( autoStart = true ) {\n\n\t\t/**\n\t\t * If set to `true`, the clock starts automatically when `getDelta()` is called\n\t\t * for the first time.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoStart = autoStart;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()` method was last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.startTime = 0;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()`, `getElapsedTime()` or\n\t\t * `getDelta()` methods were last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.oldTime = 0;\n\n\t\t/**\n\t\t * Keeps track of the total time that the clock has been running.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.elapsedTime = 0;\n\n\t\t/**\n\t\t * Whether the clock is running or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.running = false;\n\n\t}\n\n\t/**\n\t * Starts the clock. When `autoStart` is set to `true`, the method is automatically\n\t * called by the class.\n\t */\n\tstart() {\n\n\t\tthis.startTime = performance.now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\t/**\n\t * Stops the clock.\n\t */\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time.\n\t */\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\t/**\n\t * Returns the delta time in seconds.\n\t *\n\t * @return {number} The delta time.\n\t */\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = performance.now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\n\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _up = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@link AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {?AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t// the initial forward and up directions must be orthogonal\n\t\t_forward.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\t\t_up.set( 0, 1, 0 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _forward.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _forward.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _forward.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( _up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( _up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( _up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API](https://www.w3.org/TR/webaudio-1.1/).\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\twarn( 'Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\twarn( 'Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener – i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype)\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\n/**\n * Buffered scene graph property that allows weighted accumulation; used internally.\n */\nclass PropertyMixer {\n\n\t/**\n\t * Constructs a new property mixer.\n\t *\n\t * @param {PropertyBinding} binding - The property binding.\n\t * @param {string} typeName - The keyframe track type name.\n\t * @param {number} valueSize - The keyframe track value size.\n\t */\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\t/**\n\t\t * The property binding.\n\t\t *\n\t\t * @type {PropertyBinding}\n\t\t */\n\t\tthis.binding = binding;\n\n\t\t/**\n\t\t * The keyframe track value size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeight = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.useCount = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `accu`.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t * @param {number} weight - The weight.\n\t */\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `add`.\n\t *\n\t * @param {number} weight - The weight.\n\t */\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t/**\n\t * Applies the state of `accu` to the binding when accus differ.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t */\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Remembers the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t/**\n\t * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding.\n\t */\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t// internals\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\n\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n */\nclass PropertyBinding {\n\n\t/**\n\t * Constructs a new property binding.\n\t *\n\t * @param {Object} rootNode - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t */\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\t/**\n\t\t * The object path to the animated property.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = path;\n\n\t\t/**\n\t\t * An object holding information about the path.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\t/**\n\t\t * The object owns the animated property.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\t/**\n\t\t * The root node.\n\t\t *\n\t\t * @type {Object3D|Skeleton}\n\t\t */\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\t/**\n\t * Factory method for creating a property binding from the given parameters.\n\t *\n\t * @static\n\t * @param {Object} root - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t * @return {PropertyBinding|Composite} The created property binding or composite.\n\t */\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name - Node name to be sanitized.\n\t * @return {string} The sanitized node name.\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\t/**\n\t * Parses the given track name (an object path to an animated property) and\n\t * returns an object with information about the path. Matches strings in the following forms:\n\t *\n\t * - nodeName.property\n\t * - nodeName.property[accessor]\n\t * - nodeName.material.property[accessor]\n\t * - uuid.property[accessor]\n\t * - uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t * - parentName/nodeName.property\n\t * - parentName/parentName/nodeName.property[index]\n\t * - .bone[Armature.DEF_cog].position\n\t * - scene:helium_balloon_model:helium_balloon_model.position\n\t *\n\t * @static\n\t * @param {string} trackName - The track name to parse.\n\t * @return {Object} The parsed track name as an object.\n\t */\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\t/**\n\t * Searches for a node in the hierarchy of the given root object by the given\n\t * node name.\n\t *\n\t * @static\n\t * @param {Object} root - The root object.\n\t * @param {string|number} nodeName - The name of the node.\n\t * @return {?Object} The found node. Returns `null` if no object was found.\n\t */\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t/**\n\t * Creates a getter / setter pair for the property tracked by this binding.\n\t */\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\twarn( 'PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\terror( 'PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\t/**\n\t * Unbinds the property.\n\t */\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n * - Instead pass this object as 'root'.\n * - You can also add and remove objects later when the mixer is running.\n *\n * Note:\n *\n * - Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the all objects in the group.\n * - A single property can either be controlled through a target group or directly, but not both.\n */\nclass AnimationObjectGroup {\n\n\t/**\n\t * Constructs a new animation group.\n\t *\n\t * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Adds an arbitrary number of objects to this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to add.\n\t */\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\terror( 'AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Removes an arbitrary number of objects to this animation group\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to remove.\n\t */\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for the passed 3D objects of this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to uncache.\n\t */\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * An instance of `AnimationAction` schedules the playback of an animation which is\n * stored in {@link AnimationClip}.\n */\nclass AnimationAction {\n\n\t/**\n\t * Constructs a new animation action.\n\t *\n\t * @param {AnimationMixer} mixer - The mixer that is controlled by this action.\n\t * @param {AnimationClip} clip - The animation clip that holds the actual keyframes.\n\t * @param {?Object3D} [localRoot=null] - The root object on which this action is performed.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t */\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\t/**\n\t\t * The loop mode, set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * @type {(LoopRepeat|LoopOnce|LoopPingPong)}\n\t\t * @default LoopRepeat\n\t\t */\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t/**\n\t\t * The local time of this action (in seconds, starting with `0`).\n\t\t *\n\t\t * The value gets clamped or wrapped to `[0,clip.duration]` (according to the\n\t\t * loop state).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * Scaling factor for the {@link AnimationAction#time}. A value of `0` causes the\n\t\t * animation to pause. Negative values cause the animation to play backwards.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval `[0, 1]`). Values\n\t\t * between `0` (no impact) and `1` (full impact) can be used to blend between\n\t\t * several actions.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\t/**\n\t\t * The number of repetitions of the performed clip over the course of this action.\n\t\t * Can be set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * Setting this number has no effect if {@link AnimationAction#loop} is set to\n\t\t * `THREE:LoopOnce`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.repetitions = Infinity;\n\n\t\t/**\n\t\t * If set to `true`, the playback of the action is paused.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.paused = false;\n\n\t\t/**\n\t\t * If set to `false`, the action is disabled so it has no impact.\n\t\t *\n\t\t * When the action is re-enabled, the animation continues from its current\n\t\t * time (setting `enabled` to `false` doesn't reset the action).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to true the animation will automatically be paused on its last frame.\n\t\t *\n\t\t * If set to false, {@link AnimationAction#enabled} will automatically be switched\n\t\t * to `false` when the last loop of the action has finished, so that this action has\n\t\t * no further impact.\n\t\t *\n\t\t * Note: This member has no impact if the action is interrupted (it\n\t\t * has only an effect if its last loop has really finished).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clampWhenFinished = false;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtStart = true;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtEnd = true;\n\n\t}\n\n\t/**\n\t * Starts the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\t/**\n\t * Resets the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\t/**\n\t * Returns `true` if the animation is running.\n\t *\n\t * @return {boolean} Whether the animation is running or not.\n\t */\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Returns `true` when {@link AnimationAction#play} has been called.\n\t *\n\t * @return {boolean} Whether the animation is scheduled or not.\n\t */\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Defines the time when the animation should start.\n\t *\n\t * @param {number} time - The start time in seconds.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configures the loop settings for this action.\n\t *\n\t * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode.\n\t * @param {number} repetitions - The number of repetitions.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective weight of this action.\n\t *\n\t * An action has no effect and thus an effective weight of zero when the\n\t * action is disabled.\n\t *\n\t * @param {number} weight - The weight to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t/**\n\t * Returns the effective weight of this action.\n\t *\n\t * @return {number} The effective weight.\n\t */\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\t/**\n\t * Fades the animation in by increasing its weight gradually from `0` to `1`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\t/**\n\t * Fades the animation out by decreasing its weight gradually from `1` to `0`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\t/**\n\t * Causes this action to fade in and the given action to fade out,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeOutAction - The animation action to fade out.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeFrom( fadeOutAction, duration, warp = false ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp === true ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Causes this action to fade out and the given action to fade in,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeInAction - The animation action to fade in.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeTo( fadeInAction, duration, warp = false ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\t/**\n\t * Stops any fading which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective time scale of this action.\n\t *\n\t * An action has no effect and thus an effective time scale of zero when the\n\t * action is paused.\n\t *\n\t * @param {number} timeScale - The time scale to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Returns the effective time scale of this action.\n\t *\n\t * @return {number} The effective time scale.\n\t */\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\t/**\n\t * Sets the duration for a single loop of this action.\n\t *\n\t * @param {number} duration - The duration to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Synchronizes this action with the passed other action.\n\t *\n\t * @param {AnimationAction} action - The action to sync with.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Decelerates this animation's speed to `0` within the passed time interval.\n\t *\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\t/**\n\t * Changes the playback speed, within the passed time interval, by modifying\n\t * {@link AnimationAction#timeScale} gradually from `startTimeScale` to\n\t * `endTimeScale`.\n\t *\n\t * @param {number} startTimeScale - The start time scale.\n\t * @param {number} endTimeScale - The end time scale.\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops any scheduled warping which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the animation mixer of this animation action.\n\t *\n\t * @return {AnimationMixer} The animation mixer.\n\t */\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\t/**\n\t * Returns the animation clip of this animation action.\n\t *\n\t * @return {AnimationClip} The animation clip.\n\t */\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\t/**\n\t * Returns the root object of this animation action.\n\t *\n\t * @return {Object3D} The root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n/**\n * `AnimationMixer` is a player for animations on a particular object in\n * the scene. When multiple objects in the scene are animated independently,\n * one `AnimationMixer` may be used for each object.\n */\nclass AnimationMixer extends EventDispatcher {\n\n\t/**\n\t * Constructs a new animation mixer.\n\t *\n\t * @param {Object3D} root - The object whose animations shall be played by this mixer.\n\t */\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\t/**\n\t\t * The global mixer time (in seconds; starting with `0` on the mixer's creation).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * A scaling factor for the global time.\n\t\t *\n\t\t * Note: Setting this member to `0` and later back to `1` is a\n\t\t * possibility to pause/unpause all actions that are controlled by this\n\t\t * mixer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link AnimationAction} for the passed clip.\n\t *\n\t * If an action fitting the clip and root parameters doesn't yet exist, it\n\t * will be created by this method. Calling this method several times with the\n\t * same clip and root parameters always returns the same action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t * @return {?AnimationAction} The animation action.\n\t */\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t/**\n\t * Returns an existing animation action for the passed clip.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @return {?AnimationAction} The animation action. Returns `null` if no action was found.\n\t */\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Deactivates all previously scheduled actions on this mixer.\n\t *\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t *\n\t * This is usually done in the render loop by passing the delta\n\t * time from {@link Clock} or {@link Timer}.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the global mixer to a specific time and updates the animation accordingly.\n\t *\n\t * This is useful when you need to jump to an exact time in an animation. The\n\t * input parameter will be scaled by {@link AnimationMixer#timeScale}\n\t *\n\t * @param {number} time - The time to set in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tsetTime( time ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( time ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t/**\n\t * Returns this mixer's root object.\n\t *\n\t * @return {Object3D} The mixer's root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a clip. Before using this method make\n\t * sure to call {@link AnimationAction#stop} for all related actions.\n\t *\n\t * @param {AnimationClip} clip - The clip to uncache.\n\t */\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a root object. Before using this\n\t * method make sure to call {@link AnimationAction#stop} for all related\n\t * actions or alternatively {@link AnimationMixer#stopAllAction} when the\n\t * mixer operates on a single root.\n\t *\n\t * @param {Object3D} root - The root object to uncache.\n\t */\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for an action. The action is identified by the\n\t * given clip and an optional root object. Before using this method make\n\t * sure to call {@link AnimationAction#stop} to deactivate the action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t */\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a 3D render target.\n *\n * @augments RenderTarget\n */\nclass RenderTarget3D extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform which is a global shader variable. They are passed to shader programs.\n *\n * When declaring a uniform of a {@link ShaderMaterial}, it is declared by value or by object.\n * ```js\n * uniforms: {\n * \ttime: { value: 1.0 },\n * \tresolution: new Uniform( new Vector2() )\n * };\n * ```\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {any} value - The uniform value.\n\t */\n\tconstructor( value ) {\n\n\t\t/**\n\t\t * The uniform value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns a new uniform with copied values from this instance.\n\t * If the value has a `clone()` method, the value is cloned as well.\n\t *\n\t * @return {Uniform} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\n/**\n * A class for managing multiple uniforms in a single group. The renderer will process\n * such a definition as a single UBO.\n *\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n *\n * @augments EventDispatcher\n */\nclass UniformsGroup extends EventDispatcher {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name UniformsGroup#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\t/**\n\t\t * The name of the uniforms group.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer usage.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * An array holding the uniforms.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds the given uniform to this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given uniform from this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name of this uniforms group.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the usage of this uniforms group.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Copies the values of the given uniforms group to this instance.\n\t *\n\t * @param {UniformsGroup} source - The uniforms group to copy.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new uniforms group with copied values from this instance.\n\t *\n\t * @return {UniformsGroup} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * An instanced version of an interleaved buffer.\n *\n * @augments InterleavedBuffer\n */\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\t/**\n\t * Constructs a new instanced interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated.\n\t */\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated,\n\t\t * see {@link InstancedBufferAttribute#meshPerAttribute}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\n/**\n * An alternative version of a buffer attribute with more control over the VBO.\n *\n * The renderer does not construct a VBO for this kind of attribute. Instead, it uses\n * whatever VBO is passed in constructor and can later be altered via the `buffer` property.\n *\n * The most common use case for this class is when some kind of GPGPU calculation interferes\n * or even produces the VBOs in question.\n *\n * Notice that this class can only be used with {@link WebGLRenderer}.\n */\nclass GLBufferAttribute {\n\n\t/**\n\t * Constructs a new GL buffer attribute.\n\t *\n\t * @param {WebGLBuffer} buffer - The native WebGL buffer.\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} itemSize - The item size.\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @param {number} count - The expected number of vertices in VBO.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( buffer, type, itemSize, elementSize, count, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGLBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The native WebGL buffer.\n\t\t *\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The native data type.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The corresponding size (in bytes) for the given `type` parameter.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.elementSize = elementSize;\n\n\t\t/**\n\t\t * The expected number of vertices in VBO.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `buffer` contains data of `gl.UNSIGNED_SHORT`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the buffer data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the given native WebGL buffer.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given native data type and element size.\n\t *\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the item size.\n\t *\n\t * @param {number} itemSize - The item size.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the count (the expected number of vertices in VBO).\n\t *\n\t * @param {number} count - The count.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t * @param {number} [near=0] - All results returned are further away than near. Near can't be negative.\n\t * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near.\n\t */\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t *\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray( origin, direction );\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * All results returned are closer than far. Far can't be lower than near.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * The camera to use when raycasting against view-dependent objects such as\n\t\t * billboarded objects like sprites. This field can be set manually or\n\t\t * is set when calling `setFromCamera()`.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * Allows to selectively ignore 3D objects when performing intersection tests.\n\t\t * The following code example ensures that only 3D objects on layer `1` will be\n\t\t * honored by raycaster.\n\t\t * ```js\n\t\t * raycaster.layers.set( 1 );\n\t\t * object.layers.enable( 1 );\n\t\t * ```\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\n\t\t/**\n\t\t * A parameter object that configures the raycasting. It has the structure:\n\t\t *\n\t\t * ```\n\t\t * {\n\t\t * \tMesh: {},\n\t\t * \tLine: { threshold: 1 },\n\t\t * \tLOD: {},\n\t\t * \tPoints: { threshold: 1 },\n\t\t * \tSprite: {}\n\t\t * }\n\t\t * ```\n\t\t * Where `threshold` is the precision of the raycaster when intersecting objects, in world units.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera - The camera from which the ray should originate.\n\t */\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\terror( 'Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the given WebXR controller to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {WebXRController} controller - The controller to copy the position and direction from.\n\t * @return {Raycaster} A reference to this raycaster.\n\t */\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The intersection point of a raycaster intersection test.\n\t * @typedef {Object} Raycaster~Intersection\n\t * @property {number} distance - The distance from the ray's origin to the intersection point.\n\t * @property {number} distanceToRay - Some 3D objects e.g. {@link Points} provide the distance of the\n\t * intersection to the nearest point on the ray. For other objects it will be `undefined`.\n\t * @property {Vector3} point - The intersection point, in world coordinates.\n\t * @property {Object} face - The face that has been intersected.\n\t * @property {number} faceIndex - The face index.\n\t * @property {Object3D} object - The 3D object that has been intersected.\n\t * @property {Vector2} uv - U,V coordinates at point of intersection.\n\t * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection.\n\t * @property {Vector3} normal - Interpolated normal vector at point of intersection.\n\t * @property {number} instanceId - The index number of the instance where the ray\n\t * intersects the {@link InstancedMesh}.\n\t */\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when\n\t * evaluating whether the ray intersects the object or not. This allows meshes to respond\n\t * differently to ray casting than lines or points.\n\t *\n\t * Note that for meshes, faces must be pointed towards the origin of the ray in order\n\t * to be detected; intersections of the ray passing through the back of a face will not\n\t * be detected. To raycast against both faces of an object, you'll want to set {@link Material#side}\n\t * to `THREE.DoubleSide`.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * @param {Array} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n */\nclass Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = performance.now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect( document ) {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif ( document.hidden !== undefined ) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind( this );\n\n\t\t\tdocument.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._pageVisibilityHandler !== null ) {\n\n\t\t\tthis._document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta() {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed() {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale() {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale( timescale ) {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset() {\n\n\t\tthis._currentTime = performance.now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate( timestamp ) {\n\n\t\tif ( this._pageVisibilityHandler !== null && this._document.hidden === true ) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;\n\n\t\t\tthis._delta = ( this._currentTime - this._previousTime ) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction handleVisibilityChange() {\n\n\tif ( this._document.hidden === false ) this.reset();\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The y value.\n\t * @param {number} z - The z value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates](https://en.wikipedia.org/wiki/Cylindrical_coordinate_system).\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n * 21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n * 12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nconst _d1 = /*@__PURE__*/ new Vector3();\nconst _d2 = /*@__PURE__*/ new Vector3();\nconst _r = /*@__PURE__*/ new Vector3();\nconst _c1 = /*@__PURE__*/ new Vector3();\nconst _c2 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closest point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns the closest squared distance between this line segment and the given one.\n\t *\n\t * @param {Line3} line - The line segment to compute the closest squared distance to.\n\t * @param {Vector3} [c1] - The closest point on this line segment.\n\t * @param {Vector3} [c2] - The closest point on the given line segment.\n\t * @return {number} The squared distance between this line segment and the given one.\n\t */\n\tdistanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {\n\n\t\t// from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9\n\n\t\t// Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and\n\t\t// S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared\n\t\t// distance between between S1(s) and S2(t)\n\n\t\tconst EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length\n\t\tlet s, t;\n\n\t\tconst p1 = this.start;\n\t\tconst p2 = line.start;\n\t\tconst q1 = this.end;\n\t\tconst q2 = line.end;\n\n\t\t_d1.subVectors( q1, p1 ); // Direction vector of segment S1\n\t\t_d2.subVectors( q2, p2 ); // Direction vector of segment S2\n\t\t_r.subVectors( p1, p2 );\n\n\t\tconst a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative\n\t\tconst e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative\n\t\tconst f = _d2.dot( _r );\n\n\t\t// Check if either or both segments degenerate into points\n\n\t\tif ( a <= EPSILON && e <= EPSILON ) {\n\n\t\t\t// Both segments degenerate into points\n\n\t\t\tc1.copy( p1 );\n\t\t\tc2.copy( p2 );\n\n\t\t\tc1.sub( c2 );\n\n\t\t\treturn c1.dot( c1 );\n\n\t\t}\n\n\t\tif ( a <= EPSILON ) {\n\n\t\t\t// First segment degenerates into a point\n\n\t\t\ts = 0;\n\t\t\tt = f / e; // s = 0 => t = (b*s + f) / e = f / e\n\t\t\tt = clamp( t, 0, 1 );\n\n\n\t\t} else {\n\n\t\t\tconst c = _d1.dot( _r );\n\n\t\t\tif ( e <= EPSILON ) {\n\n\t\t\t\t// Second segment degenerates into a point\n\n\t\t\t\tt = 0;\n\t\t\t\ts = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a\n\n\t\t\t} else {\n\n\t\t\t\t// The general nondegenerate case starts here\n\n\t\t\t\tconst b = _d1.dot( _d2 );\n\t\t\t\tconst denom = a * e - b * b; // Always nonnegative\n\n\t\t\t\t// If segments not parallel, compute closest point on L1 to L2 and\n\t\t\t\t// clamp to segment S1. Else pick arbitrary s (here 0)\n\n\t\t\t\tif ( denom !== 0 ) {\n\n\t\t\t\t\ts = clamp( ( b * f - c * e ) / denom, 0, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ts = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Compute point on L2 closest to S1(s) using\n\t\t\t\t// t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e\n\n\t\t\t\tt = ( b * s + f ) / e;\n\n\t\t\t\t// If t in [0,1] done. Else clamp t, recompute s for the new value\n\t\t\t\t// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a\n\t\t\t\t// and clamp s to [0, 1]\n\n\t\t\t\tif ( t < 0 ) {\n\n\t\t\t\t\tt = 0.;\n\t\t\t\t\ts = clamp( - c / a, 0, 1 );\n\n\t\t\t\t} else if ( t > 1 ) {\n\n\t\t\t\t\tt = 1;\n\t\t\t\t\ts = clamp( ( b - c ) / a, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tc1.copy( p1 ).add( _d1.multiplyScalar( s ) );\n\t\tc2.copy( p2 ).add( _d2.multiplyScalar( t ) );\n\n\t\tc1.sub( c2 );\n\n\t\treturn c1.dot( c1 );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new skeleton helper.\n\t *\n\t * @param {Object3D} object - Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * The list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t// colors\n\n\t\tconst color1 = new Color( 0x0000ff );\n\t\tconst color2 = new Color( 0x00ff00 );\n\n\t\tthis.setColors( color1, color2 );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} color1 - The first line color for each bone.\n\t * @param {Color} color2 - The second line color for each bone.\n\t * @return {SkeletonHelper} A reference to this helper.\n\t */\n\tsetColors( color1, color2 ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tfor ( let i = 0; i < colorAttribute.count; i += 2 ) {\n\n\t\t\tcolorAttribute.setXYZ( i, color1.r, color1.g, color1.b );\n\t\t\tcolorAttribute.setXYZ( i + 1, color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {PointLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] - The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example](https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html).\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t * @return {CameraHelper} A reference to this helper.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\tlet nearZ, farZ;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\n\t\tif ( this.camera.reversedDepth === true ) {\n\n\t\t\tnearZ = 1;\n\t\t\tfarZ = 0;\n\n\t\t} else {\n\n\t\t\tif ( this.camera.coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tnearZ = -1;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else if ( this.camera.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tnearZ = 0;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.CameraHelper.update(): Invalid coordinate system: ' + this.camera.coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, farZ );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, farZ );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, farZ );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, farZ );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, farZ );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, farZ );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, farZ );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, farZ );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, farZ );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = 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 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = 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 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new ConeGeometry( 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t *\n\t * @param {HTMLElement} element - The DOM element to connect to.\n\t */\n\tconnect( element ) {\n\n\t\tif ( element === undefined ) {\n\n\t\t\twarn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.domElement !== null ) this.disconnect();\n\n\t\tthis.domElement = element;\n\n\t}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\tcase R11_EAC_Format:\n\t\tcase SIGNED_R11_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\tcase RG11_EAC_Format:\n\t\tcase SIGNED_RG11_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\tcase UnsignedInt101111Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\twarn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeDepthTexture, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, FrustumArray, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NormalGAPacking, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, R11_EAC_Format, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, error, getByteLength, getConsoleFunction, getUnlitUniformColorSpace, isTypedArray, log, mergeUniforms, probeAsync, setConsoleFunction, warn, warnOnce };\n", "/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, Float32BufferAttribute, RawShaderMaterial, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, CubeTexture, Data3DTexture, GreaterEqualCompare, LessEqualCompare, DepthTexture, Texture, GLSL3, VSMShadowMap, PCFShadowMap, AddOperation, MixOperation, MultiplyOperation, LinearTransfer, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, RGFormat, Frustum, MeshDepthMaterial, MeshDistanceMaterial, PCFSoftShadowMap, DepthFormat, NearestFilter, CubeDepthTexture, UnsignedIntType, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NoNormalPacking, NormalAnimationBlendMode, NormalGAPacking, NormalRGPacking, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBADepthPacking, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js';\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float 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_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + 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 = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\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\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_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\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar 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; }\\nvec3 pow2( const in vec3 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 max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\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 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};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\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}\\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}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.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\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\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\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_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 ), cubeUV_m0, CUBEUV_MAX_MIP );\\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\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( 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 sRGBTransferOETF( 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}\";\n\nvar 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, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\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\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\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\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\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\";\n\nvar 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\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar 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 vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\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 vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\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}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\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 getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.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 getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.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 getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.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 vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.metalness = metalnessFactor;\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\\n\\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = vec3( 0.04 );\\n\\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).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_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"uniform sampler2D dfgLUT;\\nstruct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 diffuseContribution;\\n\\tvec3 specularColor;\\n\\tvec3 specularColorBlended;\\n\\tfloat roughness;\\n\\tfloat metalness;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t\\tvec3 iridescenceFresnelDielectric;\\n\\t\\tvec3 iridescenceFresnelMetallic;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_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}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn v;\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColorBlended;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * 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 * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat rInv = 1.0 / ( roughness + 0.1 );\\n\\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\\n\\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\\n\\tfloat DG = exp( a * dotNV + b );\\n\\treturn saturate( DG );\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\\n\\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\\n\\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\\n\\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\\n\\tfloat Ess_V = dfgV.x + dfgV.y;\\n\\tfloat Ess_L = dfgL.x + dfgL.y;\\n\\tfloat Ems_V = 1.0 - Ess_V;\\n\\tfloat Ems_L = 1.0 - Ess_L;\\n\\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\\n\\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\\n\\tfloat compensationFactor = Ems_V * Ems_L;\\n\\tvec3 multiScatter = Fms * compensationFactor;\\n\\treturn singleScatter + multiScatter;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\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.roughness;\\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( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n \\n \\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n \\n \\t\\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n \\t\\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\\n \\n \\t\\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\\n \\n \\t\\tirradiance *= sheenEnergyComp;\\n \\n \\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t\\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\\n\\t\\tdiffuse *= sheenEnergyComp;\\n\\t#endif\\n\\treflectedLight.indirectDiffuse += diffuse;\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\\n \\t#endif\\n\\tvec3 singleScatteringDielectric = vec3( 0.0 );\\n\\tvec3 multiScatteringDielectric = vec3( 0.0 );\\n\\tvec3 singleScatteringMetallic = vec3( 0.0 );\\n\\tvec3 multiScatteringMetallic = vec3( 0.0 );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\\n\\t#endif\\n\\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\\n\\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\\n\\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\\n\\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\tvec3 indirectSpecular = radiance * singleScattering;\\n\\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t\\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\\n\\t\\tindirectSpecular *= sheenEnergyComp;\\n\\t\\tindirectDiffuse *= sheenEnergyComp;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += indirectSpecular;\\n\\treflectedLight.indirectDiffuse += indirectDiffuse;\\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}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\\n\\t\\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\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\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\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\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\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 ], geometryNormal );\\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\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).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( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#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\nvar normal_pars_vertex = \"#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\nvar normal_vertex = \"#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\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.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 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar 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.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in 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( const in 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 depth, const in float near, const in float far ) {\\n\\treturn depth * ( 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 depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar 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\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\t#else\\n\\t\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\t#endif\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\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\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\t#else\\n\\t\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\t#endif\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\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\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\t#elif defined( SHADOWMAP_TYPE_BASIC )\\n\\t\\t\\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\t#endif\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\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\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\tfloat interleavedGradientNoise( vec2 position ) {\\n\\t\\t\\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\\n\\t\\t}\\n\\t\\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\\n\\t\\t\\tconst float goldenAngle = 2.399963229728653;\\n\\t\\t\\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\\n\\t\\t\\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\\n\\t\\t\\treturn vec2( cos( theta ), sin( theta ) ) * r;\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\t\\tfloat shadow = 1.0;\\n\\t\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\t\\tshadowCoord.z += shadowBias;\\n\\t\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\t\\tif ( frustumTest ) {\\n\\t\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\t\\tfloat radius = shadowRadius * texelSize.x;\\n\\t\\t\\t\\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\\n\\t\\t\\t\\t) * 0.2;\\n\\t\\t\\t}\\n\\t\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t\\t}\\n\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\t\\tfloat shadow = 1.0;\\n\\t\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\t\\tshadowCoord.z += shadowBias;\\n\\t\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\t\\tif ( frustumTest ) {\\n\\t\\t\\t\\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\\n\\t\\t\\t\\tfloat mean = distribution.x;\\n\\t\\t\\t\\tfloat variance = distribution.y * distribution.y;\\n\\t\\t\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\t\\t\\tfloat hard_shadow = step( mean, shadowCoord.z );\\n\\t\\t\\t\\t#else\\n\\t\\t\\t\\t\\tfloat hard_shadow = step( shadowCoord.z, mean );\\n\\t\\t\\t\\t#endif\\n\\t\\t\\t\\tif ( hard_shadow == 1.0 ) {\\n\\t\\t\\t\\t\\tshadow = 1.0;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tvariance = max( variance, 0.0000001 );\\n\\t\\t\\t\\t\\tfloat d = shadowCoord.z - mean;\\n\\t\\t\\t\\t\\tfloat p_max = variance / ( variance + d * d );\\n\\t\\t\\t\\t\\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\\n\\t\\t\\t\\t\\tshadow = max( hard_shadow, p_max );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t\\t}\\n\\t#else\\n\\t\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\t\\tfloat shadow = 1.0;\\n\\t\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\t\\tshadowCoord.z += shadowBias;\\n\\t\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\t\\tif ( frustumTest ) {\\n\\t\\t\\t\\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\\n\\t\\t\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\t\\t\\tshadow = step( depth, shadowCoord.z );\\n\\t\\t\\t\\t#else\\n\\t\\t\\t\\t\\tshadow = step( shadowCoord.z, depth );\\n\\t\\t\\t\\t#endif\\n\\t\\t\\t}\\n\\t\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tvec3 absVec = abs( lightToPosition );\\n\\t\\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\\n\\t\\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\\n\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tfloat texelSize = shadowRadius / shadowMapSize.x;\\n\\t\\t\\tvec3 absDir = abs( bd3D );\\n\\t\\t\\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\\n\\t\\t\\ttangent = normalize( cross( bd3D, tangent ) );\\n\\t\\t\\tvec3 bitangent = cross( bd3D, tangent );\\n\\t\\t\\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) +\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) +\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) +\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) +\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).y ) * texelSize, dp ) )\\n\\t\\t\\t) * 0.2;\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\t#elif defined( SHADOWMAP_TYPE_BASIC )\\n\\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tvec3 absVec = abs( lightToPosition );\\n\\t\\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\\n\\t\\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\\n\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tfloat depth = textureCube( shadowMap, bd3D ).r;\\n\\t\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\t\\tshadow = step( depth, dp );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = step( dp, depth );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\t#endif\\n\\t#endif\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#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 shadowIntensity;\\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\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\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 shadowIntensity;\\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\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar 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.shadowIntensity, 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.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\\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.shadowIntensity, 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}\";\n\nvar 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\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar 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\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar 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 saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( 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( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.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}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"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}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$g = \"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}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"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}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#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#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}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\\n\\t#else\\n\\t\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\\n\\t#endif\\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#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\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_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#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 \\n#include \\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\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 = vec4( dist, 0.0, 0.0, 1.0 );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\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\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$b = \"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 \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#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#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\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\\t#include \\n\\t#include \\n}\";\n\nconst fragment$a = \"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\\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\\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\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\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\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\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 \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\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\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\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\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\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\\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\\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#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\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#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#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\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\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#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\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\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\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\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 \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\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\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n \\n\\t\\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\\n \\n \\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\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\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#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 \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\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 + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include \\n\\t#include \\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}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#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}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"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[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\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}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistance_vert: vertex$d,\n\tdistance_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n// Uniforms library for shared webgl shaders\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\t\tdfgLUT: { value: null } // DFG LUT for physically-based rendering\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistance: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distance_vert,\n\t\tfragmentShader: ShaderChunk.distance_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\twarn( 'WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\tconst samples = gl.getParameter( gl.SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tmaxSamples: maxSamples,\n\n\t\tsamples: samples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 256;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._backgroundBox = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.position=origin] - The position of the internal cube camera that renders the scene.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tthis._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\t// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tif ( reversedDepthBuffer ) {\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t}\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = ggxMaterial.uniforms;\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.0 + targetRoughness * 1.25;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = adjustedRoughness;\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = 0.0; // Direct copy\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'PMREMGGXConvolution',\n\n\t\tdefines: {\n\t\t\t'GGX_SAMPLES': GGX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'roughness': { value: 0.0 },\n\t\t\t'mipInt': { value: 0 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// \"Sampling the GGX Distribution of Visible Normals\"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\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#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}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\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\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\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`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tconst extension = gl.getExtension( name );\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nconst toneMappingMap = {\n\t[ LinearToneMapping ]: 'LINEAR_TONE_MAPPING',\n\t[ ReinhardToneMapping ]: 'REINHARD_TONE_MAPPING',\n\t[ CineonToneMapping ]: 'CINEON_TONE_MAPPING',\n\t[ ACESFilmicToneMapping ]: 'ACES_FILMIC_TONE_MAPPING',\n\t[ AgXToneMapping ]: 'AGX_TONE_MAPPING',\n\t[ NeutralToneMapping ]: 'NEUTRAL_TONE_MAPPING',\n\t[ CustomToneMapping ]: 'CUSTOM_TONE_MAPPING'\n};\n\nfunction WebGLOutput( type, width, height, depth, stencil ) {\n\n\t// render targets for scene and post-processing\n\tconst targetA = new WebGLRenderTarget( width, height, {\n\t\ttype: type,\n\t\tdepthBuffer: depth,\n\t\tstencilBuffer: stencil\n\t} );\n\n\tconst targetB = new WebGLRenderTarget( width, height, {\n\t\ttype: HalfFloatType,\n\t\tdepthBuffer: false,\n\t\tstencilBuffer: false\n\t} );\n\n\t// create fullscreen triangle geometry\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ -1, 3, 0, -1, -1, 0, 3, -1, 0 ], 3 ) );\n\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t// create output material with tone mapping support\n\tconst material = new RawShaderMaterial( {\n\t\tuniforms: {\n\t\t\ttDiffuse: { value: null }\n\t\t},\n\t\tvertexShader: /* glsl */`\n\t\t\tprecision highp float;\n\n\t\t\tuniform mat4 modelViewMatrix;\n\t\t\tuniform mat4 projectionMatrix;\n\n\t\t\tattribute vec3 position;\n\t\t\tattribute vec2 uv;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main() {\n\t\t\t\tvUv = uv;\n\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t}`,\n\t\tfragmentShader: /* glsl */`\n\t\t\tprecision highp float;\n\n\t\t\tuniform sampler2D tDiffuse;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\t#include \n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}`,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\t} );\n\n\tconst mesh = new Mesh( geometry, material );\n\tconst camera = new OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n\tlet _outputColorSpace = null;\n\tlet _outputToneMapping = null;\n\tlet _isCompositing = false;\n\tlet _savedToneMapping;\n\tlet _savedRenderTarget = null;\n\tlet _effects = [];\n\tlet _hasRenderPass = false;\n\n\tthis.setSize = function ( width, height ) {\n\n\t\ttargetA.setSize( width, height );\n\t\ttargetB.setSize( width, height );\n\n\t\tfor ( let i = 0; i < _effects.length; i ++ ) {\n\n\t\t\tconst effect = _effects[ i ];\n\t\t\tif ( effect.setSize ) effect.setSize( width, height );\n\n\t\t}\n\n\t};\n\n\tthis.setEffects = function ( effects ) {\n\n\t\t_effects = effects;\n\t\t_hasRenderPass = _effects.length > 0 && _effects[ 0 ].isRenderPass === true;\n\n\t\tconst width = targetA.width;\n\t\tconst height = targetA.height;\n\n\t\tfor ( let i = 0; i < _effects.length; i ++ ) {\n\n\t\t\tconst effect = _effects[ i ];\n\t\t\tif ( effect.setSize ) effect.setSize( width, height );\n\n\t\t}\n\n\t};\n\n\tthis.begin = function ( renderer, renderTarget ) {\n\n\t\t// Don't begin during compositing phase (post-processing effects call render())\n\t\tif ( _isCompositing ) return false;\n\n\t\tif ( renderer.toneMapping === NoToneMapping && _effects.length === 0 ) return false;\n\n\t\t_savedRenderTarget = renderTarget;\n\n\t\t// resize internal buffers to match render target (e.g. XR resolution)\n\t\tif ( renderTarget !== null ) {\n\n\t\t\tconst width = renderTarget.width;\n\t\t\tconst height = renderTarget.height;\n\n\t\t\tif ( targetA.width !== width || targetA.height !== height ) {\n\n\t\t\t\tthis.setSize( width, height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if first effect is a RenderPass, it will set its own render target\n\t\tif ( _hasRenderPass === false ) {\n\n\t\t\trenderer.setRenderTarget( targetA );\n\n\t\t}\n\n\t\t// disable tone mapping during render - it will be applied in end()\n\t\t_savedToneMapping = renderer.toneMapping;\n\t\trenderer.toneMapping = NoToneMapping;\n\n\t\treturn true;\n\n\t};\n\n\tthis.hasRenderPass = function () {\n\n\t\treturn _hasRenderPass;\n\n\t};\n\n\tthis.end = function ( renderer, deltaTime ) {\n\n\t\t// restore tone mapping\n\t\trenderer.toneMapping = _savedToneMapping;\n\n\t\t_isCompositing = true;\n\n\t\t// run post-processing effects\n\t\tlet readBuffer = targetA;\n\t\tlet writeBuffer = targetB;\n\n\t\tfor ( let i = 0; i < _effects.length; i ++ ) {\n\n\t\t\tconst effect = _effects[ i ];\n\n\t\t\tif ( effect.enabled === false ) continue;\n\n\t\t\teffect.render( renderer, writeBuffer, readBuffer, deltaTime );\n\n\t\t\tif ( effect.needsSwap !== false ) {\n\n\t\t\t\tconst temp = readBuffer;\n\t\t\t\treadBuffer = writeBuffer;\n\t\t\t\twriteBuffer = temp;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// update output material defines if settings changed\n\t\tif ( _outputColorSpace !== renderer.outputColorSpace || _outputToneMapping !== renderer.toneMapping ) {\n\n\t\t\t_outputColorSpace = renderer.outputColorSpace;\n\t\t\t_outputToneMapping = renderer.toneMapping;\n\n\t\t\tmaterial.defines = {};\n\n\t\t\tif ( ColorManagement.getTransfer( _outputColorSpace ) === SRGBTransfer ) material.defines.SRGB_TRANSFER = '';\n\n\t\t\tconst toneMapping = toneMappingMap[ _outputToneMapping ];\n\t\t\tif ( toneMapping ) material.defines[ toneMapping ] = '';\n\n\t\t\tmaterial.needsUpdate = true;\n\n\t\t}\n\n\t\t// final output to canvas (or XR render target)\n\t\tmaterial.uniforms.tDiffuse.value = readBuffer.texture;\n\t\trenderer.setRenderTarget( _savedRenderTarget );\n\t\trenderer.render( mesh, camera );\n\n\t\t_savedRenderTarget = null;\n\t\t_isCompositing = false;\n\n\t};\n\n\tthis.isCompositing = function () {\n\n\t\treturn _isCompositing;\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\ttargetA.dispose();\n\t\ttargetB.dispose();\n\t\tgeometry.dispose();\n\t\tmaterial.dispose();\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = textures.isReversedDepthBuffer() ? GreaterEqualCompare : LessEqualCompare;\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture2D, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t\t// Sort uniforms to prioritize shadow samplers first (for optimal texture unit allocation)\n\n\t\tconst shadowSamplers = [];\n\t\tconst otherUniforms = [];\n\n\t\tfor ( const u of this.seq ) {\n\n\t\t\tif ( u.type === gl.SAMPLER_2D_SHADOW || u.type === gl.SAMPLER_CUBE_SHADOW || u.type === gl.SAMPLER_2D_ARRAY_SHADOW ) {\n\n\t\t\t\tshadowSamplers.push( u );\n\n\t\t\t} else {\n\n\t\t\t\totherUniforms.push( u );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( shadowSamplers.length > 0 ) {\n\n\t\t\tthis.seq = shadowSamplers.concat( otherUniforms );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\tconst errors = shaderInfoLog.trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nconst toneMappingFunctions = {\n\t[ LinearToneMapping ]: 'Linear',\n\t[ ReinhardToneMapping ]: 'Reinhard',\n\t[ CineonToneMapping ]: 'Cineon',\n\t[ ACESFilmicToneMapping ]: 'ACESFilmic',\n\t[ AgXToneMapping ]: 'AgX',\n\t[ NeutralToneMapping ]: 'Neutral',\n\t[ CustomToneMapping ]: 'Custom'\n};\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tconst toneMappingName = toneMappingFunctions[ toneMapping ];\n\n\tif ( toneMappingName === undefined ) {\n\n\t\twarn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\treturn 'vec3 ' + functionName + '( vec3 color ) { return LinearToneMapping( color ); }';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// log( 'WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\twarn( 'WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#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;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nconst shadowMapTypeDefines = {\n\t[ PCFShadowMap ]: 'SHADOWMAP_TYPE_PCF',\n\t[ VSMShadowMap ]: 'SHADOWMAP_TYPE_VSM'\n};\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\treturn shadowMapTypeDefines[ parameters.shadowMapType ] || 'SHADOWMAP_TYPE_BASIC';\n\n}\n\nconst envMapTypeDefines = {\n\t[ CubeReflectionMapping ]: 'ENVMAP_TYPE_CUBE',\n\t[ CubeRefractionMapping ]: 'ENVMAP_TYPE_CUBE',\n\t[ CubeUVReflectionMapping ]: 'ENVMAP_TYPE_CUBE_UV'\n};\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tif ( parameters.envMap === false ) return 'ENVMAP_TYPE_CUBE';\n\n\treturn envMapTypeDefines[ parameters.envMapMode ] || 'ENVMAP_TYPE_CUBE';\n\n}\n\nconst envMapModeDefines = {\n\t[ CubeRefractionMapping ]: 'ENVMAP_MODE_REFRACTION'\n};\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tif ( parameters.envMap === false ) return 'ENVMAP_MODE_REFLECTION';\n\n\treturn envMapModeDefines[ parameters.envMapMode ] || 'ENVMAP_MODE_REFLECTION';\n\n}\n\nconst envMapBlendingDefines = {\n\t[ MultiplyOperation ]: 'ENVMAP_BLENDING_MULTIPLY',\n\t[ MixOperation ]: 'ENVMAP_BLENDING_MIX',\n\t[ AddOperation ]: 'ENVMAP_BLENDING_ADD'\n};\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tif ( parameters.envMap === false ) return 'ENVMAP_BLENDING_NONE';\n\n\treturn envMapBlendingDefines[ parameters.combine ] || 'ENVMAP_BLENDING_NONE';\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// log( '*VERTEX*', vertexGlsl );\n\t// log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( program ) || '';\n\t\t\tconst vertexShaderInfoLog = gl.getShaderInfoLog( glVertexShader ) || '';\n\t\t\tconst fragmentShaderInfoLog = gl.getShaderInfoLog( glFragmentShader ) || '';\n\n\t\t\tconst programLog = programInfoLog.trim();\n\t\t\tconst vertexLog = vertexShaderInfoLog.trim();\n\t\t\tconst fragmentLog = fragmentShaderInfoLog.trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\tconst programsMap = new Map();\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distance',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\twarn( 'WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: ( material.flatShading === true && material.wireframe === false ),\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reversedDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program = programsMap.get( cacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t++ program.usedTimes;\n\n\t\t} else {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t\tprogramsMap.set( cacheKey, program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Remove from map\n\t\t\tprogramsMap.delete( program.cacheKey );\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tlet shadowMap = null;\n\n\t\t\tif ( light.shadow && light.shadow.map ) {\n\n\t\t\t\tif ( light.shadow.map.texture.format === RGFormat ) {\n\n\t\t\t\t\t// VSM uses color texture with blurred mean/std_dev\n\t\t\t\t\tshadowMap = light.shadow.map.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Other types use depth texture\n\t\t\t\t\tshadowMap = light.shadow.map.depthTexture || light.shadow.map.texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\\n\\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\\n}\";\n\nconst _cubeDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ),\n\t/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, -1 )\n];\n\nconst _cubeUps = [\n\t/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ),\n\t/*@__PURE__*/ new Vector3( 0, 0, -1 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 )\n];\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial(),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tif ( lights.type === PCFSoftShadowMap ) {\n\n\t\t\twarn( 'WebGLShadowMap: PCFSoftShadowMap has been deprecated. Using PCFShadowMap instead.' );\n\t\t\tlights.type = PCFShadowMap;\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\n\t\tif ( _state.buffers.depth.getReversed() === true ) {\n\n\t\t\t_state.buffers.color.setClear( 0, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\n\t\t}\n\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst typeChanged = _previousType !== this.type;\n\n\t\t// When shadow map type changes, materials need recompilation because sampler types change\n\t\t// (sampler2DShadow for PCF vs sampler2D for Basic)\n\t\tif ( typeChanged ) {\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( object.material ) {\n\n\t\t\t\t\tif ( Array.isArray( object.material ) ) {\n\n\t\t\t\t\t\tobject.material.forEach( mat => mat.needsUpdate = true );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.material.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\twarn( 'WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || typeChanged === true ) {\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tif ( shadow.map.depthTexture !== null ) {\n\n\t\t\t\t\t\tshadow.map.depthTexture.dispose();\n\t\t\t\t\t\tshadow.map.depthTexture = null;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.type === VSMShadowMap ) {\n\n\t\t\t\t\tif ( light.isPointLight ) {\n\n\t\t\t\t\t\twarn( 'WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.' );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, {\n\t\t\t\t\t\tformat: RGFormat,\n\t\t\t\t\t\ttype: HalfFloatType,\n\t\t\t\t\t\tminFilter: LinearFilter,\n\t\t\t\t\t\tmagFilter: LinearFilter,\n\t\t\t\t\t\tgenerateMipmaps: false\n\t\t\t\t\t} );\n\t\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\t\t// Native depth texture for VSM - depth is captured here, then blurred into the color texture\n\t\t\t\t\tshadow.map.depthTexture = new DepthTexture( _shadowMapSize.x, _shadowMapSize.y, FloatType );\n\t\t\t\t\tshadow.map.depthTexture.name = light.name + '.shadowMapDepth';\n\t\t\t\t\tshadow.map.depthTexture.format = DepthFormat;\n\t\t\t\t\tshadow.map.depthTexture.compareFunction = null; // For regular sampling (not shadow comparison)\n\t\t\t\t\tshadow.map.depthTexture.minFilter = NearestFilter;\n\t\t\t\t\tshadow.map.depthTexture.magFilter = NearestFilter;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( light.isPointLight ) {\n\n\t\t\t\t\t\tshadow.map = new WebGLCubeRenderTarget( _shadowMapSize.x );\n\t\t\t\t\t\tshadow.map.depthTexture = new CubeDepthTexture( _shadowMapSize.x, UnsignedIntType );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\t\t\t\t\t\tshadow.map.depthTexture = new DepthTexture( _shadowMapSize.x, _shadowMapSize.y, UnsignedIntType );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadow.map.depthTexture.name = light.name + '.shadowMap';\n\t\t\t\t\tshadow.map.depthTexture.format = DepthFormat;\n\n\t\t\t\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\t\t\t\tif ( this.type === PCFShadowMap ) {\n\n\t\t\t\t\t\tshadow.map.depthTexture.compareFunction = reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare;\n\t\t\t\t\t\tshadow.map.depthTexture.minFilter = LinearFilter;\n\t\t\t\t\t\tshadow.map.depthTexture.magFilter = LinearFilter;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshadow.map.depthTexture.compareFunction = null;\n\t\t\t\t\t\tshadow.map.depthTexture.minFilter = NearestFilter;\n\t\t\t\t\t\tshadow.map.depthTexture.magFilter = NearestFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t// For cube render targets (PointLights), render all 6 faces. Otherwise, render once.\n\t\t\tconst faceCount = shadow.map.isWebGLCubeRenderTarget ? 6 : 1;\n\n\t\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t// For cube render targets, render to each face separately\n\t\t\t\tif ( shadow.map.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\trenderer.setRenderTarget( shadow.map, face );\n\t\t\t\t\trenderer.clear();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// For 2D render targets, use viewports\n\t\t\t\t\tif ( face === 0 ) {\n\n\t\t\t\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\t\t\t\trenderer.clear();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst viewport = shadow.getViewport( face );\n\n\t\t\t\t\t_viewport.set(\n\t\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t\t);\n\n\t\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\t}\n\n\t\t\t\tif ( light.isPointLight ) {\n\n\t\t\t\t\tconst camera = shadow.camera;\n\t\t\t\t\tconst shadowMatrix = shadow.matrix;\n\n\t\t\t\t\tconst far = light.distance || camera.far;\n\n\t\t\t\t\tif ( far !== camera.far ) {\n\n\t\t\t\t\t\tcamera.far = far;\n\t\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t\t_lookTarget.copy( camera.position );\n\t\t\t\t\t_lookTarget.add( _cubeDirections[ face ] );\n\t\t\t\t\tcamera.up.copy( _cubeUps[ face ] );\n\t\t\t\t\tcamera.lookAt( _lookTarget );\n\t\t\t\t\tcamera.updateMatrixWorld();\n\n\t\t\t\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t\t\tshadow._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t}\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, {\n\t\t\t\tformat: RGFormat,\n\t\t\t\ttype: HalfFloatType\n\t\t\t} );\n\n\t\t}\n\n\t\t// vertical pass - read from native depth texture\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.depthTexture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ||\n\t\t\t\t( material.alphaToCoverage === true ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = ( material.alphaToCoverage === true ) ? 0.5 : material.alphaTest; // approximate alphaToCoverage by using a fixed alphaTest value\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentReversed = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( reversed ) {\n\n\t\t\t\tif ( currentReversed !== reversed ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReversed = reversed;\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn currentReversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentReversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( currentReversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\tcurrentReversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\twarn( 'WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\twarn( 'WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\t\t\tif ( glType === _gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = _gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\twarn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\twarn( 'WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isCubeDepthTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\twarn( 'WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction getRow( index, rowLength, componentStride ) {\n\n\t\treturn Math.floor( Math.floor( index / componentStride ) / rowLength );\n\n\t}\n\n\tfunction updateTexture( texture, image, glFormat, glType ) {\n\n\t\tconst componentStride = 4; // only RGBA supported\n\n\t\tconst updateRanges = texture.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.texSubImage2D`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// Only merge if in the same row and overlapping/adjacent\n\t\t\t\tconst previousEnd = previousRange.start + previousRange.count;\n\t\t\t\tconst currentRow = getRow( range.start, image.width, componentStride );\n\t\t\t\tconst previousRow = getRow( previousRange.start, image.width, componentStride );\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif (\n\t\t\t\t\trange.start <= previousEnd + 1 &&\n\t\t\t\t\tcurrentRow === previousRow &&\n\t\t\t\t\tgetRow( range.start + range.count - 1, image.width, componentStride ) === currentRow // ensure range doesn't spill\n\t\t\t\t) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst pixelStart = Math.floor( range.start / componentStride );\n\t\t\t\tconst pixelCount = Math.ceil( range.count / componentStride );\n\n\t\t\t\tconst x = pixelStart % image.width;\n\t\t\t\tconst y = Math.floor( pixelStart / image.width );\n\n\t\t\t\t// Assumes update ranges refer to contiguous memory\n\t\t\t\tconst width = pixelCount;\n\t\t\t\tconst height = 1;\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, x );\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, y );\n\n\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t\ttexture.clearUpdateRanges();\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tupdateTexture( texture, image, glFormat, glType );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, useMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisample ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget, cubeFace ) {\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( isCube ) {\n\n\t\t\t// For cube depth textures, initialize and bind without uploading image data\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\t\t\t\trenderTarget.depthTexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t}\n\n\t\t\t// Only create and allocate storage once\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.depthTexture );\n\n\t\t\t\t// Allocate storage for all 6 faces with correct depth texture format\n\t\t\t\tconst glFormat = utils.convert( renderTarget.depthTexture.format );\n\t\t\t\tconst glType = utils.convert( renderTarget.depthTexture.type );\n\n\t\t\t\t// Use proper internal format for depth textures\n\t\t\t\tlet glInternalFormat;\n\t\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t}\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tconst glTextureType = isCube ? _gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace : _gl.TEXTURE_2D;\n\t\tconst glAttachmentType = renderTarget.depthTexture.format === DepthStencilFormat ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\t// For cube render targets with depth texture, setup each face\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindTexture( glTextureType, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( glTextureType, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\twarn( 'WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\terror( 'WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n\tthis.isReversedDepthBuffer = function () {\n\n\t\treturn state.buffers.depth.getReversed();\n\n\t};\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format || p === R11_EAC_Format || p === SIGNED_R11_EAC_Format || p === RG11_EAC_Format || p === SIGNED_RG11_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\t\t\t\tif ( p === R11_EAC_Format ) return extension.COMPRESSED_R11_EAC;\n\t\t\t\tif ( p === SIGNED_R11_EAC_Format ) return extension.COMPRESSED_SIGNED_R11_EAC;\n\t\t\t\tif ( p === RG11_EAC_Format ) return extension.COMPRESSED_RG11_EAC;\n\t\t\t\tif ( p === SIGNED_RG11_EAC_Format ) return extension.COMPRESSED_SIGNED_RG11_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\n/**\n * A XR module that manages the access to the Depth Sensing API.\n */\nclass WebXRDepthSensing {\n\n\t/**\n\t * Constructs a new depth sensing module.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * An opaque texture representing the depth of the user's environment.\n\t\t *\n\t\t * @type {?ExternalTexture}\n\t\t */\n\t\tthis.texture = null;\n\n\t\t/**\n\t\t * A plane mesh for visualizing the depth texture.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t */\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The depth near value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthNear = 0;\n\n\t\t/**\n\t\t * The depth near far.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthFar = 0;\n\n\t}\n\n\t/**\n\t * Inits the depth sensing module\n\t *\n\t * @param {XRWebGLDepthInformation} depthData - The XR depth data.\n\t * @param {XRRenderState} renderState - The XR render state.\n\t */\n\tinit( depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new ExternalTexture( depthData.texture );\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a plane mesh that visualizes the depth texture.\n\t *\n\t * @param {ArrayCamera} cameraXR - The XR camera.\n\t * @return {?Mesh} The plane mesh.\n\t */\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\t/**\n\t * Resets the module\n\t */\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Returns a texture representing the depth of the user's environment.\n\t *\n\t * @return {?ExternalTexture} The depth texture.\n\t */\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\n/**\n * This class represents an abstraction of the WebXR Device API and is\n * internally used by {@link WebGLRenderer}. `WebXRManager` also provides a public\n * interface that allows users to enable/disable XR and perform XR related\n * tasks like for instance retrieving controllers.\n *\n * @augments EventDispatcher\n * @hideconstructor\n */\nclass WebXRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t */\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst cameraAccessTextures = {};\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\t/**\n\t\t * Whether the manager's XR camera should be automatically updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * This flag notifies the renderer to be ready for XR rendering. Set it to `true`\n\t\t * if you are going to use XR in your app.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether XR presentation is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Returns a group representing the `target ray` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `target ray` space.\n\t\t */\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `grip` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * Note: If you want to show something in the user's hand AND offer a\n\t\t * pointing ray at the same time, you'll want to attached the handheld object\n\t\t * to the group returned by `getControllerGrip()` and the ray to the\n\t\t * group returned by `getController()`. The idea is to have two\n\t\t * different groups in two different coordinate spaces for the same WebXR\n\t\t * controller.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `grip` space.\n\t\t */\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `hand` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `hand` space.\n\t\t */\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\t\t\tfor ( const key in cameraAccessTextures ) {\n\n\t\t\t\tdelete cameraAccessTextures[ key ];\n\n\t\t\t}\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\t/**\n\t\t * Sets the framebuffer scale factor.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {number} value - The framebuffer scale factor.\n\t\t */\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the reference space type. Can be used to configure a spatial relationship with the user's physical\n\t\t * environment. Depending on how the user moves in 3D space, setting an appropriate reference space can\n\t\t * improve tracking. Default is `local-floor`. Valid values can be found here\n\t\t * https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace#reference_space_types.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {string} value - The reference space type.\n\t\t */\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the XR reference space.\n\t\t *\n\t\t * @return {XRReferenceSpace} The XR reference space.\n\t\t */\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom XR reference space.\n\t\t *\n\t\t * @param {XRReferenceSpace} space - The XR reference space.\n\t\t */\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current base layer.\n\t\t *\n\t\t * This is an `XRProjectionLayer` when the targeted XR device supports the\n\t\t * WebXR Layers API, or an `XRWebGLLayer` otherwise.\n\t\t *\n\t\t * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.\n\t\t */\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR binding.\n\t\t *\n\t\t * Creates a new binding if needed and the browser is\n\t\t * capable of doing so.\n\t\t *\n\t\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t\t */\n\t\tthis.getBinding = function () {\n\n\t\t\tif ( glBinding === null && supportsGlBinding ) {\n\n\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t}\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR frame.\n\t\t *\n\t\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR session.\n\t\t *\n\t\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\t/**\n\t\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t\t * is injected into the renderer with this method. This method triggers the start of\n\t\t * the actual XR rendering.\n\t\t *\n\t\t * @async\n\t\t * @param {XRSession} value - The XR session to set.\n\t\t * @return {Promise} A Promise that resolves when the session has been set.\n\t\t */\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! supportsLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = this.getBinding();\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the environment blend mode from the current XR session.\n\t\t *\n\t\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t\t */\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current depth texture computed via depth sensing.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getDepthTexture}.\n\t\t *\n\t\t * @return {?Texture} The depth texture.\n\t\t */\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\t/**\n\t\t * Updates the state of the XR camera. Use this method on app level if you\n\t\t * set `cameraAutoUpdate` to `false`. The method requires the non-XR\n\t\t * camera of the scene as a parameter. The passed in camera's transformation\n\t\t * is automatically adjusted to the position of the XR camera when calling\n\t\t * this method.\n\t\t *\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Returns an instance of {@link ArrayCamera} which represents the XR camera\n\t\t * of the active XR session. For each view it holds a separate camera object.\n\t\t *\n\t\t * The camera's `fov` is currently not used and does not reflect the fov of\n\t\t * the XR camera. If you need the fov on app level, you have to compute in\n\t\t * manually from the XR camera's projection matrices.\n\t\t *\n\t\t * @return {ArrayCamera} The XR camera.\n\t\t */\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the amount of foveation used by the XR compositor for the projection layer.\n\t\t *\n\t\t * @return {number|undefined} The amount of foveation.\n\t\t */\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the foveation value.\n\t\t *\n\t\t * @param {number} value - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t\t */\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if depth sensing is supported.\n\t\t *\n\t\t * @return {boolean} Whether depth sensing is supported or not.\n\t\t */\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the depth sensing mesh.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getMesh}.\n\t\t *\n\t\t * @return {Mesh} The depth sensing mesh.\n\t\t */\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieves an opaque texture from the view-aligned {@link XRCamera}.\n\t\t * Only available during the current animation loop.\n\t\t *\n\t\t * @param {XRCamera} xrCamera - The camera to query.\n\t\t * @return {?Texture} An opaque texture representing the current raw camera frame.\n\t\t */\n\t\tthis.getCameraTexture = function ( xrCamera ) {\n\n\t\t\treturn cameraAccessTextures[ xrCamera ];\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && supportsGlBinding ) {\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst cameraAccessEnabled = enabledFeatures &&\n\t\t\t\t enabledFeatures.includes( 'camera-access' );\n\n\t\t\t\tif ( cameraAccessEnabled && supportsGlBinding ) {\n\n\t\t\t\t\trenderer.state.unbindTexture();\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\t\tconst camera = views[ i ].camera;\n\n\t\t\t\t\t\tif ( camera ) {\n\n\t\t\t\t\t\t\tlet cameraTex = cameraAccessTextures[ camera ];\n\n\t\t\t\t\t\t\tif ( ! cameraTex ) {\n\n\t\t\t\t\t\t\t\tcameraTex = new ExternalTexture();\n\t\t\t\t\t\t\t\tcameraAccessTextures[ camera ] = cameraTex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst glTexture = glBinding.getCameraImage( camera );\n\t\t\t\t\t\t\tcameraTex.sourceTexture = glTexture;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\terror( 'WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\twarn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\twarn( 'WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 16x16\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\n\nconst DATA = new Uint16Array( [\n\t0x30b5, 0x3ad1, 0x314c, 0x3a4d, 0x33d2, 0x391c, 0x35ef, 0x3828, 0x37f3, 0x36a6, 0x38d1, 0x3539, 0x3979, 0x3410, 0x39f8, 0x3252, 0x3a53, 0x30f0, 0x3a94, 0x2fc9, 0x3abf, 0x2e35, 0x3ada, 0x2d05, 0x3ae8, 0x2c1f, 0x3aed, 0x2ae0, 0x3aea, 0x29d1, 0x3ae1, 0x28ff,\n\t0x3638, 0x38e4, 0x364a, 0x38ce, 0x3699, 0x385e, 0x374e, 0x372c, 0x3839, 0x35a4, 0x38dc, 0x3462, 0x396e, 0x32c4, 0x39de, 0x3134, 0x3a2b, 0x3003, 0x3a59, 0x2e3a, 0x3a6d, 0x2ce1, 0x3a6e, 0x2bba, 0x3a5f, 0x2a33, 0x3a49, 0x290a, 0x3a2d, 0x2826, 0x3a0a, 0x26e8,\n\t0x3894, 0x36d7, 0x3897, 0x36c9, 0x38a3, 0x3675, 0x38bc, 0x35ac, 0x38ee, 0x349c, 0x393e, 0x3332, 0x3997, 0x3186, 0x39e2, 0x3038, 0x3a13, 0x2e75, 0x3a29, 0x2cf5, 0x3a2d, 0x2bac, 0x3a21, 0x29ff, 0x3a04, 0x28bc, 0x39dc, 0x2790, 0x39ad, 0x261a, 0x3978, 0x24fa,\n\t0x39ac, 0x34a8, 0x39ac, 0x34a3, 0x39ae, 0x3480, 0x39ae, 0x3423, 0x39b1, 0x330e, 0x39c2, 0x31a9, 0x39e0, 0x3063, 0x39fc, 0x2eb5, 0x3a0c, 0x2d1d, 0x3a14, 0x2bcf, 0x3a07, 0x29ff, 0x39e9, 0x28a3, 0x39be, 0x273c, 0x3989, 0x25b3, 0x394a, 0x2488, 0x3907, 0x2345,\n\t0x3a77, 0x3223, 0x3a76, 0x321f, 0x3a73, 0x3204, 0x3a6a, 0x31b3, 0x3a58, 0x3114, 0x3a45, 0x303b, 0x3a34, 0x2eb6, 0x3a26, 0x2d31, 0x3a1e, 0x2bef, 0x3a0b, 0x2a0d, 0x39ec, 0x28a1, 0x39c0, 0x271b, 0x3987, 0x2580, 0x3944, 0x2449, 0x38fa, 0x22bd, 0x38ac, 0x2155,\n\t0x3b07, 0x2fca, 0x3b06, 0x2fca, 0x3b00, 0x2fb8, 0x3af4, 0x2f7c, 0x3adb, 0x2eea, 0x3ab4, 0x2e00, 0x3a85, 0x2cec, 0x3a5e, 0x2bc5, 0x3a36, 0x2a00, 0x3a0d, 0x2899, 0x39dc, 0x2707, 0x39a0, 0x2562, 0x395a, 0x2424, 0x390b, 0x2268, 0x38b7, 0x20fd, 0x385f, 0x1fd1,\n\t0x3b69, 0x2cb9, 0x3b68, 0x2cbb, 0x3b62, 0x2cbb, 0x3b56, 0x2cae, 0x3b3b, 0x2c78, 0x3b0d, 0x2c0a, 0x3acf, 0x2ae3, 0x3a92, 0x2998, 0x3a54, 0x2867, 0x3a17, 0x26d0, 0x39d3, 0x253c, 0x3989, 0x2402, 0x3935, 0x2226, 0x38dc, 0x20bd, 0x387d, 0x1f54, 0x381d, 0x1db3,\n\t0x3ba9, 0x296b, 0x3ba8, 0x296f, 0x3ba3, 0x297b, 0x3b98, 0x2987, 0x3b7f, 0x2976, 0x3b4e, 0x2927, 0x3b0e, 0x2895, 0x3ac2, 0x27b7, 0x3a73, 0x263b, 0x3a23, 0x24e7, 0x39d0, 0x239b, 0x3976, 0x21d9, 0x3917, 0x207e, 0x38b2, 0x1ee7, 0x384b, 0x1d53, 0x37c7, 0x1c1e,\n\t0x3bd2, 0x25cb, 0x3bd1, 0x25d3, 0x3bcd, 0x25f0, 0x3bc2, 0x261f, 0x3bad, 0x2645, 0x3b7d, 0x262d, 0x3b3e, 0x25c4, 0x3aec, 0x250f, 0x3a93, 0x243a, 0x3a32, 0x22ce, 0x39d0, 0x215b, 0x3969, 0x202a, 0x38fe, 0x1e6e, 0x388f, 0x1cf1, 0x381f, 0x1b9b, 0x3762, 0x19dd,\n\t0x3be9, 0x21ab, 0x3be9, 0x21b7, 0x3be5, 0x21e5, 0x3bdd, 0x2241, 0x3bc9, 0x22a7, 0x3ba0, 0x22ec, 0x3b62, 0x22cd, 0x3b0f, 0x2247, 0x3aae, 0x2175, 0x3a44, 0x2088, 0x39d4, 0x1f49, 0x3960, 0x1dbe, 0x38e9, 0x1c77, 0x3870, 0x1ae8, 0x37f1, 0x1953, 0x3708, 0x181b,\n\t0x3bf6, 0x1cea, 0x3bf6, 0x1cfb, 0x3bf3, 0x1d38, 0x3bec, 0x1dbd, 0x3bda, 0x1e7c, 0x3bb7, 0x1f25, 0x3b7d, 0x1f79, 0x3b2c, 0x1f4c, 0x3ac6, 0x1ea6, 0x3a55, 0x1dbb, 0x39da, 0x1cbd, 0x395a, 0x1b9d, 0x38d8, 0x1a00, 0x3855, 0x18ac, 0x37ab, 0x173c, 0x36b7, 0x1598,\n\t0x3bfc, 0x1736, 0x3bfc, 0x1759, 0x3bf9, 0x17e7, 0x3bf4, 0x1896, 0x3be4, 0x1997, 0x3bc6, 0x1aa8, 0x3b91, 0x1b84, 0x3b43, 0x1bd2, 0x3ade, 0x1b8a, 0x3a65, 0x1acd, 0x39e2, 0x19d3, 0x3957, 0x18cd, 0x38ca, 0x17b3, 0x383e, 0x1613, 0x376d, 0x14bf, 0x366f, 0x135e,\n\t0x3bff, 0x101b, 0x3bff, 0x1039, 0x3bfc, 0x10c8, 0x3bf9, 0x1226, 0x3bea, 0x1428, 0x3bcf, 0x1584, 0x3b9f, 0x16c5, 0x3b54, 0x179a, 0x3af0, 0x17ce, 0x3a76, 0x1771, 0x39ea, 0x16a4, 0x3956, 0x15a7, 0x38bf, 0x14a7, 0x3829, 0x1379, 0x3735, 0x11ea, 0x362d, 0x10a1,\n\t0x3c00, 0x061b, 0x3c00, 0x066a, 0x3bfe, 0x081c, 0x3bfa, 0x0a4c, 0x3bed, 0x0d16, 0x3bd5, 0x0fb3, 0x3ba9, 0x114d, 0x3b63, 0x127c, 0x3b01, 0x132f, 0x3a85, 0x1344, 0x39f4, 0x12d2, 0x3957, 0x120d, 0x38b5, 0x1122, 0x3817, 0x103c, 0x3703, 0x0ed3, 0x35f0, 0x0d6d,\n\t0x3c00, 0x007a, 0x3c00, 0x0089, 0x3bfe, 0x011d, 0x3bfb, 0x027c, 0x3bf0, 0x04fa, 0x3bda, 0x0881, 0x3bb1, 0x0acd, 0x3b6f, 0x0c97, 0x3b10, 0x0d7b, 0x3a93, 0x0df1, 0x39fe, 0x0def, 0x3959, 0x0d8a, 0x38af, 0x0ce9, 0x3808, 0x0c31, 0x36d5, 0x0af0, 0x35b9, 0x09a3,\n\t0x3c00, 0x0000, 0x3c00, 0x0001, 0x3bff, 0x0015, 0x3bfb, 0x0059, 0x3bf2, 0x00fd, 0x3bdd, 0x01df, 0x3bb7, 0x031c, 0x3b79, 0x047c, 0x3b1d, 0x05d4, 0x3aa0, 0x06d5, 0x3a08, 0x075a, 0x395d, 0x075e, 0x38aa, 0x06f7, 0x37f4, 0x0648, 0x36ac, 0x0576, 0x3586, 0x049f\n] );\n\nlet lut = null;\n\nfunction getDFGLUT() {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 16, 16, RGFormat, HalfFloatType );\n\t\tlut.name = 'DFG_LUT';\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\treturn lut;\n\n}\n\n/**\n * This renderer uses WebGL 2 to display scenes.\n *\n * WebGL 1 is not supported since `r163`.\n */\nclass WebGLRenderer {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treversedDepthBuffer = false,\n\t\t\toutputBufferType = UnsignedByteType,\n\t\t} = parameters;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst _outputBufferType = outputBufferType;\n\n\t\tconst INTEGER_FORMATS = new Set( [\n\t\t\tRGBAIntegerFormat,\n\t\t\tRGIntegerFormat,\n\t\t\tRedIntegerFormat\n\t\t] );\n\n\t\tconst UNSIGNED_TYPES = new Set( [\n\t\t\tUnsignedByteType,\n\t\t\tUnsignedIntType,\n\t\t\tUnsignedShortType,\n\t\t\tUnsignedInt248Type,\n\t\t\tUnsignedShort4444Type,\n\t\t\tUnsignedShort5551Type\n\t\t] );\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// internal render target for non-UnsignedByteType color buffer\n\n\t\tlet output = null;\n\n\t\t// public properties\n\n\t\t/**\n\t\t * A canvas where the renderer draws its output.This is automatically created by the renderer\n\t\t * in the constructor (if not provided already); you just need to add it to your page like so:\n\t\t * ```js\n\t\t * document.body.appendChild( renderer.domElement );\n\t\t * ```\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = canvas;\n\n\t\t/**\n\t\t * A object with debug configuration settings.\n\t\t *\n\t\t * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are\n\t\t * checked for errors during compilation and linkage process. It may be useful to disable\n\t\t * this check in production for performance gain. It is strongly recommended to keep these\n\t\t * checks enabled during development. If the shader does not compile and link - it will not\n\t\t * work and associated material will not render.\n\t\t * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that\n\t\t * can be used for custom error reporting. The callback receives the WebGL context, an instance\n\t\t * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader.\n\t\t * Assigning a custom function disables the default error reporting.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled.\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear its output before rendering a frame or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the color buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\t/**\n\t\t * Whether the renderer should sort objects or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some\n\t\t * degree of transparency. By definition, sorting objects may not work in all\n\t\t * cases. Depending on the needs of application, it may be necessary to turn\n\t\t * off sorting and use other methods to deal with transparency rendering e.g.\n\t\t * manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\t/**\n\t\t * User-defined clipping planes specified in world space. These planes apply globally.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether the renderer respects object-level clipping planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.localClippingEnabled = false;\n\n\t\t// tone mapping\n\n\t\t/**\n\t\t * The tone mapping technique of the renderer.\n\t\t *\n\t\t * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Exposure level of tone mapping.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// transmission\n\n\t\t/**\n\t\t * The normalized resolution scale for the transmission render target, measured in percentage\n\t\t * of viewport dimensions. Lowering this value can result in significant performance improvements\n\t\t * when using {@link MeshPhysicalMaterial#transmission}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLRenderer: ' + e.message );\n\t\t\tthrow e;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t/**\n\t\t\t * Holds details about the capabilities of the current rendering context.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#capabilities\n\t\t\t * @type {WebGLRenderer~Capabilities}\n\t\t\t */\n\t\t\t_this.capabilities = capabilities;\n\n\t\t\t/**\n\t\t\t * Provides methods for retrieving and testing WebGL extensions.\n\t\t\t *\n\t\t\t * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported\n\t\t\t * and return the extension object if available.\n\t\t\t * - `has(extensionName:string)`: returns `true` if the extension is supported.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#extensions\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.extensions = extensions;\n\n\t\t\t/**\n\t\t\t * Used to track properties of other objects like native WebGL objects.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#properties\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.properties = properties;\n\n\t\t\t/**\n\t\t\t * Manages the render lists of the renderer.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#renderLists\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.renderLists = renderLists;\n\n\n\n\t\t\t/**\n\t\t\t * Interface for managing shadows.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#shadowMap\n\t\t\t * @type {WebGLRenderer~ShadowMap}\n\t\t\t */\n\t\t\t_this.shadowMap = shadowMap;\n\n\t\t\t/**\n\t\t\t * Interface for managing the WebGL state.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#state\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.state = state;\n\n\t\t\t/**\n\t\t\t * Holds a series of statistical information about the GPU memory\n\t\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t\t *\n\t\t\t * By default these data are reset at each render call but when having\n\t\t\t * multiple render passes per frame (e.g. when using post processing) it can\n\t\t\t * be preferred to reset with a custom pattern. First, set `autoReset` to\n\t\t\t * `false`.\n\t\t\t * ```js\n\t\t\t * renderer.info.autoReset = false;\n\t\t\t * ```\n\t\t\t * Call `reset()` whenever you have finished to render a single frame.\n\t\t\t * ```js\n\t\t\t * renderer.info.reset();\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @name WebGLRenderer#info\n\t\t\t * @type {WebGLRenderer~Info}\n\t\t\t */\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// initialize internal render target for non-UnsignedByteType color buffer\n\n\t\tif ( _outputBufferType !== UnsignedByteType ) {\n\n\t\t\toutput = new WebGLOutput( _outputBufferType, canvas.width, canvas.height, depth, stencil );\n\n\t\t}\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\t/**\n\t\t * A reference to the XR manager.\n\t\t *\n\t\t * @type {WebXRManager}\n\t\t */\n\t\tthis.xr = xr;\n\n\t\t/**\n\t\t * Returns the rendering context.\n\t\t *\n\t\t * @return {WebGL2RenderingContext} The rendering context.\n\t\t */\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the rendering context attributes.\n\t\t *\n\t\t * @return {WebGLContextAttributes} The rendering context attributes.\n\t\t */\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a loss of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a restore of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the pixel ratio.\n\t\t *\n\t\t * @return {number} The pixel ratio.\n\t\t */\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t\t *\n\t\t * @param {number} value - The pixel ratio.\n\t\t */\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The renderer's size in logical pixels.\n\t\t */\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the output canvas to (width, height) with device pixel ratio taken\n\t\t * into account, and also sets the viewport to fit that size, starting in (0,\n\t\t * 0). Setting `updateStyle` to false prevents any style changes to the output canvas.\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t\t */\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tif ( output !== null ) {\n\n\t\t\t\toutput.setSize( canvas.width, canvas.height );\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The drawing buffer size.\n\t\t */\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\t/**\n\t\t * This method allows to define the drawing buffer size by specifying\n\t\t * width, height and pixel ratio all at once. The size of the drawing\n\t\t * buffer is computed with this formula:\n\t\t * ```js\n\t\t * size.x = width * pixelRatio;\n\t\t * size.y = height * pixelRatio;\n\t\t * ```\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {number} pixelRatio - The pixel ratio.\n\t\t */\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the post-processing effects to be applied after rendering.\n\t\t *\n\t\t * @param {Array} effects - An array of post-processing effects.\n\t\t */\n\t\tthis.setEffects = function ( effects ) {\n\n\t\t\tif ( _outputBufferType === UnsignedByteType ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( effects ) {\n\n\t\t\t\tfor ( let i = 0; i < effects.length; i ++ ) {\n\n\t\t\t\t\tif ( effects[ i ].isOutputPass === true ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically.' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toutput.setEffects( effects || [] );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current viewport definition.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The current viewport definition.\n\t\t */\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the viewport definition.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The viewport definition.\n\t\t */\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the viewport to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the viewport.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t\t */\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the scissor region.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The scissor region.\n\t\t */\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the scissor region to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the scissor region.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * @param {number} width - The width of the scissor region in logical pixel unit.\n\t\t * @param {number} height - The height of the scissor region in logical pixel unit.\n\t\t */\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if the scissor test is enabled.\n\t\t *\n\t\t * @return {boolean} Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable or disable the scissor test. When this is enabled, only the pixels\n\t\t * within the defined scissor area will be affected by further renderer\n\t\t * actions.\n\t\t *\n\t\t * @param {boolean} boolean - Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom opaque sort function for the render lists. Pass `null`\n\t\t * to use the default `painterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom transparent sort function for the render lists. Pass `null`\n\t\t * to use the default `reversePainterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\t/**\n\t\t * Returns the clear color.\n\t\t *\n\t\t * @param {Color} target - The method writes the result in this target object.\n\t\t * @return {Color} The clear color.\n\t\t */\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color and alpha.\n\t\t *\n\t\t * @param {Color} color - The clear color.\n\t\t * @param {number} [alpha=1] - The clear alpha.\n\t\t */\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the clear alpha. Ranges within `[0,1]`.\n\t\t *\n\t\t * @return {number} The clear alpha.\n\t\t */\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear alpha.\n\t\t *\n\t\t * @param {number} alpha - The clear alpha.\n\t\t */\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Tells the renderer to clear its color, depth or stencil drawing buffer(s).\n\t\t * This method initializes the buffers to the current clear color values.\n\t\t *\n\t\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t\t */\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = INTEGER_FORMATS.has( targetFormat );\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = UNSIGNED_TYPES.has( targetType );\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the color buffer. Equivalent to calling `renderer.clear( true, false, false )`.\n\t\t */\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the depth buffer. Equivalent to calling `renderer.clear( false, true, false )`.\n\t\t */\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the stencil buffer. Equivalent to calling `renderer.clear( false, false, true )`.\n\t\t */\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tlog( 'WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tlog( 'WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\terror( 'WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Compiles all materials in the scene with the camera. This is useful to precompile shaders\n\t\t * before the first rendering. If you want to add a 3D object to an existing scene, use the third\n\t\t * optional parameter for applying the target scene.\n\t\t *\n\t\t * Note that the (target) scene's lighting and environment must be configured before calling this method.\n\t\t *\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Set} The precompiled materials.\n\t\t */\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\t/**\n\t\t * Asynchronous version of {@link WebGLRenderer#compile}.\n\t\t *\n\t\t * This method makes use of the `KHR_parallel_shader_compile` WebGL extension. Hence,\n\t\t * it is recommended to use this version of `compile()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Promise} A Promise that resolves when the given scene can be rendered without unnecessary stalling due to shader compilation.\n\t\t */\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\t/**\n\t\t * Applications are advised to always define the animation loop\n\t\t * with this method and not manually with `requestAnimationFrame()`\n\t\t * for best compatibility.\n\t\t *\n\t\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t\t */\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\t/**\n\t\t * Renders the given scene (or other type of 3D object) using the given camera.\n\t\t *\n\t\t * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget}\n\t\t * or to the canvas as usual.\n\t\t *\n\t\t * By default render buffers are cleared before rendering but you can prevent\n\t\t * this by setting the property `autoClear` to `false`. If you want to prevent\n\t\t * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth`\n\t\t * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\terror( 'WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// use internal render target for HalfFloatType color buffer (only when tone mapping is enabled)\n\n\t\t\tconst isXRPresenting = xr.enabled === true && xr.isPresenting === true;\n\n\t\t\tconst useOutput = output !== null && ( _currentRenderTarget === null || isXRPresenting ) && output.begin( _this, _currentRenderTarget );\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true && ( output === null || output.isCompositing() === false ) ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene (skip if first effect is a render pass - it will render the scene itself)\n\n\t\t\tconst skipSceneRender = useOutput && output.hasRenderPass();\n\n\t\t\tif ( skipSceneRender === false ) {\n\n\t\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t// copy from internal render target to canvas using fullscreen quad\n\n\t\t\tif ( useOutput ) {\n\n\t\t\t\toutput.end( _this );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tconst hasHalfFloatSupport = extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' );\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: hasHalfFloatSupport ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: capabilities.samples,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\tconst currentActiveCubeFace = _this.getActiveCubeFace();\n\t\t\tconst currentActiveMipmapLevel = _this.getActiveMipmapLevel();\n\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst { object, geometry, material, group } = renderItem;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst { object, geometry, group } = renderItem;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reversedDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reversedDepthBuffer && camera.reversedDepth !== true ) {\n\n\t\t\t\t\tcamera._reversedDepth = true;\n\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Pre-allocate texture units for shadow samplers before setting data textures\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// Set shadow map uniforms first to ensure they get the first texture units\n\t\t\t\tif ( lights.state.directionalShadowMap.length > 0 ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'directionalShadowMap', lights.state.directionalShadowMap, textures );\n\n\t\t\t\t}\n\n\t\t\t\tif ( lights.state.spotShadowMap.length > 0 ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'spotShadowMap', lights.state.spotShadowMap, textures );\n\n\t\t\t\t}\n\n\t\t\t\tif ( lights.state.pointShadowMap.length > 0 ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'pointShadowMap', lights.state.pointShadowMap, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\t// Set DFG LUT for physically-based materials\n\t\t\tif ( m_uniforms.dfgLUT !== undefined ) {\n\n\t\t\t\tm_uniforms.dfgLUT.value = getDFGLUT();\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\t/**\n\t\t * Returns the active cube face.\n\t\t *\n\t\t * @return {number} The active cube face.\n\t\t */\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active mipmap level.\n\t\t *\n\t\t * @return {number} The active mipmap level.\n\t\t */\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active render target.\n\t\t *\n\t\t * @return {?WebGLRenderTarget} The active render target. Returns `null` if no render target\n\t\t * is currently set.\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false;\n\t\t\tif ( renderTargetProperties.__autoAllocateDepthBuffer === false ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t}\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? undefined : depthTexture;\n\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Sets the active rendertarget.\n\t\t *\n\t\t * @param {?WebGLRenderTarget} renderTarget - The render target to set. When `null` is given,\n\t\t * the canvas is set as the active render target instead.\n\t\t * @param {number} [activeCubeFace=0] - The active cube face when using a cube render target.\n\t\t * Indicates the z layer to render in to when using 3D or array render targets.\n\t\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t\t */\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// Externally-managed framebuffer (e.g. XR)\n\t\t\t\t\t// Bind to the stored framebuffer (may be null for default, or a WebGLFramebuffer)\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t\tstate.viewport( _currentViewport );\n\t\t\t\t\tstate.scissor( _currentScissor );\n\t\t\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\t\t\t_currentMaterialId = -1;\n\n\t\t\t\t\treturn;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst layer = activeCubeFace;\n\n\t\t\t\tfor ( let i = 0; i < renderTarget.textures.length; i ++ ) {\n\n\t\t\t\t\tconst textureProperties = properties.get( renderTarget.textures[ i ] );\n\n\t\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\t/**\n\t\t * Reads the pixel data from the given render target into the given buffer.\n\t\t *\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t */\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}.\n\t\t *\n\t\t * It is recommended to use this version of `readRenderTargetPixels()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t * @return {Promise} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t\t */\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\n\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Copies pixels from the current bound framebuffer into the given texture.\n\t\t *\n\t\t * @param {FramebufferTexture} texture - The texture.\n\t\t * @param {?Vector2} [position=null] - The start position of the copy operation.\n\t\t * @param {number} [level=0] - The mip level. The default represents the base mip.\n\t\t */\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Copies data of the given source texture into a destination texture.\n\t\t *\n\t\t * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized\n\t\t * {@link WebGLRenderer#initRenderTarget}.\n\t\t *\n\t\t * @param {Texture} srcTexture - The source texture.\n\t\t * @param {Texture} dstTexture - The destination texture.\n\t\t * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t\t * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t\t * @param {number} [srcLevel=0] - The source mipmap level to copy.\n\t\t * @param {?number} [dstLevel=null] - The destination mipmap level.\n\t\t */\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given WebGLRenderTarget memory. Useful for initializing a render target so data\n\t\t * can be copied into it using {@link WebGLRenderer#copyTextureToTexture} before it has been\n\t\t * rendered to.\n\t\t *\n\t\t * @param {WebGLRenderTarget} target - The render target.\n\t\t */\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first\n\t\t * render (which can cause noticeable lags due to decode and GPU upload overhead).\n\t\t *\n\t\t * @param {Texture} texture - The texture.\n\t\t */\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to reset the internal WebGL state. This method is mostly\n\t\t * relevant for applications which share a single WebGL context across\n\t\t * multiple WebGL libraries.\n\t\t */\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the coordinate system of the renderer.\n\t *\n\t * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`.\n\t *\n\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t * @default WebGLCoordinateSystem\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Defines the output color space of the renderer.\n\t *\n\t * @type {SRGBColorSpace|LinearSRGBColorSpace}\n\t * @default SRGBColorSpace\n\t */\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeDepthTexture, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, Float32BufferAttribute, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement, error, log, warn, warnOnce };\n"], + "mappings": "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A;AAAA,EAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxP;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAA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", + "names": ["tmp", "ColorManagement", "sign", "data", "tmp2", "indices", "intersects", "intersect", "width", "height", "depth", "fov", "aspect", "index", "l", "vertex", "detail", "radius", "azimuth", "px", "py", "bs", "contour", "p", "q", "error", "json", "document", "shapes", "tmpPath", "tmpShape", "_m1$1", "renderer", "scene", "alpha", "attributes", "precision", "fov", "aspect", "x", "fill", "width", "height", "_v0", "self", "_id", "_projScreenMatrix", "_lightPositionWorld", "_lookTarget", "_frustum", "camera", "drawBuffers", "scissor", "viewport", "_canvas", "texture", "i", "cameraL", "cameraR", "cameras", "cameraXR", "_m1", "info", "chunkOffset", "_vector3", "depth", "stencil", "drawCount", "materials", "currentRenderList", "parameters", "reversedDepthBuffer", "framebuffer"] +} diff --git a/node_modules/.vite/deps/package.json b/node_modules/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/node_modules/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/node_modules/.vite/deps/three.js b/node_modules/.vite/deps/three.js new file mode 100644 index 0000000..185b2ec --- /dev/null +++ b/node_modules/.vite/deps/three.js @@ -0,0 +1,876 @@ +import { + ACESFilmicToneMapping, + AddEquation, + AddOperation, + AdditiveAnimationBlendMode, + AdditiveBlending, + AgXToneMapping, + AlphaFormat, + AlwaysCompare, + AlwaysDepth, + AlwaysStencilFunc, + AmbientLight, + AnimationAction, + AnimationClip, + AnimationLoader, + AnimationMixer, + AnimationObjectGroup, + AnimationUtils, + ArcCurve, + ArrayCamera, + ArrowHelper, + AttachedBindMode, + Audio, + AudioAnalyser, + AudioContext, + AudioListener, + AudioLoader, + AxesHelper, + BackSide, + BasicDepthPacking, + BasicShadowMap, + BatchedMesh, + Bone, + BooleanKeyframeTrack, + Box2, + Box3, + Box3Helper, + BoxGeometry, + BoxHelper, + BufferAttribute, + BufferGeometry, + BufferGeometryLoader, + ByteType, + Cache, + Camera, + CameraHelper, + CanvasTexture, + CapsuleGeometry, + CatmullRomCurve3, + CineonToneMapping, + CircleGeometry, + ClampToEdgeWrapping, + Clock, + Color, + ColorKeyframeTrack, + ColorManagement, + CompressedArrayTexture, + CompressedCubeTexture, + CompressedTexture, + CompressedTextureLoader, + ConeGeometry, + ConstantAlphaFactor, + ConstantColorFactor, + Controls, + CubeCamera, + CubeDepthTexture, + CubeReflectionMapping, + CubeRefractionMapping, + CubeTexture, + CubeTextureLoader, + CubeUVReflectionMapping, + CubicBezierCurve, + CubicBezierCurve3, + CubicInterpolant, + CullFaceBack, + CullFaceFront, + CullFaceFrontBack, + CullFaceNone, + Curve, + CurvePath, + CustomBlending, + CustomToneMapping, + CylinderGeometry, + Cylindrical, + Data3DTexture, + DataArrayTexture, + DataTexture, + DataTextureLoader, + DataUtils, + DecrementStencilOp, + DecrementWrapStencilOp, + DefaultLoadingManager, + DepthFormat, + DepthStencilFormat, + DepthTexture, + DetachedBindMode, + DirectionalLight, + DirectionalLightHelper, + DiscreteInterpolant, + DodecahedronGeometry, + DoubleSide, + DstAlphaFactor, + DstColorFactor, + DynamicCopyUsage, + DynamicDrawUsage, + DynamicReadUsage, + EdgesGeometry, + EllipseCurve, + EqualCompare, + EqualDepth, + EqualStencilFunc, + EquirectangularReflectionMapping, + EquirectangularRefractionMapping, + Euler, + EventDispatcher, + ExternalTexture, + ExtrudeGeometry, + FileLoader, + Float16BufferAttribute, + Float32BufferAttribute, + FloatType, + Fog, + FogExp2, + FramebufferTexture, + FrontSide, + Frustum, + FrustumArray, + GLBufferAttribute, + GLSL1, + GLSL3, + GreaterCompare, + GreaterDepth, + GreaterEqualCompare, + GreaterEqualDepth, + GreaterEqualStencilFunc, + GreaterStencilFunc, + GridHelper, + Group, + HalfFloatType, + HemisphereLight, + HemisphereLightHelper, + IcosahedronGeometry, + ImageBitmapLoader, + ImageLoader, + ImageUtils, + IncrementStencilOp, + IncrementWrapStencilOp, + InstancedBufferAttribute, + InstancedBufferGeometry, + InstancedInterleavedBuffer, + InstancedMesh, + Int16BufferAttribute, + Int32BufferAttribute, + Int8BufferAttribute, + IntType, + InterleavedBuffer, + InterleavedBufferAttribute, + Interpolant, + InterpolateDiscrete, + InterpolateLinear, + InterpolateSmooth, + InterpolationSamplingMode, + InterpolationSamplingType, + InvertStencilOp, + KeepStencilOp, + KeyframeTrack, + LOD, + LatheGeometry, + Layers, + LessCompare, + LessDepth, + LessEqualCompare, + LessEqualDepth, + LessEqualStencilFunc, + LessStencilFunc, + Light, + LightProbe, + Line, + Line3, + LineBasicMaterial, + LineCurve, + LineCurve3, + LineDashedMaterial, + LineLoop, + LineSegments, + LinearFilter, + LinearInterpolant, + LinearMipMapLinearFilter, + LinearMipMapNearestFilter, + LinearMipmapLinearFilter, + LinearMipmapNearestFilter, + LinearSRGBColorSpace, + LinearToneMapping, + LinearTransfer, + Loader, + LoaderUtils, + LoadingManager, + LoopOnce, + LoopPingPong, + LoopRepeat, + MOUSE, + Material, + MaterialLoader, + MathUtils, + Matrix2, + Matrix3, + Matrix4, + MaxEquation, + Mesh, + MeshBasicMaterial, + MeshDepthMaterial, + MeshDistanceMaterial, + MeshLambertMaterial, + MeshMatcapMaterial, + MeshNormalMaterial, + MeshPhongMaterial, + MeshPhysicalMaterial, + MeshStandardMaterial, + MeshToonMaterial, + MinEquation, + MirroredRepeatWrapping, + MixOperation, + MultiplyBlending, + MultiplyOperation, + NearestFilter, + NearestMipMapLinearFilter, + NearestMipMapNearestFilter, + NearestMipmapLinearFilter, + NearestMipmapNearestFilter, + NeutralToneMapping, + NeverCompare, + NeverDepth, + NeverStencilFunc, + NoBlending, + NoColorSpace, + NoNormalPacking, + NoToneMapping, + NormalAnimationBlendMode, + NormalBlending, + NormalGAPacking, + NormalRGPacking, + NotEqualCompare, + NotEqualDepth, + NotEqualStencilFunc, + NumberKeyframeTrack, + Object3D, + ObjectLoader, + ObjectSpaceNormalMap, + OctahedronGeometry, + OneFactor, + OneMinusConstantAlphaFactor, + OneMinusConstantColorFactor, + OneMinusDstAlphaFactor, + OneMinusDstColorFactor, + OneMinusSrcAlphaFactor, + OneMinusSrcColorFactor, + OrthographicCamera, + PCFShadowMap, + PCFSoftShadowMap, + PMREMGenerator, + Path, + PerspectiveCamera, + Plane, + PlaneGeometry, + PlaneHelper, + PointLight, + PointLightHelper, + Points, + PointsMaterial, + PolarGridHelper, + PolyhedronGeometry, + PositionalAudio, + PropertyBinding, + PropertyMixer, + QuadraticBezierCurve, + QuadraticBezierCurve3, + Quaternion, + QuaternionKeyframeTrack, + QuaternionLinearInterpolant, + R11_EAC_Format, + RED_GREEN_RGTC2_Format, + RED_RGTC1_Format, + REVISION, + RG11_EAC_Format, + RGBADepthPacking, + RGBAFormat, + RGBAIntegerFormat, + RGBA_ASTC_10x10_Format, + RGBA_ASTC_10x5_Format, + RGBA_ASTC_10x6_Format, + RGBA_ASTC_10x8_Format, + RGBA_ASTC_12x10_Format, + RGBA_ASTC_12x12_Format, + RGBA_ASTC_4x4_Format, + RGBA_ASTC_5x4_Format, + RGBA_ASTC_5x5_Format, + RGBA_ASTC_6x5_Format, + RGBA_ASTC_6x6_Format, + RGBA_ASTC_8x5_Format, + RGBA_ASTC_8x6_Format, + RGBA_ASTC_8x8_Format, + RGBA_BPTC_Format, + RGBA_ETC2_EAC_Format, + RGBA_PVRTC_2BPPV1_Format, + RGBA_PVRTC_4BPPV1_Format, + RGBA_S3TC_DXT1_Format, + RGBA_S3TC_DXT3_Format, + RGBA_S3TC_DXT5_Format, + RGBDepthPacking, + RGBFormat, + RGBIntegerFormat, + RGB_BPTC_SIGNED_Format, + RGB_BPTC_UNSIGNED_Format, + RGB_ETC1_Format, + RGB_ETC2_Format, + RGB_PVRTC_2BPPV1_Format, + RGB_PVRTC_4BPPV1_Format, + RGB_S3TC_DXT1_Format, + RGDepthPacking, + RGFormat, + RGIntegerFormat, + RawShaderMaterial, + Ray, + Raycaster, + RectAreaLight, + RedFormat, + RedIntegerFormat, + ReinhardToneMapping, + RenderTarget, + RenderTarget3D, + RepeatWrapping, + ReplaceStencilOp, + ReverseSubtractEquation, + RingGeometry, + SIGNED_R11_EAC_Format, + SIGNED_RED_GREEN_RGTC2_Format, + SIGNED_RED_RGTC1_Format, + SIGNED_RG11_EAC_Format, + SRGBColorSpace, + SRGBTransfer, + Scene, + ShaderChunk, + ShaderLib, + ShaderMaterial, + ShadowMaterial, + Shape, + ShapeGeometry, + ShapePath, + ShapeUtils, + ShortType, + Skeleton, + SkeletonHelper, + SkinnedMesh, + Source, + Sphere, + SphereGeometry, + Spherical, + SphericalHarmonics3, + SplineCurve, + SpotLight, + SpotLightHelper, + Sprite, + SpriteMaterial, + SrcAlphaFactor, + SrcAlphaSaturateFactor, + SrcColorFactor, + StaticCopyUsage, + StaticDrawUsage, + StaticReadUsage, + StereoCamera, + StreamCopyUsage, + StreamDrawUsage, + StreamReadUsage, + StringKeyframeTrack, + SubtractEquation, + SubtractiveBlending, + TOUCH, + TangentSpaceNormalMap, + TetrahedronGeometry, + Texture, + TextureLoader, + TextureUtils, + Timer, + TimestampQuery, + TorusGeometry, + TorusKnotGeometry, + Triangle, + TriangleFanDrawMode, + TriangleStripDrawMode, + TrianglesDrawMode, + TubeGeometry, + UVMapping, + Uint16BufferAttribute, + Uint32BufferAttribute, + Uint8BufferAttribute, + Uint8ClampedBufferAttribute, + Uniform, + UniformsGroup, + UniformsLib, + UniformsUtils, + UnsignedByteType, + UnsignedInt101111Type, + UnsignedInt248Type, + UnsignedInt5999Type, + UnsignedIntType, + UnsignedShort4444Type, + UnsignedShort5551Type, + UnsignedShortType, + VSMShadowMap, + Vector2, + Vector3, + Vector4, + VectorKeyframeTrack, + VideoFrameTexture, + VideoTexture, + WebGL3DRenderTarget, + WebGLArrayRenderTarget, + WebGLCoordinateSystem, + WebGLCubeRenderTarget, + WebGLRenderTarget, + WebGLRenderer, + WebGLUtils, + WebGPUCoordinateSystem, + WebXRController, + WireframeGeometry, + WrapAroundEnding, + ZeroCurvatureEnding, + ZeroFactor, + ZeroSlopeEnding, + ZeroStencilOp, + createCanvasElement, + error, + getConsoleFunction, + log, + setConsoleFunction, + warn, + warnOnce +} from "./chunk-XSTVJSXX.js"; +export { + ACESFilmicToneMapping, + AddEquation, + AddOperation, + AdditiveAnimationBlendMode, + AdditiveBlending, + AgXToneMapping, + AlphaFormat, + AlwaysCompare, + AlwaysDepth, + AlwaysStencilFunc, + AmbientLight, + AnimationAction, + AnimationClip, + AnimationLoader, + AnimationMixer, + AnimationObjectGroup, + AnimationUtils, + ArcCurve, + ArrayCamera, + ArrowHelper, + AttachedBindMode, + Audio, + AudioAnalyser, + AudioContext, + AudioListener, + AudioLoader, + AxesHelper, + BackSide, + BasicDepthPacking, + BasicShadowMap, + BatchedMesh, + Bone, + BooleanKeyframeTrack, + Box2, + Box3, + Box3Helper, + BoxGeometry, + BoxHelper, + BufferAttribute, + BufferGeometry, + BufferGeometryLoader, + ByteType, + Cache, + Camera, + CameraHelper, + CanvasTexture, + CapsuleGeometry, + CatmullRomCurve3, + CineonToneMapping, + CircleGeometry, + ClampToEdgeWrapping, + Clock, + Color, + ColorKeyframeTrack, + ColorManagement, + CompressedArrayTexture, + CompressedCubeTexture, + CompressedTexture, + CompressedTextureLoader, + ConeGeometry, + ConstantAlphaFactor, + ConstantColorFactor, + Controls, + CubeCamera, + CubeDepthTexture, + CubeReflectionMapping, + CubeRefractionMapping, + CubeTexture, + CubeTextureLoader, + CubeUVReflectionMapping, + CubicBezierCurve, + CubicBezierCurve3, + CubicInterpolant, + CullFaceBack, + CullFaceFront, + CullFaceFrontBack, + CullFaceNone, + Curve, + CurvePath, + CustomBlending, + CustomToneMapping, + CylinderGeometry, + Cylindrical, + Data3DTexture, + DataArrayTexture, + DataTexture, + DataTextureLoader, + DataUtils, + DecrementStencilOp, + DecrementWrapStencilOp, + DefaultLoadingManager, + DepthFormat, + DepthStencilFormat, + DepthTexture, + DetachedBindMode, + DirectionalLight, + DirectionalLightHelper, + DiscreteInterpolant, + DodecahedronGeometry, + DoubleSide, + DstAlphaFactor, + DstColorFactor, + DynamicCopyUsage, + DynamicDrawUsage, + DynamicReadUsage, + EdgesGeometry, + EllipseCurve, + EqualCompare, + EqualDepth, + EqualStencilFunc, + EquirectangularReflectionMapping, + EquirectangularRefractionMapping, + Euler, + EventDispatcher, + ExternalTexture, + ExtrudeGeometry, + FileLoader, + Float16BufferAttribute, + Float32BufferAttribute, + FloatType, + Fog, + FogExp2, + FramebufferTexture, + FrontSide, + Frustum, + FrustumArray, + GLBufferAttribute, + GLSL1, + GLSL3, + GreaterCompare, + GreaterDepth, + GreaterEqualCompare, + GreaterEqualDepth, + GreaterEqualStencilFunc, + GreaterStencilFunc, + GridHelper, + Group, + HalfFloatType, + HemisphereLight, + HemisphereLightHelper, + IcosahedronGeometry, + ImageBitmapLoader, + ImageLoader, + ImageUtils, + IncrementStencilOp, + IncrementWrapStencilOp, + InstancedBufferAttribute, + InstancedBufferGeometry, + InstancedInterleavedBuffer, + InstancedMesh, + Int16BufferAttribute, + Int32BufferAttribute, + Int8BufferAttribute, + IntType, + InterleavedBuffer, + InterleavedBufferAttribute, + Interpolant, + InterpolateDiscrete, + InterpolateLinear, + InterpolateSmooth, + InterpolationSamplingMode, + InterpolationSamplingType, + InvertStencilOp, + KeepStencilOp, + KeyframeTrack, + LOD, + LatheGeometry, + Layers, + LessCompare, + LessDepth, + LessEqualCompare, + LessEqualDepth, + LessEqualStencilFunc, + LessStencilFunc, + Light, + LightProbe, + Line, + Line3, + LineBasicMaterial, + LineCurve, + LineCurve3, + LineDashedMaterial, + LineLoop, + LineSegments, + LinearFilter, + LinearInterpolant, + LinearMipMapLinearFilter, + LinearMipMapNearestFilter, + LinearMipmapLinearFilter, + LinearMipmapNearestFilter, + LinearSRGBColorSpace, + LinearToneMapping, + LinearTransfer, + Loader, + LoaderUtils, + LoadingManager, + LoopOnce, + LoopPingPong, + LoopRepeat, + MOUSE, + Material, + MaterialLoader, + MathUtils, + Matrix2, + Matrix3, + Matrix4, + MaxEquation, + Mesh, + MeshBasicMaterial, + MeshDepthMaterial, + MeshDistanceMaterial, + MeshLambertMaterial, + MeshMatcapMaterial, + MeshNormalMaterial, + MeshPhongMaterial, + MeshPhysicalMaterial, + MeshStandardMaterial, + MeshToonMaterial, + MinEquation, + MirroredRepeatWrapping, + MixOperation, + MultiplyBlending, + MultiplyOperation, + NearestFilter, + NearestMipMapLinearFilter, + NearestMipMapNearestFilter, + NearestMipmapLinearFilter, + NearestMipmapNearestFilter, + NeutralToneMapping, + NeverCompare, + NeverDepth, + NeverStencilFunc, + NoBlending, + NoColorSpace, + NoNormalPacking, + NoToneMapping, + NormalAnimationBlendMode, + NormalBlending, + NormalGAPacking, + NormalRGPacking, + NotEqualCompare, + NotEqualDepth, + NotEqualStencilFunc, + NumberKeyframeTrack, + Object3D, + ObjectLoader, + ObjectSpaceNormalMap, + OctahedronGeometry, + OneFactor, + OneMinusConstantAlphaFactor, + OneMinusConstantColorFactor, + OneMinusDstAlphaFactor, + OneMinusDstColorFactor, + OneMinusSrcAlphaFactor, + OneMinusSrcColorFactor, + OrthographicCamera, + PCFShadowMap, + PCFSoftShadowMap, + PMREMGenerator, + Path, + PerspectiveCamera, + Plane, + PlaneGeometry, + PlaneHelper, + PointLight, + PointLightHelper, + Points, + PointsMaterial, + PolarGridHelper, + PolyhedronGeometry, + PositionalAudio, + PropertyBinding, + PropertyMixer, + QuadraticBezierCurve, + QuadraticBezierCurve3, + Quaternion, + QuaternionKeyframeTrack, + QuaternionLinearInterpolant, + R11_EAC_Format, + RED_GREEN_RGTC2_Format, + RED_RGTC1_Format, + REVISION, + RG11_EAC_Format, + RGBADepthPacking, + RGBAFormat, + RGBAIntegerFormat, + RGBA_ASTC_10x10_Format, + RGBA_ASTC_10x5_Format, + RGBA_ASTC_10x6_Format, + RGBA_ASTC_10x8_Format, + RGBA_ASTC_12x10_Format, + RGBA_ASTC_12x12_Format, + RGBA_ASTC_4x4_Format, + RGBA_ASTC_5x4_Format, + RGBA_ASTC_5x5_Format, + RGBA_ASTC_6x5_Format, + RGBA_ASTC_6x6_Format, + RGBA_ASTC_8x5_Format, + RGBA_ASTC_8x6_Format, + RGBA_ASTC_8x8_Format, + RGBA_BPTC_Format, + RGBA_ETC2_EAC_Format, + RGBA_PVRTC_2BPPV1_Format, + RGBA_PVRTC_4BPPV1_Format, + RGBA_S3TC_DXT1_Format, + RGBA_S3TC_DXT3_Format, + RGBA_S3TC_DXT5_Format, + RGBDepthPacking, + RGBFormat, + RGBIntegerFormat, + RGB_BPTC_SIGNED_Format, + RGB_BPTC_UNSIGNED_Format, + RGB_ETC1_Format, + RGB_ETC2_Format, + RGB_PVRTC_2BPPV1_Format, + RGB_PVRTC_4BPPV1_Format, + RGB_S3TC_DXT1_Format, + RGDepthPacking, + RGFormat, + RGIntegerFormat, + RawShaderMaterial, + Ray, + Raycaster, + RectAreaLight, + RedFormat, + RedIntegerFormat, + ReinhardToneMapping, + RenderTarget, + RenderTarget3D, + RepeatWrapping, + ReplaceStencilOp, + ReverseSubtractEquation, + RingGeometry, + SIGNED_R11_EAC_Format, + SIGNED_RED_GREEN_RGTC2_Format, + SIGNED_RED_RGTC1_Format, + SIGNED_RG11_EAC_Format, + SRGBColorSpace, + SRGBTransfer, + Scene, + ShaderChunk, + ShaderLib, + ShaderMaterial, + ShadowMaterial, + Shape, + ShapeGeometry, + ShapePath, + ShapeUtils, + ShortType, + Skeleton, + SkeletonHelper, + SkinnedMesh, + Source, + Sphere, + SphereGeometry, + Spherical, + SphericalHarmonics3, + SplineCurve, + SpotLight, + SpotLightHelper, + Sprite, + SpriteMaterial, + SrcAlphaFactor, + SrcAlphaSaturateFactor, + SrcColorFactor, + StaticCopyUsage, + StaticDrawUsage, + StaticReadUsage, + StereoCamera, + StreamCopyUsage, + StreamDrawUsage, + StreamReadUsage, + StringKeyframeTrack, + SubtractEquation, + SubtractiveBlending, + TOUCH, + TangentSpaceNormalMap, + TetrahedronGeometry, + Texture, + TextureLoader, + TextureUtils, + Timer, + TimestampQuery, + TorusGeometry, + TorusKnotGeometry, + Triangle, + TriangleFanDrawMode, + TriangleStripDrawMode, + TrianglesDrawMode, + TubeGeometry, + UVMapping, + Uint16BufferAttribute, + Uint32BufferAttribute, + Uint8BufferAttribute, + Uint8ClampedBufferAttribute, + Uniform, + UniformsGroup, + UniformsLib, + UniformsUtils, + UnsignedByteType, + UnsignedInt101111Type, + UnsignedInt248Type, + UnsignedInt5999Type, + UnsignedIntType, + UnsignedShort4444Type, + UnsignedShort5551Type, + UnsignedShortType, + VSMShadowMap, + Vector2, + Vector3, + Vector4, + VectorKeyframeTrack, + VideoFrameTexture, + VideoTexture, + WebGL3DRenderTarget, + WebGLArrayRenderTarget, + WebGLCoordinateSystem, + WebGLCubeRenderTarget, + WebGLRenderTarget, + WebGLRenderer, + WebGLUtils, + WebGPUCoordinateSystem, + WebXRController, + WireframeGeometry, + WrapAroundEnding, + ZeroCurvatureEnding, + ZeroFactor, + ZeroSlopeEnding, + ZeroStencilOp, + createCanvasElement, + error, + getConsoleFunction, + log, + setConsoleFunction, + warn, + warnOnce +}; diff --git a/node_modules/.vite/deps/three.js.map b/node_modules/.vite/deps/three.js.map new file mode 100644 index 0000000..9865211 --- /dev/null +++ b/node_modules/.vite/deps/three.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "sourcesContent": [], + "mappings": "", + "names": [] +} diff --git a/node_modules/.vite/deps/three_addons_controls_PointerLockControls__js.js b/node_modules/.vite/deps/three_addons_controls_PointerLockControls__js.js new file mode 100644 index 0000000..025bc2e --- /dev/null +++ b/node_modules/.vite/deps/three_addons_controls_PointerLockControls__js.js @@ -0,0 +1,7 @@ +import { + PointerLockControls +} from "./chunk-PIN6L3XG.js"; +import "./chunk-XSTVJSXX.js"; +export { + PointerLockControls +}; diff --git a/node_modules/.vite/deps/three_addons_controls_PointerLockControls__js.js.map b/node_modules/.vite/deps/three_addons_controls_PointerLockControls__js.js.map new file mode 100644 index 0000000..9865211 --- /dev/null +++ b/node_modules/.vite/deps/three_addons_controls_PointerLockControls__js.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "sourcesContent": [], + "mappings": "", + "names": [] +} diff --git a/node_modules/.vite/deps/three_examples_jsm_controls_PointerLockControls__js.js b/node_modules/.vite/deps/three_examples_jsm_controls_PointerLockControls__js.js new file mode 100644 index 0000000..025bc2e --- /dev/null +++ b/node_modules/.vite/deps/three_examples_jsm_controls_PointerLockControls__js.js @@ -0,0 +1,7 @@ +import { + PointerLockControls +} from "./chunk-PIN6L3XG.js"; +import "./chunk-XSTVJSXX.js"; +export { + PointerLockControls +}; diff --git a/node_modules/.vite/deps/three_examples_jsm_controls_PointerLockControls__js.js.map b/node_modules/.vite/deps/three_examples_jsm_controls_PointerLockControls__js.js.map new file mode 100644 index 0000000..9865211 --- /dev/null +++ b/node_modules/.vite/deps/three_examples_jsm_controls_PointerLockControls__js.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": [], + "sourcesContent": [], + "mappings": "", + "names": [] +} diff --git a/node_modules/@esbuild/darwin-x64/README.md b/node_modules/@esbuild/linux-x64/README.md similarity index 54% rename from node_modules/@esbuild/darwin-x64/README.md rename to node_modules/@esbuild/linux-x64/README.md index a2fd0cb..b2f1930 100644 --- a/node_modules/@esbuild/darwin-x64/README.md +++ b/node_modules/@esbuild/linux-x64/README.md @@ -1,3 +1,3 @@ # esbuild -This is the macOS 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. +This is the Linux 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. diff --git a/node_modules/@esbuild/darwin-x64/bin/esbuild b/node_modules/@esbuild/linux-x64/bin/esbuild similarity index 65% rename from node_modules/@esbuild/darwin-x64/bin/esbuild rename to node_modules/@esbuild/linux-x64/bin/esbuild index 10800b987a5819d87ea0ee2498082b0766238c4e..2c11e32282010dc92056b46e993bb1db352756fe 100755 GIT binary patch delta 3767124 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 Pvw;W2`BtiH$ThF-u6Sv7+Jq%szLBe)D_z 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

v#xXS%O0?Bw#^+uNjBFQK4u63>SZ_;{JV; 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

;DR z&`p#M_=&MuxjN4L+}$qc8BD_B5iE~i_fh3Ev(Eih!mJ}YD$9lEj%00g`5m}^6l)gW z^Nv6mM1x82dS!M)NMCS>2{XB}Cy`8^m)DYWX+ZMTjq-?F&zcgM2P zdiQQI{K8l^sL2bg_u_u17SMKEQNR-v0P_xR5Lk3euw*=%$C5Dr0-9of3LiQSn-pme zdDb|#MSpg4G`Earx2w9<#GNt1j#+mx51RnpYHuzdF@e(PgWGT_`O$ji>R06;)zUg?s|g&aeHqkFLlEJzGfn`G;1)1^pvoM z_(0KYgpZnDWOLv+7DMY4xL;lRm2%>B&q-ctQl|FrZo}m&;Yc?TYd;yu4E2cY1SqL+EY_r>eT+4kRfpqgJ%(DI98b2 z6bjaI6vR_L5d*Oh<0Zycgvd#!f*G=QLRRtglKf9ImU^I#CMF9*aIBR- zdFbiS6DBkFy2W)KfsZSSwIA|AlRk>oXJu8tgj%b;uN-*{iUEFR2?Aw&}37fkUAVqi~Qu802Mv* ztS^tB$_DCn73cEpQ(4WZLOs>^s*sfD)i1;IX}=G%3UpbIOGv{O*kuBN{0G`3lzj7Q zX~|9d@+$AKP7(K?pi651D!ar-cFC^P7_Ce4evn-P1k@#cZ3xh(JNod<_n1$69m<&6 z8)Z6_qbH{YU7#}s55{;r(GeA4PsN9>p-S%!T(7QZ#Ps%3yY%5t-eb7-yT7(F{=Ai3 zD)g9!_447mkNC`K%(t#5Figb@cP0-)MH|(Bsu!Aza^SY;VMHvL)KNE=|1^zx26qSr zcqqWz=S)i1(r z{K;eAXVHP#k3ht;tCEO7iLJ*8ferJ++5?Gv!~3jzk9GhfyTeQk(pN&}ePn~IeSj!E zBq)W?E+};+%$+rOae1xP^vNlFx3xKMI+I1E zZr(?Fn0;$+zftR6P{UN6%()x-rZ6 z?%AxZSJNy4q*0HPwIj&y2a7RtRy23|0E>XbnY`Zz3|Aq+%_&FhP_E3x>yVgVX=UqJ zj4g*dWd6cpHb6Q*G(AUEf~tk1`c$uQYR8aanRtzAZBhaMCfd`F7kmKUw&P8>XDS;Q zc>F$kM^8x5EZroPz3yv**?-HoiF{Qm8>7n)<@ygTMx_o&cS+NEyRurE#|@*n0iMVEDx-Y#1izUjwkXJAF<&u z_au@?ORmTD3)wuEOUvlx!jHx6UaDmYU%ikuW4qgcsm4AiNA-lX$k#`RYRqz-Qq;uu z{P99oFC^_4(cIcIEpneobpy?wj%wBRV$x5*W8V-fp7?hH1HU0SXOUC!=kSKHx7iScBB*Q{S5KENQR;RhZQr z^MTd>;Iu?}?-&j3=`^%c;KqG-V04A({Up9gO&t*r_OPglLAOeZf{+U#K$4%mHL~_V z%@rO!Nr1SHNF8Rrg>@>Pug}D?wGwGwVT^BH%wlwTMf}lXXu3HHuVZBcE9RejUcy6n zIQa0W9#uSa!HPWDbIZym=(gqYZcDJuaegefE@5r-ZgmQ{+m41FeEr6{-u#~>>_^=f zWBB(=*-#w}>~%6(o5sbXA@GHLQ_OX+bK1UIyQ<#p$b6Egy5XD2=Qw)0^YJz68u&Y3 z#=BIFhlEL?nbbE>E9zP%8{y~+tYug6#iO*f`rrUQYZ>dM8&!*6T*lh#ejda9ma|^f z9-MqmWCW0#XB2kV$G~wJrG-ZX{h&9*Yr@k6)_iNINcH4cBTm zN`GPK^%c%v`04lH3A#t$ck$DCP3DE8rZR#FSwCzTKnw zIF1>x{n$jF&RGMa@gU4FbMyK4oYk&=^CtwZeMU2Z;n~{Oc;x8-f6AGM|E0ZPb~*D} zis1HOid#tc;SsG7E%<~i=A9aVm`rH-o36~EV=oO?q@hR@y5Dxy7LKndh)j!|O3282 zz~qOpdaSuN@MyhYaH6OlE<~+iJIKi?AtdS7WMMhXGB2^=3}oCnEQrm`+#b__q6Am9r1j#%gTe)nF|d+e={GCHq{WYo6eD; zYCqXXzyHog`Q(pKf^(S?Qqv77hy(8T3BH+tw+eXNOl*ornqZ~;u(GuclUdqR76*}~ zpS_4cDq>qXaAyf#gTOEBBZ}$^aBPjFnqDsuHJn*4$6Z8%rh8|R<8zVY^|!VhlLYul0geJZwn+TGwhXi{XIMoUGCVeTHxU~BM(?@kERPWx)X&RoC3&PE ztlojMqx~&sLqbLxPYMY0;}e=0D)Y>B%vrx9A(4N+4$PU=C6RwmKVFVZB3;-P zHrmsFD3iW*BGQHVPR0l#LYtmHi^w+M3wqTHKh0noUDj-DU%ql zQR#@B31DGF6yvoaMOg%#1Hp-FBTcm^wp%&Cs)!Q(;|pL*YH4$IKB!d_9a;h8tNAx= zt?~5T($>)1Ynx+FKVK&OCoD%~ZL?&0TI9rCqP8@zMUh9C$DlN_g64!4l%$HtQg*Z; zg{~$|vRG4Zl`*d>VnGMoxoaAc{Z4F=``DFD7?MDj(x@`}T(>2KDT_mJ^ zSs|BL9;dte5wv#OIz;puAkp#+2lEGf%Dh@;b(b*fsQ|$2D}@;}OiK7~w4~$sYIGbL z5X~ndyM9HdM7|h5YG)3Rcy0j**J~2P*{;`ovk&8E`bB>9Q&ubL3I#3@D_adk%OU(1 z>=CPsV9G&jlVI2;Lee77>=dm^F&26r(sXnVI=f|v99J7CaBZa=5aBR;)Ainlgi7{*%NmW#{8j_)<)cTJ}CkY9b zRI91)onO&PW=@Het}Ht*!S{F;A##)SKRP9#R>6?b|+RK>I|FlgCZ+hGNK%{R8wn^2_o~L zTBe&41(6m(Bz0K_gw=Ho%F5wpM4{Etlig?w`bja%*@@u`F&hFEY+IdwhzA8XS)u?p z@L#w)tR)DmsoEAjrKClwTdA$FAJan#$rMA|waYKNF8Ap%b7 ziH_|yI%ZX{Lxh@yBPe#_8jRAeNDcs{Cqb#YL1d5)PW|>kO^p)GdrcjCnm_#t>hSr^ z)FSY{s-gzfE7MVWVAxv{Ms>yNLfwi(07dEcyHdon#_yFWtY|lISAg+esK9Xj!v-C7 zDmhl|+y#45Wg-OUA_dH`r~vxneeJeXJPjMT+7y}8`E_Zy;J5HowYbuTLx^nn2l?2@ zE?w&Qf}q0pO2mePaFjji0!~@5&DK8sW3iH#{d684#hRn6c>{Cl@R5HM-n|i!lE4?c zN{LsUG|H(7fA|KJdlBS+C?B+m&)UHJbiW7lbsJdC)b%vbETFXyCX;ql?QSmw1@PWh zji8_~2K#=ePKlPQtF;_WASbV)aGF!qIn`{$XCqD{{uEr2i%!@ZUgj_Rp!DeHm;&2- zZnfo|}~2*nFlPK|Oo< z8}0dp((R??mu>D;K7WKg|KbBgKq^&!xE%p$8|u~XW#y&zkoOf;-cCTVVrzh!$+iXv zvggM+FkG~w<);ZXEi%1){v3P$TR3~F=}q_7+gd;@OZsRCWD9mIk6@-9LCzK%0UPc4 z$$qYSl_S8ZeEtY~{)r$URcd|1?FhvAoU1vq1?VVCT4dgreHQ>I0p`htiTjIXm3?wuwG2LgXG z`fWx=V!&Vv{BZo$RvH4?{~2GrW5;l)wyo+9`q--eNXs088U0#ss6c8lbSSzmq#G42 zRj6Qc!f;eSM}BICV9j>|ji-+Ni0|6QYNWaYkGd0COKGoAN_%sA$q939w3~5i#Bc-7 zLU!8C>NpJn@j+VTPoLXK|0~c&`ne@G1dJ;Gu|$w6YtPh%8U|VW4@xn7YsYY-w+#br zJsFbAlAx#$ugN+{%{{Ud!DKsvi6d>T_nDSAgcjz$t>CV;1KFwd43x24>-9kXw^~nX zT)qn=e-KC1v2jElQ1{Zzsvh0A;vU}Of9%V0jE^<(35-%-iiN;ul+|(HA zXH>Az5Q8%%FE#%kCF|ywHbh`*MQv;Zq9rze3|e9}S|oFJ0_SVNCz*jSx{16&do|sTaALs)Tp=xYSbJ! zsCBKM@}zH=M`fdU(+UnYwfOjN;GpsAcp-}5rm99e6!1^KVPUBq)3j<0gS{cZ0gVMM zI$n%}aa6JN%d%op^j-hN-o~yVNm4XIoGf=G1T}RPP_;0PFd=_xs_iutvTb-NiqrlD zsTz(w*s4W85e`2+;doZIdHhtphJ$VyN{j4Kier(#jf@U0fBv|) zF@3Eel)~C>8o1+Io6yrd^)W#T7a8@{zqd;YFTN2^4)5K=qV>A0;_P;N*&+vLXHK;R zVP;VFpPh)kJWZ* zNRi<(^8B+feuf|~??I%KjMQ~+&fn}~HC^W*64v$}Nw8yzUCcT6iJu+YM^!zk^p= z$n=3ld8)H5X(}bTzQY?GfP2WX2T;~UjvEwxbs*lwX$tVhzBcer5U(*GC3+&U+EZJm zK9uQ8#G~mkF0r1PMfS0)s>>vdORLH98KI%$ied$h)jq?HgO?zQ4oZa!YhU`m+Qjkb zK5j0eoMJ6}>SL@hjj*7|TGF<;DWmpY_6OG1rOz_zdpzVA`>(3vF39CSum_nY(?zQr&)_9){lpsUUsM)zjra!Ihw_iEHC`(kh7Fthorn@BJ_N=5VuL01Uqt z^+hl6o7Hrdzttn1+++BhL(JW8_&wSJqHaWAIjZ3}o`#H$h2ycX6n?mOyZF2Mek9SP zEW=}8Wjpp`-0blLXxv`jEr%xWG57eH4OZ^<6vh9zS{C1j7$ODu8>lB`%2%1;JnLr` zn%bINE^2Em(#L){&71JfIh=_EjnTpdyIF)5nk^YcwyJUcZRDfoTs3RyjSDS^X~yOvg&(o%Boh(^L*DYbPO&R+D0_c+Yj`+hM( z;Pch+1>45YcQ`vrSIq@Cl^D=llq6A*5Gj603`8+dTwIHmik_Q)n0fTBEm3AIe~STD zHwKB)k*@67#XSYKek@T21FNRB+-!5QuEDEss(3BpIZ2Er`Pz=xf|Dy)7fUIS2 z)xa_n1q9lKiY8OkJ-7dl8vM@!jxulEz%Tgvqs%=v_)rU6{)W@-@E~Yil2oCi)%_gp zYCsV*to<8KO>{E^=^3T9@vs-R5RI?igU`ZIw#)y|oiLxAq3fK04rUwwM^<Nn?|-VIuMaig?BxU&5X%~w|Upbb-nn! z9&Ylmf-G*$?4{OJZUdn zF0WhCkKss$CB2vmEqJ%E$_F_vy?C@EvIBY4OYD$1ut$X7>`TWkpwe+#d7#QOQaa{UR`J+=MF!V;IgQL}E_+t)K4|Li{bzU~K zjtsJ*_0!_osuM(<1(xSL61dnDM4PBHh7^_*4bTM5-gqT)pWv=vZfT0`AYyrsW`bmF z1W_+HqSnrZHM72HlLVW*_WR=&CWLcZHt&;Z_!7( z?xxZGX|QmA_ba9N@1>871C5TVGah<5!&(kou?dupOQX&CW2B{$RtHBL+H56%n~Y@# zi3C#xQa7=0L%YayzAb$Y#iORbw2#7FV#p8vIW`@QNtXH9rI;)*=k6@w&dE|{UxMj!-&|43Q}nDT#b_%9 z1D^IvY20T_N>V43@ITJ7TDmhIaF=tC7Vagy-Z`k3%la4capzbqb7R<5)dzC~w%p(- ziLK=aqV_bzQb6g>D&s58ScM`=eu@(9m^M9WFvI%CGuw%S$*$X%b^|hn~jdjkPm!P zYotf~ zp}Qx~620E6j@Ij2rc(zB&rB7R7P+d|Uh=rhtX|ORUZSVk&!L{u9)T5|)t$0vUA5^Y zUwxU?*4Kn`mUEf4)*o4znEm=PGdk$^Z<0--3;c}xUuB(xzQuV;bbW#s>J%JlTNBWF zfxLu3w`1Y?S2!h*SVQl@zq-m=I9GU2>%8e+YR?zE@GASX@})MS0y|Qh^JUj?_HKs^ ze}wQ8??`ujm}5JB_8P0v!1E0C1YJmoZu$^)!(ffEN>kr-YEc^AqB&1a;nl7)rMVf0 z{^^_x0gH1k?Xb1m9jZL0Q;)*FrELsMug4*1^`B`<^JpPB;g{Xs2X*58q4~S(K%j1Bc?G}o2fyhokz8|+qG}IReo_&zSL-Lt-+>l-oE%IP;XO_6Vx>LIGjen1LoQz?LRe8VSThO(yfL z`QRbzpZt72^Yu>ZQ?7o4#)|qCR7vE9Us$4>7Lf~+}oB;igLzjFh}91m2D;o&z~Qfl`J8p|ZP zs++JfNT5rW={k`l^dp=b@R+34@Y!sXAe5Gl8ML+g4eqNH7c0l7pC~ym2Cmh#MUWA> zC!sv-5nPp&LuQS#upda+@d@rWVBDxquhF!Bj#VK)WH1N7PnaxBSr_=Ze{uK7h~LwYKfld9 zbPFEweYaVY;BN0BF<}{TZx4DgSUi527I}RPwMF&#jJd=IYJ*3-S^=AA+&>l2-)8bf z1+0ax_!ZABU=6*BMgx}SKKRWPLF6tFS(-oOj(2dh)Sa@pWb(#$;M$)2iVwNN0=;_M zvh<)VmW(AL%NIrb<2$UC)8%7={wv4$Z+GB-ns=J2+K9LNo%O6WAOdEvD8?D1K z?S1#l5P_?iUUY{S8q{id2SRoIUFO;O{%Q0e8H37}zD(v=r?cgdoMAQqxA$AHLnZ7z zheYmhj|J=YoRoc#>$_t@RLH1R~aT?5Lx}LO<+r0h^Nvs zNu_WcMrH%G&k4TZKKtHb5^txnhSkTA$CQC9ZoVEl}>+9}J7DKytuBX9rRMFMNE)=vRT24cXL@_JJV-1?;i z=1(h`>*(ejk}Ns*3F~hhI2@JlJD1;m!dkl>7@$>Iyhy87y~&$AWq7<}nA8vQ=kOs2 zyLFXdmJC_TFK_Uyr_8MLJ;-yPvTeqOQ*dnFF@^VkiMvjgJY&JBtUuu;i=~%3<5yDP z;AKSGvc;=Z@U9&xsvj~ytI?*7s1fZom#uyOUZVCx{}L6l!yd<0Uk;gH%fg08*j>*Z zy728USx_ZmpZrl)e&L^NeAPJY;Y(hKNagzHEXHkhKdl91)zs^}*K<}k_=h2ArF|br zuEHd#3DGzkv=pNJI^X!5EeLiY=*s_r=6yBX61wmj@A(%STy_3n8xb>S^W491Am{i! z{^BnP(ZhX^L0XcNNQg?BT(0rPFIc2*LJlAI0(VMv1rw>;l6eg$GxPYpx0YoJj#WVv zVy0_ym3MVA`#HLkqaoN!GC}$Q*$y-QX74oK90^Gl@K*DU>nfW1@#FGM-Jxd;cYMhd zkIWcS+2EF-Zm6kgl#yL|^h@S$>@XfA)$T_eP`mm#lHJ0nExCH!Khe0LiB)$Z*LG{< z&yPj#1nZ3Zi6Vs;zhsGZo{fcS(6BF51FR9XqkG?(H9I*;Y&@Pi_7(1oSUC`Fz4U#) z^A+ps_Dhd)y~i$b@7Jte-B$wu^L)DOy(D|@%^_&v{cdZUHU^e#1I6 z{5y$i1ItK~7d^t(@w|QDbWA@PpWdg;*x5dayZy^N_0=Cm^Ll8+cgD4rofD#1{TPhF;(Pxl@|R~;wKun}f1o!&z9UOINZo|&_MU4i;ccRM*_l<_&C&jiMxd}-D77yA z@IMtW#a!pIUqq}9XU96p5{v(%meEuQie|dE5pV3av990 zxtGp7-uPWlWcX$RU!pTN)fHdkxp)*R?s;dxN(CyV$WK$Cq~pOU$xK)hYinAeTtRzX z77XV_Je#qODxTp#DVR6Vo9i0y_W=Ha@w~s@Tu;~h8egb4D_)Il_%Y>`3W^yg`C+}e zj^*o(LfhIvpEP=R9fprNGHz~ZT>7hcyc*Q;tj6cKTnVl<+a-13h3D~1gqXM5S2Xw0 ze|ImMe_qjCBeY^L0Ia4+RGJLw7E)Hoa%BA!0;L{N4%NhNr&B$?WxV?-^rGRs)WbUcI_bQqXs${P26eD0q-R{C?S2EWyE_?^2-RaD;Dw%6H{;j9L z0F6+V7IpT2Oe!-ZhBROh`rYv@vX}^?d602^5;`YqGzp_x{AZ)NmD_LaH7=2|JM?N` zm}_vQiaEae=yudr9`SOXgFc&+%hRfunQ>)2GAtd=cUCbs(dD1xcdD2Jy{^P)b<$QC zvVm*oa=)tPI!=+FiKc4v8LcoBy*mDDKEA5Cf93scFIXYLH%t^*= z^fFCQ9Pe#1hdG6e5yCoj3}0meKTUlW%^#V}t({hk7V#@b^Cr&bF{zPJR0UFWT-D_V zX@w~i9b8!HTB_(c&`AO@A<8A05Wu@Dq22w#+I9gv34S7&AOE~+n}5leA3z6|fuELg zBHy+q$QP*P! zS)5Ua(j3O}Ir{#<@4A`C8Xv>~`fdvETg}`^7j}ZDS2G8;3vI3SJQ*XsHED{~;P?BL+ZC=t1h#7Nu zT6J@s(92wK))o5Lr0LHxF1IvJO4CI@QTryoV1BN#cz-J-c3}@Cl*WDjC#1X8%no!n zSJ5?etpUo#Zt>Bk=<_*;*Q3Y*xl!{>c1=JaMv@vYw!u4=6?F+ zcdzl&p5}I}fu{|Dt}Ftz8Ja{}kZoSa!)lo4N4=5vgypm%qqchss;e;YML7rqU%PB- z#Kj5)H7ji&@=dTBI!2?h=C$IlYnX$4v)Uoh3pmKm;|N#)981BqWHGIHYcF#f@7f=< zp++liDJ(1Ud-x8j5#RDVKIRS%A-uk?IkwiArh<%)854um zLwjfl!?HiwF#+b&4X%1&^TFXd_u=?2M^;%^>bB+s8A3m&>*z+Xc@-60?aN^VY;*mq50zIvc>wnuxhG-SKrX8zaZj&6;QEmDJ>r!69t4-{4laX zUA{iR+_qZ3!f24XQkX?CD#kga@uvZ1FXsC{kwpfVBHMpdAZy{_zxPj4K1_*c!LIe5 zU&oDh%6dK{5F#KvlWzz#$5ed2;C>08IN#{0YlR0RYn$Wr_K53Cc*WZ0*ow{UF*BC% zd6NM$-+V?eV(&>Pe>qm3R>!>V|IzgwU{xK>-*B%8 zBA23oAfiaw1uG~hh)5Cjs)*RTv5Osh4BocsPF&%e4gYU_Uzf6ot>SXwzGyWf~Z=c2x>7Y8>^~*9eq`;QZ#LM_nv;n zpM441#6RHjLr!}xgG{Wdadk zGD>ar_-IB5KC=2%9JK#zrd<+D`g$N}l!8R>>Vs$U*5;9lpO!iB!(0vKPCQ%Yrodua zpapLxPa!h=H{8WGxjKp226kdNR=l!e!c=+^h%0o+k;d;SR@+{&$&&P zua)!QoWFMTS+HnpzatrbytyItB3NWP-S5%Xra15tEa;2tQ)Y;$85&xKJM(z(IY$KP z*{2vnj?w^xKU8BF^dzjnMb2dBzJ5lX{YZN}8_!X7+D&_BTXF_dc56t@kxL&;Q21e*T39j9jy(Qey5peD71XQ;y?MOwFO{m(vY z_y}eAbQHXZXfhlyMf33y0pKRs1Z7~NVVHhaOBGW8OzElAGGW45>IZm zf!jTk-)pf@&4Wk7x)fVmgrvWCs9OBKCPT`ZM8UfH@Sep>BsbnwyP{Xv7NiHuq;dsF zOV(VAx$zKXy7}QeS+EvjqY(XTK2JQ~Gz%L?sFh!lw?7kMu=0_pOD?ko*T^;XUJThM>ddsx3>m<~RthODj!Q9s zRBglg>vS+w40G#x>H2?N$q*4HmO8rpjRY7Lk24fO*TO_Ys98s z_WWZiswbjMUiW~_EY2FNnLehl`r=$Uw=_nDM};&h6E5bakKFldv5L-twa1+E3k*IM z-z7fru%%4DiN5$u0uUJoxU=hVt|~xr*cY1){C{}EPPp=w!DV&NeVn>nEqXcAo_?qt zf?U{3TwV!~6N{7K6~+{mAEh90!cSN_UMh{2=Ly;h9He%QUBQ66a3|>5{4Vap^z?ol z5a|FIL20SnMVdB017P9_+e9~PCh6V`jEW6U;d~YC&>>{Aasa6$>Vh?B_Qpa`^D@&X z5yHzDS)5E8BgBx-k47lae&?Ulr(k|BesCZ8<^c2$`kO27-YA}VR)2d!e|r)?VJ{!- z)eCp%g*!*kpavq;*nFxr%w%r^Q9XUel{lNjd|Zfy%7S}ptU#!qORGr*uxUOBqq9t( zu2^(4k4&>aW%o^mnYeccvmMMh@B><_mekc=bkVDMoU$XXcFJyn{*(KEKKis)6na3i z4eN|rzeET7+D-#yDuq)UFy%J#lEm52EhmQ%+T2i>47Fy^?M@*T9S+*zTdjOPt}hUE z(hHGh0H7>N(fI}TZ3u_}vX&N)3#@uP>#@w*9w18NqZ-pb?3dfm>3>P!0gj@pqeD zUN#Xm{SRXZs+G&yPCUN1Y4T>_rRBq68Y_B76&|?Gi_T@m5ln_3?4az+ysQPj``r6~ zeO_h^{S+%kN3B@Qlc3V`mi?DCFEA^pxUjD?n$3)iK4Cu;`E#dz%sK91W(x!lt&uln z$B7oM&peq}k6AnIUylmoM4bvhm@p=n?2oVj5C$2h10v0Iv|s(Ee`e~KeH%DAGZ)0ju-l?Hy8WAdlOnFY4VL?TF^px(onOgWb84- z3d(Y`kj~NP6(|nCOj_z~a`~%b59fMkOTn{8nF4Q6OVQ7;_avQbDVkO8<-zwXCje*1 z$^bm8Qst_F9fY(Jv2J6zRN2Eau)MUB*)+M8=upQ+6>|btvzD06xUCO9W9B7j&MBW2 z^TcQ!YirD0HvQE~RCd>pFf;oIU$Ll?=*LgeCQPB=)}oC^3qCMl@m+NR^5j%#5P6!% zgc~%vvo)u^F>H`^vpU;aL^{7cT{_Otf%-U2f1E5G=jj17F$vVP^cdYs67#FbaV69Q zX2Qu_p~LDV)n))KXd|MWKRr?U@!s=lql05$4Y@Z-Ipe|6&>7)krp=V1m;%<-`I}|+lqGnJ13%CiGkbwL2J4j zURB{8+*Ql#OUWrB-qdDtNxjzoxNH9Ns-8wIq%VD$BKkKO@C|yyP=cA`hAIwgv8($h zt0C7pzkGIeJ{y*ocNmLZ@r>Z7E=RqJ&yTay${qc6;ia5PxJ984rL_~Ojn{qsKiV4g zqO`5VKnRNetEJXQtS#-t>6rE+$zb@JrnMJ!>or#TgJNGBo}(SGFE1qDD2rqkjK@j9 zNUp6`z9(;<*fq43DAFjvCyIof;Z7N;p zAQ}W8NJf0?STqBv5K7Xn#zhS{=nlrZ9KNvycAaPMiHjOFN1x zhB;GcUq{i(NfOjvR$a9A8_B7Y2r|B05=Y^kM9sin2FT?Fz6_NL8)-EuD<<^~w_E{M zl~nAkhbL23CsDUbh$?kS&UI2AoF0&4VC7G;n0lhE3!Owmr!Gg)4R54cn+@dFS$KNe zEQ!-o_Z97A6U-dE!v_x+$5C8oQ8T@rEjs_M$_JhId~HQUt5j_lT-Rz-Z;cHg0XNoP z!q>AG$ARhTjkV0_3VgRNR=2*LM&3#8JuAjbwE_N8#X)PM+VBB`$U1@#bE-HXnR8bp z_SNd!-?#;2J$gmYI*Y35wM#nV_>6c~1oO?nf9JOf|D)`fH-XWue+BqT7O+XXHc_8Y z^E;z4LVGQCH~HJj`nP+^Sic>jzEy{}aXS#mVVU|G=A)K5RH>`*9vtz63Dh)s5!6mK zVNC9PtkS2XTS)x+nbo1zZ=nDnnvXH$ihetCzw=>+MJvHMFX$jBSSy%db&a1q~vya(q=K;C6mMFZRJ_0QlMm=fFQw7{;K|7ZUIT)Vd|0eS;i za{>AebfG|>`GP@Lmij!DAryD-IL7!V%1UKjMY?LyqZMU!7afd)I$QU(C*4Ji!L>8h z=^;9l>5&3EW!N4&Ps8d?w6X_GnQz;cl*D(Ue|m^^h9=D@rKj*Se%H||!{zi8eGQ); zr$;?Scf+aSWbP%h4Am#m_q{}K$J=m$F?T~mNknfk%62J@?g^KkUve`iI@4S1v;X%v z7{!}EXy!-a%gSq(#wh)WEt!B`D;Z$UW9ryP)HWO*Nm+fwjP!<;SoDmzbRXWYoUa0H z)Ew?rHXiNm56oi_9Lx3rT*@TW#?p*cDwG!Jr4vwkSgpcZ))$xb7b{IAFDhDJoY7xo z^A{{7YkzfVq_=fMf3sEZ;V$b`to7@qi_s7^v!FDM18VJUBCxE676e&)3AQF6k z;$PG#`+%+u6x9sPhtTVRqLblfe`-5Oczf;LfjM%~ZGaAU8Ruqjz+M_<3=&?3b*Z#` zkZ6>yRVY29@c7s4cV`rCsXxBtxwM$Js!IQLMxjm<5cLq<7U+-j)rzPO+%F|+UZb3) z=#xOTT65c_Xg=@|gRnUrl^$trrVfKe73bmn6>kxvL$#xWY5HL3Tk-d4#b6O+m^zq_ z4;CGKPTu2|O>Ca^GNQMcFN=I|yO>!s4W_VEgs%M6mpZ13AXj4sr&z*?GZ?{eruiP_ zqyjsO2GN#O5pO7$M!%;D@4)~3#$DEBLR_jNeL#9F#_-l`L8vxB*IqoO8bbiU`cc$w zh`1lT_AY+`)(apD23SSA_)uU7OglT!i^)0HL+qnILq#n^+q*PxDCTR-0NOTG1q{Psq)oXm8z8@w!8c#*XQ{ZsX z+x}cHXtxpDC}+5cwI9HLJlRSYhYK%B)!qR%_!X;BsvZts_(F}Wptn-E60KMwI*yNp$KsM!EB~ zVXnqrrXofYdp!=JL-JNZe-5oVKL3%MagnP zM?X#zN!}}dQZ4+p0xev^=A;{7wDsW>HC?o6V7GP#R#I00`1cxQ62Rg`>Pq0+=Bdjr zZtRH^#bH!Swg-W$yGsx_Ex5?{d z)7tdg$0E>h@|5%s-J_%GCGaQM!L~!;DGm;SSkcO{t=WV8_Z=e4)1pWq>$($*M8q@5i(U+OR zKfGBN&U%}O-K58}Tg8J;#|1msoQ|u-m^#EMN!WI%^OVA^%(8qN-$rT)(YX|Ry;?aD1fa(trp~mV!)9FfK_yYLj2X1H3#BgEty#T_^4P{z zL}`^g6s?9+K1XyjHn|r;nK>fWIQ2^M{zp0Dj;*0~%l(&g#b#SW+plPvMXYli@b^^E z;Tdh5KRx|KgiwchBGx1FFhf-9J&3x7C(y=u5O=QDqcij1Ise=jD4Gx3^Wb{#qo~{a ze_?DB4{=LA=mEpZTa8PR;y|5Y#bGb`-kq(#78h&c{ZBA?4bCVIkD~)=HI8jl)O;%GIrP=PumxYI>rap;_2o>5oxe9 zllLNFHoT3b{)-?bzA)3=MTpy~`~5Q}ZLK5hBx^av9JpVaId^wktRi)?(6{!vWcp)~ zXlu-`V%6rlFNP4(bT7?WEY^gM`4np->qMGjhyZOU~^g!%`9FF=rQ(h+twXV9o^}!ng6%WvS>`adbuAq)cP@M{UA6 zNtC%%NcwH5a5t$Yr9pOWHR8*-J6O>snR;6)qEghS8z) z&oUv>Cs(}1+DhDlMR%&M2ctI{Y!coz_NAVYLXy$|5l4j_4y?9U_ z?h*heRQ^!kyh%V^O<3t3;4)jXLZo~5+|3ig*}5tg^R2nM zy+E7wH7#8ME_d;pWV*FN%rZ2{rPP(e-?6oX(DuZITMK3>I0S-DA>$E5?SL1?IXa<|*=?8V@+C4F;mY?!ZX>sX;@_?`S z7uzCDV3K5qxP||mgFo}k^y3$fUg~~#?r>;?9%7AEcslViT!bo zlFP=Mtf#A2m2~~Kyz2UI{wWEr1n?*JtMy`1&0j@#4W`TDn$Lscv%! z8hO;SaTPG_4_-0f%z9JCB|Dp+ET%)K_Mf$4g)w@6GL2g&mRGva3GVhGU+_})_*Jo4 z#BUwgOhM}*+jOWwt=EgThJ<2Tf!{`#hhg1+qAQx~OV)kiCSLc@nW1JfQR|F}gF$d7 z2^;NdYTZI8XoE;FjQ^L0Y!J1}PPme6Q~U!h=SbgI9TO3XKmHv^%?#CPNwQH}pdxXpW zZ@VwnAUe7QBw0n_jg8O&6|H)3XTAAn)2^Fg<7VqD;N$+-MYixz0)) z6UteMBYTtRZ0P4eKW`Er8EhRWX0w=J@LWY-ZWjBEsk@SC)D{p+Wjrk2A|f5@+A;yg zgxY4(wJoAW<$Jq%KL2o;`K!WhOj-5b^vWiaBDdnha=VkMH;hj9XI3CcG2kFlR*Fd9 z2lIH`2$RsaHTY3j^#bcQ&0m>JPq&ITZPK@@ftW`E>OHH}*oNyxK`7FN%Y41Oqh9{c z2vnV;7scyEbGc~zDp2X85Miukcbj$vc?D6yHZb@LE9jqX;(56;yD$QaX?;Gu`9jEY z+jgoy$LCYXc2UiK+dM`)*di4H|~#+kIBDKWV~92exBV zzOtNNZx`)E{Zu8C2dh18&?fcGj-mKwIV1q9YB9<{qjm^US&oMP*y3w*CLC7V-_#E6 zg>q=4ZYRWn}>DMiAHlD3orJ{%v6-6`4_$}OW~JB1J(pFuC2 zzgp33>T0XB`O8XP6jrSh_T#GLyi3$|`;3cO`kj%=(l3hvyM%YOP8(F8pQQryocxmR z)OM_Ov$;*Pc8L~-zlkpH5&_=l=IC<^CrTpPC>+2&`}W)l0e`m$s#9wT=wSBl>%|BM zNB=gb;!s7g?mI5xBomxL2k@d{z3V^S>&)6OQZi{8nRae*V{UYY0(t87La0N!T9%|@pONm$oDXR%8e=s#M@$7HtGj_1uecs z3wF6yH{540S4+TX9GvH`r~bAMxv`rS??V zSj`2HfKpi~Ny~`&c3vq8R;dnrXHJPHzr!NfSO%@NJ}kQVd8O-gH%Y70Ly_DUg8`2o z#S?Sbl1wKKiyE!hZ$crbS_F{&EDFdwH38(y86N;?w}AsGExu2B;oVPpACSB*fv*3P zqP~JRqJxDdeI-8iq>b+yZvKgC_;ihA^7~qNhF4vUR;u4AM*2DxU#Js%+H%#!!Jc@z zZvF>dXyabc(62=U1FmOX^R?*hpc?dDl1mQXh>3nN)AXT+Y8}|_Z}I)HD>`Qn0Y-Ie zE_U&6glI8#Itn?K5{0=?Auu0KAy!SoCj-U0MZscsVW|S7QV#%PnD-$dKm0*X-@+c0 zGnW#+6(hV&Q}wPRwE%V&fNO_hHSEtxrZeB-K+D?;=u?*+V+QA_J~fGE-+rw6OHr$Q zJBJ=xd|!3Li(fzau)p2UsMZm%(2sIx_!04gW7XL(5ec@I zK?bkVRro0?3wx`&@_8527(DWyFtvb-W%8=j);ZDgW8k2L20DIBgm*hRM6KZ7r}T&` zm|*n~!r%S_wJk*93-Nv>a<6vvE;d`Yq4-9rY_k_(vptrhHl(R|#z0PV#z1!Dz(N=6 zP{}aYv`A1aoB#b%(vuV&t(Iy!B5*AoZf2{S?yg`tx#`ns^ zamV6xB=5JFa`o4b{FABhr0^}L|9P)E&i|bfp6U9Zr>o;*zTx2qWZrU_$@@S?%+f5z zXdk6Uu&wc@3i_$XG|jc0TCiui01MX4$V|zI8LU32!SXXy3g5s52iL}Smu{g^3NHH?^18EU33RZFHWy&)_PO|rJRTUS+JD`ork5|v!q3>mfoD>Tr|fi@4y!h zPEV#&=fyz31tUwi=f+m5({Bn;aM!W}}PfJyER~Tw4tDYrh z)6`_T_Pwa*w`X`sduPq6mbufrL3Bo~kPE`M%Y+<-w2zX2v@IX2HPv4)YRpBX7p3S$ zIjvEYtrx}UMYFhQG>Y`u)g_YnJGAlwSjgikbmM}E^^H3RbrC26ZNj{t5%bv;Cb4cH zmO3>PDC(l{cek}x0a5X#;}+l7H4>1^Of;$LGDkt!wG}#QI{m|rkU8}HMVyU3KY7U| z(IcgAPac4&GJ{sS6j+y>gs7iLEkS?%mK((DuDnwEV8S+ahhQJ85X}dS4g3T*{K5^i z^^%B;JG%*t4)tLeH=VRT146s_AEMxrpPI?YHHA;N%5~?aV{CdR>`6t=2DQaN~*8r5jCiq4-}GAu3h7Hz*Qq8k6%9>VB*>A-&Hzk$MFKDY^n zZ&$rCYy=8a*a%9aQ=$C(tfznNPP|LdflE)`g*pDEzZl$$G>9wjo zL@f`UaQ_~cOj$n)i{G|^C2bvJUxvlEbpmQxcg(h^75X2sxuRh*u!oR0Y#oO-p#`n| z8+!B~;TPoEo4q<`CoytWum|o-WjhQLRqpOpT-Ef3!mf(yK|jsLf{yyvW#&gfk2$wB zDzx;=iW$S-T7&&gzov;-MZ<`BXCRrMovLQgFj>tYlS`Z)x$dHRgX34fgtMq3bA;&E zbmuCLMBQA|lpL;!Ms@$XfHorZHZFj#!qmlWfRH)*edFza z_~_&m?%3lO)iIQ6_jh$UnP2l)RB%m1Ry;p}0mo711hAw;4Akcp1r&(nChJ(>vChWL zG{wdGxL}ox9Rw&cPw>{uyS?w}G}NVQ6N0RA}_L=)AY<4#PMBYhR5!= zj}>XwiAPi3<4Pz~U)c`|=+6R}c#dA9>DLjD2dDP2>!M4=W8(m$K5skKyjA#R0Qj2ygAm|02U}v zO}nvTSZ5`kuNZOWp-RUmKqhpAue7}*Fw>tX7X9(%h4sF>eJL< zhc>}rJB|Kuut8VpU?KdlA^#zdpYhv$1daY#%n3N&i%EHfegg4o6oc%0;cMVn4;GK< zKRlVL+z`H=^@qPhe5K)Pf|fcaQ`;Nj`+!wF-)m$~q-x~Er>M_S_u%+(!;<&M{vtlJ zb?psF9AiyoH)ovYwt{}YDQebQH<1l@ai9jaB7#JZsPS@=!%ZWBERN!?r?#-i&`K=9 ze!={GiaBRmJ&@%vt}-5{RJ@{-JDEPk50(@4{ zeO_uZJ-a2U*0B76+oH|*AMn3=g2Lv*NMQ3n!#>33`b!jbTcrB=sD?R3V_1Z0^-u&_ zwK9Tl1}D?e+hUku=S8aXt7v5CJD7(4D%#f1a)kdKOc*oGha0d-ux#?ZS1c|mgw-Z1 z#&$SHq};gR>>!bPkLb~_BG~ivFdiv_C&u9m#$b`B=KhFk+!28dALl9`uDps+ZeSSJ zj|CaPVphyJ^%3Y5CrGj{WygW`D$;9XyzT!Ik@k)%>MI7@)%6+BNWAE#XKC! z-GKwZk;?4fr-+PqMZ*fKxm@wJ-E+`|_Qyj?x+|&$J?kH7gRc8%sWYIEqw9}U1Jp9E>$ThI$d!;X=18v zrEXCuVrfWcN6{4k`H}IhXr(5C$?LIj+27}(7+~up%b;EvZf&0H{!2yT8(XJ)At>Ux z)=oIn^54aC!$b-hTgsRs)>0P~P-N^7%bTJ%nN>3* zI`{Kctts#80rZN1y(GkZ@S^8G`O*g1KQ<|Nm+=7nO~F%)U-xt!h-PbhtZ% zqZ;69Fhk(77yCkL_yP{4`*&&d3-EAvK2`}`AQf?vyvVhzY$|+#FpS90sqCMkk^RpO z2o7u5i(33Ce2r(Y{s-fsX2HKGeXdEJ?_!$C$OIJ@vG zwGsPi1Fq9ge~Os&-*%~O=(A@y%QCszPu48+JATF}bDr|KiUBunmE54Mb$#zS>D{vx zx9a5Uy7xM^S8s%USnQnS~hxuL=hvb+`+W523#mY)(LC0An%n~F&>>5BaO_tc^sOk4gL>Zdjrd7S*}^V5B>87XJH2a zLbd-A6NOitPWOK3P^(#mNkzZ3y_94uF?*Bg++QL%{9I2p*owYZ-L;)U!Ct-epQ=EC zh9boo`Y;AkwFCP|ycMy%UE%#%hzmhL58GBlc;};*GZlex#C~oEFP269vSN}uFyzsY zvRuu%W4+XdRCtAHa~fY+8O=eorHAP(b~a~l_$RtI9e;~MCadS}2+11XHq>Ftpv3m&H)S19Xm5gi8I0mo26 zkq7}|S+toWdo6ZD_CV%Y*NG?epLRT>YJ~peKI|?U1+bAQ?|8h$Y@0LZHHHV!M;<_T zIUShknT~N0yH^X^@*prfypsWi5E$5viOp*gC^J~=hIkzHl7k`my-J(MbttA-RQ1bT zf1|`aW>!|Bl&*?=mQ@C!WVgA6=#{X_WwhqIAx~6Ibf>5F8`{zCVw_`WxeM3FpH8w2 z4-6fYN4MZO*e*EgTe;JW+| zv%mtQe#q+)W0DVh@vp`1pN*1!iy) zsLoQ7?)94)HX}LAG`_f;mRGDdzZiLIhoQko66h+Edwba&Z;gYQJFq5m468ob}pv zJg3{KvxZ^vt-FTymy;pk2DtAmzE{VCW`MdBEy+dqa%1jz7E67~xpoHqL*tqZJx@uMv>mvtoCh6DA~^5V^m`|(lAHa+P-2eFNoF@`&ocDU3HY% zRT6yP3-{=hq}ut+8SUi6>mEu&s|{>NtwKA?%Lv2W7`k6x_70fXTGc#aLd~sl|D(qV z>nYVqMjAq5XpNJ6Q!)NKjul{ee}6fK+1DY3wwt71`s0?WC3`2d*km z^rAC*(QOog={Hf;_UdI{b2UvbTCEp7-Y{qje?F~GW5LX#p&dhIfO)ZDe z2v=Fnkg{4|>g!!)li-kiG|`cv^W({d0>l=ETn}%QziV;qN-FOr+ZeJ}>7R~vlT&4i z597>qwi&REuljH!sVppHs1=5Dy%yh@kK?Ff1=-wad{{s|E69YPs;I6l>%-_OS(B~e zvT&f5$q2h`t5D>~qT>~0kjL|AlD`3_%E?5OA2OUwY)~mKXo$}me%L*avpfXJ}mk6h0 z2T+l_TxOVbk!E?w_!`0LecM`i&!!G-X8-HOb9x3gVEE6V04GO-G16=O;^>)&JX}et z`e8rC>NinX>7ySV_mq>IUjGwk^NlYzbInXGD#>aUgsQ&fC911SJez++lPbv-Wl^pr z_NB^Ra(77DPmmC|vONIU)%$cqGJl*Q!l~x0n5PkpI|nUfAN}bitGS$3f1C84-+oB} z-g0-1K-Etz7Yu`OpiTTp`Dv&B*D%Vv#8I)g462~lzu{a`-#nNaRF+fia|-~=sfKi* zvh*_;!|5mfow1kxt}K5s7?$Yt@!Ust4P0@MCt1Yl) zYb!Uwq&E#ZKjiUx+Fv_)H26~qpM1!<5n9Ur9m~Yx`_Fk?)r)=mKYsxd|I8CSN4%+X zfKb1W_2kPhuUmPCma>rMRh6GdKiPg4`mM{%ET$sF7CuKjLNrJ9Sxi525zAh4>oOp) zGT`QMmR-!SGF;nni|TBs>q#G1lR?IAgCb}{H5qGowLtey{Zma|b~e>v9N;^gy-nCo zKl{mMh8|y0Ky}%)p66E_iKbh7&*4@U%`QxJS~b*aYv@?pI(isEA+^r>f|gd7Va^q} znAd2+ByI2)bgep=N%Q&iy1M+TY3kOyNZEk*_{U?K%>%I5EqH=4ZL6!A4`S(v$Mm)) zH~-<7%m{5N8B=BFN#M~EK(0c*$qMN9}0|KFBvQVIP-9o1V zWmCi015`dpwy0m@z&kwsG97sGuB`_0X-zAhQbTwkid4<&gy3dIls|0@k`*fY^Gn@w zsb^~)vzfjNlKzI|TzVQL!^$1bWs1U{LDhe;^;As0xscMZV+M^9vU-haGc#;Bj)Dz7 z$vR&K3HyOL55=2z%=yG@IwWK(hu2@Qxn!Idxw*kd=`W>^cY3JW3FkbA$iFA3Wb@MI z%%#p!jy3GLPv@nqUeUE}NvP$l1(3aBZi;NW+$5-CnKUhUBY6hP>d7Y`a(HwiuoPWG zAz`mVJyWP)Bw#j^7&fe4rqB&MG!$4hf?%Z)z;4Y8TI)8AW(GsH`r-lY3YHbUU)NDk zy8QttYXz1Mm*1MDw05slDZvsS9TwC?;@CL_DKONX_qCVf#` z2HDo6E45{}c6lKXE^^E9H*oeLG#$N}qY7MR-{p_M@>0-8d22&?Tm~WqvzZ1v>7q9J z?vtW+AGPuH@uTT=q?cjiDxx~FaSaz80{&24L3mB8gpZ)?O~N`TV(!Pc$~tJ(SJ6Lp zWUYX)9HobR#pn4q^8~AWyeoi^vjbP55p7HjN~$ZPD@O!_0&~u5rq&RhOAuqR`^LEm zt*$HGTee8jVdD)^t)Z-#irgI^9@Gz4Kj^1U>pNgK{G5kha^zZ_Hh$0yFSBB9Rn4Y< z>&gIw&*u~nDy8F?zi;wpvo!>|#-S+pIP)dUs}G|EWWyGt(nyIZ6A>x#C0AFG5;Z08 zJgCYCYe8#}Nt;4tFT=GAeIN1-lZl3@8Pq>a9w-+-B?HJdB}}2fdNRcCNjOX-H4tjd zS(X~89!*iWmjwF*R{3RH8c|RBh1H!@#0#B+>~iCfUi>&;0Qu9D(n5=!DM&5d<{H*! zd}Tct(D3?WJxc0QkXKo9sxPCH7x^%&6XP&q-c&{lW#9pIY$*Vs7T>i) zpj?1BytISAVNbVaVqxXG<;S$RzN~31=b25%>&ui@Zzg8Ij4@mBB-l4H4qU=`a7^Nf z8kXIbLTrJ}sw$@01UOY&;G)V5kYbu$8Js>~nzxrzuW%V)U!^{l=qq2E9WH&FHsp$s z?a~l3hcmW(v8dMzUZP}z)+jwrAvc$s%d+^b1JULP3y9p?uSdifir`ZlFq!U zt7aai^bEGf!0 z!q88h7gb=Dd@-+Ry?{4VFbF0wd;m^j_w{txy$ZZklVK(FB~>#puvjnM0zX)VPiR_3 zh@-Q9K)tA;;?axgPLxbA>>o<95wvkr6YAYa)+l?g0wSjTsok9_?sdD5z~W#0N6F$Z z?~BFXyaHgt)>%c7gZU=Np+1W8v=I~NawC~w3W2?~)O4q8Q_Z90%*co{ZFH`pwder! zA-NbrDmh3C3_BFO$fM*v&gq;!0=5OI5*Rmfp#h^UxD0WmVM ztPOOfXVEkwMpkNn;0fTgn8GUal(Ln|%Jse5VnD%+HVaBi8Cy;il0Idf=*oNtVDizZdZ$>t1+^1V2u!Ptby)2#|l^Nn9A(ZIhNvy!?PYtebx4kwRI|N;=9Q zOsia#yjx;cBDLfC`^MJysr){T)#_D@1}xo8_+>iP>$zL&O=3dL;3^ioGgo8vJO_;Z zcQ?(33w}5BEdpL_j8jMPGQ#77Fck7ZQJR?`>li{t z(U%GGlA+5;-72-Vsa$B-FoGfz<@6pKub@qfDZ^dI4K`p-L5x;{wMX|A+JZdvS8@Ex z%zH+f%f6O=;Hc+4`3+|ow0IQrC7tRzH8!GK>@Ky4C)Z}uy+T1hMSy*n0C{`aG@KeV zlNN*ba5~vcW*LyQy;XDhnc>Aya_c1B>EGsZrlH$Vn%P3mGn^el9%fWZ974;@a+L9? zO*T2TluaFfzoTFq+!2Vg z_)h;GTqU*mX0c{OIT{Ck-m^f~8L)q68#&t6aJZko-={=-l%?7oq&=mymGh0M-^9|d zZDoM5B_147WT3I`%~-0NB0VZcMiv#TOoDpy$r2cU*&4gQcM2rddhRn6AhpXXKqj08 zAbsBgrO@%;Wd09W0{iSg)K0dxHC*fcAuJ!c>^&5#r?Exs#jgBV%I_ezSMHFGMm`*m z(q*RhqW&G_HpBNldA2j0_kpYjpHSwFBa0f*=bfal?LPXtliX77J~Ul`lk7)non@45 zE^X;7TLiRTcC$D>=SWK&!3E;`s0AFK^*TL0xS7j7WaRO6%q90OG9Yg5R0!HdPADnF z<3Y@(P4-!r?DHJ1k@eP1h1dsT5|%WC2gwa@wdd;!uztW0@Xf}#G_i~P)OId8c9l`4 zWr^@-E&2-DftEakQo4e$26xj5YGGFyW}1Xs26S~x8_|_6ca>cYSq7@vO?adfgftPp2x z=w5fZykX-A!|p845Lj_&m&*RpP9 zjGAL-hTD^FU94S(9`}&L4WEvro;_u=vh(JHhZ$(+-YV|K_}2I6o1S1ElWgd5Pg&n5 z`mo{?s$sBRD-X4pvi=RH#=WFhO6t4y58kPm2%D}iUsMaV)nDwS_%ONewz~~9eAP~Xbbv2(xOYAyK zdAlcZZEIJhF@L&tZN}!`-~!{4kF{=ljYBN=ae?yxS&qBg zQ>~BWCDW=PCd_B%oU7WG*Qi_{8C8ARWA0M6&FyLH&^C8~t!vxd;kJ~#_*J?%jxn^1jvTGRC9mq zU>mg;6_tPpn~AG7JcY*el_^fkwT9M=7f)^ILSGr=sy$-Z5U`YV@in4qa9LkJSvO$| zCk1Qv6mtrj8pySXCNu&z-&M;l0|W!5Q@IUYy$IG5J)9d((>5WzE zuIAkCUfKfqt4e)^tst$(g(6i{X$3zmO;tc5e|9D&_;IGOzl#_;d>`+pwNtO5&^5(t zT$P%OD(L)rNfon~R;Q#2{LoMciqg$lF^5XuhiWb#ybsMbWX0sG*MKGgEw=K~oJy*2 zLK`^WbK3jiKWj2Q?J@RH6~GK?sg zXU??-<@ETG0tU*kw%HK<@0viXs0;qk3Uf2=fpvOYMQUepcHv#z0b(33sYa1CEiNmj zwW`P|2n${-tmhA*wF70K0l8++4wPS17uBFN9(B@NhvdaZ>~jXBf8UqUr4tAB-+cE3y47*?2j!I<&3qtgL zS~FM*!;8UmZm?`-TnYPAg;d$JdJA8`@vGwpaE!TE`u&+fG$B>iG&H(LYg1))!)x5k zo+_hV4nJ0lH*hx?@{>C^)hSoQPP4v+v>GCpn-2JtvX$?@r)NWCSoMQME@x5!jbatp0HRZA?NHg$@Z=6X9x6QzkprmgFj>`bpgDM{eWhFy{-Q+L|9{cQRI3+U*nD23h`j3(+h7hC)x5|a(>Bmtr z#?ayysxr&jkFK3`@-Qrl*EfW|X)?um1*C}jcz4LL1FdmFT2anCnf!Y`RE6AEBwE~J0Qzz0@bh21C5xye=B zZQM!7HRFQWn&*#Tr4zyWS;(Afiqgp?QV<=#p9BG)^nHG+db*fI{@Enp5xxqxrwrt+izDH%N3Jzt5o2@HSDtA zevWA2&x`A6p4xmd@TS5r6%J7RJA1 zap72!rD<`?qqoYmI-O{6aK%8fV*a}PuFbloZ6+JzRGTcWSz_MKYGZ?QL`^a9FQV=j zE74S!)1mlo9KmU`&cX&{@m-E*?OcS4Hc0Jt9O-u)wEXZ}#V-3;$=d}*_0oNCA_O7@_&nxtC%Of| zd>!IhtvbV-dEyAl7=qUekvB}Za%zf75FC_F=JGbOTJh0=vg*-5_nGu>uRM z4QG-M{&?q1il}v++Vynzpd()8${HrtrNJ}gr%oLwLx-_r>~)(=c3H3!8QiFG7R3BQ zSL&YyjlE(WI-ey&>vtPiV&CcFcD*=m&bUCyqk&WaX%_=Kqw>+2>XlXtb)!1jvWuZh zZJM1e>qi*2X0rSi&1tM5CB#B^Zo2^-C+gDpf!RicW1j;BS)IX3*eb8JZADMAC6aVN*Ovlv^SIdF8_T3ro9s(h9 zT31(ntK5UwsCig^I96W1Ce@!MYeh^`HQ|qN({`J!K!Tw$jCS#x*&yV*d>uCHFF!2- zP}@?27R{1%?LW!82iPSd2&^cQ+4t-FQ zLmtmD-((*;!V;95!=v5NHb6!@2)g%9S-)x*sYSOS;~bf2{~IjNT3Q|@&ymu2zm=6W zwFzO?)Wz^3m>$lNwJLlGd|FJcr@=5+mPv5Q@02`O`Wx#UiKR9Bd~?RcQ}Ez^aV{^!BBn?JgpxTv%W( z%!sALT!gZu2^yIzr?|cN3L9t6Ma90aXoG$)pf|Y^QNp8W;V0Or3IpGBYJ^zic-JO} z-~V7|5pB1~Q5C;Egi?#iyD#80GP>#%QRqB5+i6xGtYKA>KZ1_WlLHOmBdErFAi9S? zZzDeR*?dG*H9NqqDvusA_`)Z(SEDU?^00lEQ{Znu+@|3RWSCo%uX#2-Tjjb}P0G2c z<;CpZzCe1}+P^%3N~3Sl_n*qZ3J(u+C3kEfWz|}VMqaXo@UJh4CG$eaVCPe5;X>Kd z@VhS$t-H~?QyWTNB$M0>BMScOij=L3WLH0LgkP!1K{ygDABJMFYF~u{76UDbd)`OO zzB{yOvGj}SI2@&zj5Oe8NH;5Pl&pKJpg1FvvtS_$_Is5oe}qbGRn^}7Ms`c&D1$bT zCM=PCY|GNqg>dq}St7^Oodz(ha?v1;G-tVp4_#b8dcC-);yXT%aF;$>;4xZGGTA2_ zcc`$4q@i_QFEAQT;{aFf?Hw{Ml@t8d4*9S`3Rj5KhTkbDK4oM3U?N@qwE?nl*Ywu+ z@N-M0jI4h%-A3Ec@lLVT>zVb|cDz?cWZ3wMr|gdH%;L*C>|D6cvG#YE;vK*$_Iuqb zUh>QyX>jv9I#cp8IljT0|2)K2#6%0O4P@D+zJc1ZmhU7`D_fmCd%hPFtLwX*Cp##D z-Yk=~4BOj~TrM9OTJ|N6d7Tnx z+w6ljWqo>;kG*SK8}eTvTQurmZ6lJ~NCjNSUPkdg@%Bp{GL-YFxYnu_b&fAp-3c?b z9<5y=L%g?w4`rSR1p~CMbR`OEZ`|p(6>^=S;#taFDF@rS)AN-w(COq>HJ4~Vx{v}s zlT%GiR0*!7f2HmDiMDe8&*zTVa$oF%(!LY0+o%~$xHQebzQ&-78Wsds& zTuiqj#cdg#jciZOeuV)yPkn@y$dZ{4dZj#397RO) zx8DdQZN^plc@5C}xS5iUum@^|&g`kOI^UBw=rohTBzyEfv~n$0wl;%au9bmttx7)9 zBGos%4uHo=z~kv7*aH%_>vMt96lj~DZn4e<3{sej6E&#&IvMELi;H1(TT+AOti$>( zZ{l@ZonEYyoelMdQqp?asoGngpOpaSj4^RC1a#w|38k3gDUbS8bZKR3KfH9zvOHDV zAa^?cIa3+J>g)-p%NwL`_2fLD*J7%dY+Z(C3k)&wYWee>P8W;GWuvTToN6qh#Emk* z^S7#yjdM-+)KAQP{AdYyH+>__*3yhZRskTq+6<1 z2hhr`GRN?8HU)2!vMg60a*jG}lapQNRnmh$loC??Vu5~Q>De~v9<+Z87=67{m@}(u zQ8yKQyP8P^(osFl!(SZ_45Z{Qq=U~)e!=IK^zhIJwveupa?8}yzOPQBzkt%|B1!~b zEwKzO|3WSdp1&D=IG*G_RD_=OK6_fleZY&aUq1Z6k2-CaH9dN8v2Hq6mo>OMXq)|L z@pc$#y^VBoyX;_mGC7ufc1Z6iJ9sb?*MjCjouM3pz_Klw5`y+!*|NQ&OJf5{fFSC#k8VFIIZ0&(+xE$Q{XPJjpc2q?Jnt2 zvoE-(y9$c>ME9C=P+h;3fC=elRW#2f3^_cq*P6DVKegEdsv&%S z!j7iwk+C)K{69YXJ@VaWR$;6ke=F?k^T&1U$aSx5;yiM#G6Zexjj}aMspnql?|8uz zOFQSS)?fh5*(+&iXSn||3VT?|kDrYC!4j|N@vg~j(#XAsc+ z{tDGB@muV=uTjk#2ch|S1iPbl25z0A4Sd8TIFDA9HwoJCrL5g=vr1;mA#GWck&8AF z-|ia&{bIoipw42NqL@FFGOl512V>i{rA(C|hHgk=>#gK%Jt=q(S3N!;J{S}3T0#+< z-%`XrnN*>$M+qm?Ic4j&v~Zv7o%oQrImr3(Uiy?_tA=$@-K>OpIF%Ua0{TQyT=69| z3uRWD?1)1f>QQfL^IsIPUv@Wr-@T*vvKJ3Bi&J3E`ir%ZD^nXln(DOXO| zG3fn>hVC#`2=!Yc3HeuN5He{l6Y`mH$R z$Z4mklkss%0eXM@OJjDL78+W(jw9b)rv5G$THzZ&KtYNX+P&8F<1UkMT<5~lDX1cs=!PWcM+$~qy(YtBX9-h2g(8@igMoPaH^n8!0niA21 zg7=zcxh!k0Ba0PvObMB|Br>-d?jM6S!<4^oPU#LFO4JK-{R38;UB8>k)@hdrP;#MJxiO?h z6XsZbp_ys3pJX+?+W_M0=@$FC)OmQD2|NX-0xjn`1@1G=RSq?wo%>8x{pSV4NaBM& z($XG5Wn+0J9dT=?XvH-uwja8?F`1J0o5EFf2bQl`7fX+6p6bl5sXj>mY)!cE=rXO} zk0S_wJ(M)O_>i9M$9~g2RxWxcvFP~rl!g=Z~Fd#>5SrX zftnmN1vviqK$iaWAeC+>6mz4DgQgu$^V8)B!A-9nwZ{&We8^O(_(-|vn^ei7x}V%i zvk#db8eHqdQtDxocR<~Cury{a3<|&$u0@3cA zG)-goJk7AKkGI1icJ`Shin9;0cr|4pG{R~md-%wde|?MBq;6gEUqcH}9OUu?|tTIlTQ`UMY1CI<0}!2^^- z&xRC&W>&Sn0@-MEWBT(H9ILktdI}D0RB4m7 zzc0AMyr8|$0fC?bb(F|xm!{H`v!+t0;Fq(e_IBBmQNgd>sn|J_k1*%#$x{X79|A#X z2iG!B^R8Hd%WBs5)EK#yiyx`yIa8d8;|KwMPqQy=9h5Np(t3Z-4U@jKO+M1ubEYtl z1y(=|8^15{%+hDLqc_R(ylGf!C&Oo)(d---?k|{CcP`=PO_Y6!A_w%4Ch2G7B0`Hg ziLYsIT%4zDfPT&pd09EBXOwwrT#yQWL3?`g$`U%Fiv*jQ5Q%+@(Lhhvw1ia=TW0u* zAIRl`sf{vTp?()kF-7AP9Vcz|6Z-7}45oc-=rKMhW&NqRCgC@>B}Tsqzt>j)!)a7tatSx4_I6fgXCEo?JAwE3xoDkimRPN5<}%t_#Pv z00 z?eX0(zg8TjU54M!MN#- z#k=zOFs7zKe9CYF7ZL1V~1b;0&VSwRbbxn2hW0DJkIV7F^{uW30jR;WSwgYu^LO^xh7TZ zG$sNo@%Qsk890r-Qkl>@m;>c-yWN?Gn|3vYCgz$Mz8h_1HqDrSFJm4(zg~d%g zcrddnc!U|b`fD z)dDN%`#ai1JTYQ-2aS_B9n~r~l|=75CW4Yrg}K{01hPXp#V#%5UM}kRy-(V3&LAC0 z9*u(hFb()ZHPQaPKo72);yhMrl81kmkLXo+XyZ>(^bJ!`^EM}$m;LYRD#1PZh`ui$ zdSp(my3An?)0wtgE|H21?S(?lI#?GStSf^phRhV!xNHeJeZyoI^x%YqK2V1~NQXYS zF!Vzw=-#SAtWrWF5U^UA<(z!X^=2XMp3o-NiC2 zF4UV^Jv0q1+7rrtV@#;&!|%|5i#{dj*+Wxj$A@up1b68hL2dI*B^_()@9+CX(8PR* z(d-Fvv?kwFvH8S77BSkUTp=;q|FSMdnKiWWKj?aG3SRR50S=H?jhlUedNjc3QamD) zf**nGHS=!L^Ro_awCs_|)2cu1cx3YTtnVQWvS79`11$yIW+E7k$tTLwVmwqBA|6 z&OZe@3-6iHiF*cgdQ-|Xp!18X1)ZElmI6a?%#hL9^UO5JP;3!)_@CoEm)C_t2n1(+ zMxc9Eo~BdeRpJ*Y99U?9m^+2io|~E&{(*yz?4bwGO}-JmSfWo1O2Xb;Lgw6{1b)J5 z#56{Ce{i;7=28IXXgXt7nR>l2`5Mmo)}kpdOzoO~v%o^JCZ!5dtkbzd2oIg{8R0y0 z2gY(-r_Zv(8DMmZnI==Um!Md+zs>0O{Ls+Ft|Lr++V~!{=OyS?+sT66H$Pd5IZb8k z+8G}ISc{TgncQo=Ia3IOqM4sD!05Kn?9T>YAhF^{3$&bxwBnViiPc4#_0r@)cCSIP z?mERfV#G4VQuz6qV%LgUaC$c10%i4Ny)UP}HU+iX)Wb6JCi@j4)Q_hNp}9UoM{^{4 zf$c{YJclNHfoE5M(nnvLG&1~yz8!v363d->{$nZ;A=d|3ml||TJM!~0relg)Fx}GK z0w-Y-{q~P(T=Dv-C)0Q$4C&G#e0Zw9Y3unZhWh;rq3RG;i>%(5+-uh7Fb?Ma)4omr zOx`^60jhHKzQFm9Pzy}scuIbQeM7(N<__Nf21BAVU4DbEH91(2vo9#{asrdlhl1Xk zN*kg+#!$jr(+^6AXuA0pzHyarlGi&^fQQFPseE|KN3<6n+ThKU_|CN4x&N_3xQ?Gp zACccR{xf=sSapPsrHb!OWz}Pm+|9U2yI?G2+v+I61|G|!1M8%b+Jtd5<~>eaHVCOj z``?2eQ;rs@j%)I?G-aU#(w}k+SB|GphpiI z3q2Cp?jSp*aw?tpU@Bo)@HU3D52lbNm&S0@{V(H@n7$uQIMzipw;Y5K!EGfIkFt2E z?w__vcU+jR`$wfOG)GkN7>o}ErXRS{ZlNw8P33(`0@yHiH1TKP1y{9Q+DyNEG|jVX zdJ6RYt_0Qj4_(lCt8U+#^Pg!>v8&b=SCU6FDg2XZP_cFeDFbF^Z~A0vW>sdvd8YDy z%?(d|Sy`WXuo!Nt@)J|@>o{eBDKK)D6;^j@52~i$AMI*PVs zviC8W!Vm@_E8m|(_S&+8_NQ~$$RCsX9XvTFkylX>V%HP-v>`@nR8;sVBUe%PqT;Ak zJXI*iY6w+-lReIoct7rpLNP*oor=G&x?r~hCi>zP(`EgQht_qv3tT_ z1Dg6u>S7eJ6&?Cw0Q1d#_V}TlSPK1e-!OSw~wkh3sc#PJ&`xlNFVvslzz)5 z>~B0dVs?nc6T3a{D9u@PcO0@lm$xkz!dm&#S#(kAZJ`tw5g9oqhZS(Uj0P@w(MB#f zQNNQH0AyIZ>DL}fWd&9n)Uhxq1;YhV@?z+yi||uY_R@V9QLS7&fzb-?US6K+3)4Pt^D~e*n!vwj7!khyM3yo3+^xD z`Y_>)brpU=%lB}8`1|uE*6~TGG6|V>7J;Ejvt7kGOGVROA9Qm^9+{rd5h;Ux)YX^FAF+Tpu4EAG%HSh z-9%c&564Ii}*I;_tYh8EIE_cyhS=f$Bc!;&i z8y7n4A=)}sXA9|W{RZVHhbYujB$vq@hw(J&lk>#W?{RCJk$cBN1Bu7`wY0)h1SOxp*lU9?Dj|dN--7IvllK|Ge1p%Q?6>Z$4WStueW0sF7b}Q$EdCJ!TsBSkY}C;pTX>xP)c}X#e?$Ku2FQ^ymmGUjopd>fd|fy;TVj zWT^1I7L6?-yzS~uhY82(7g|(8l#gAxg=z5;x7b5PN&h1+0lRz+GFrH}r)~f$B!~=mm(I1euimV5SNbIVL;97ERs8oYy6q) z{X|qzhs`?PgFalQCVoOK=QtKf&Mbta)*Sh{19+@!<(`0NtbV3Nen7V^bR729zKbIh zxhQNLc>+RWNEH?mC&S3qUzAjgzfzdLs8KUL$I_L$)JVt}70L%xQo?u$$a|U*a0iXF zd2k$~OTVW%5;$ukYSJ(MqO2lv=(NA6Xz#KSf;Z>gWwI_Q20Dl7LxfjrICHy)(n^Y- ztb(&kmJ;=>l&QEHAVBmmZsIr}Yr_~XLq!%MC9FfWdK>9YfT&#aSoZ(MY<|esn3({k zFlO12I%YkyX+~+0?D#Q=wMqm&YC(CW#Wgbe3q-k;9rRFq(C zwl9gLRe|VVx79jxuJ=vXUe1&LDbucvUa zXS(mEE|aFxfgmBuC0E9Vge78O*T!hF*>r134Ev-tjwRQ!qO#)~J4um2;StmX?}2UX z<-7YzK5u|y#a#bLRxA>9!UR66MJvmSz4q_cLwV8uoJPINiD6|zpdL0zZx)*t{ldik zS*$@uvjoiqZH66{Gd&iSAuE%p=Q>w@#mr66P%tbk`(C zx{WJ|p3XFO;FX>XS^4HO|i1<*IDa5gr~ z#&>V7>GAnXG*}f&YW6w7r)pr>*7iSQA)>3d!+K(?F$sRqz}0F5vkn{+mIR?Gx<@y= z2cBC=je|v*l*Yp`<=D%-#!kP!2MkPgtv=@!`6ZcPP*jpFd)_OV4uvml=SkWdqtI#? z^DYz`&Fc{z2^J=+QuH)fgey6dDX_e#-E#TIm?HY|=2Q2%Dn7(1x4koMu1$qC``>cF zS@OtdkD>?1IrIg46z!bP>$)#Jis~lm9z~u`f#&A1M-jr6+OztUb-Pz3cQRmTW*qV-6-NpHLyDw1tQsJK;b zQ-g}4Y0<=;iMkkmKb=-o6v1WA%*MD#I~Zy9Yteasf(0_)$V@YBlA@f#?-W3`n_!0A zy^;t~j+Lh$Dv26OxAJtZlBn8C>;{o}fG1?4-z=vFc^v1CxcAAtg?A(&{YKb6$cBKV zT5tuLa2;1msx%I!{h^|S{eJH> zmZsm+olwl^$-!g{19Ih0L|zmU@U5C6XyZEXUKwvW61Ny~a~!N;~7@QL%K zJz-F>?Z?r@FwtL`pQ^9D+J%eyA=$weo6d}z%vxrr&SkT7o(a{mn_Pyw6WZ3qxfY!Z z7d|z{1LllUI>$w_4;wpfV1$m|Qp?P7NtV()1Y+6Tfcv;}6LgkKUFloEa*?_d+sg&q zZ!I{!vJ4x9fhVi%NYR|Y@)FrR!Pgm8TS22{*64h@W;MiEf*Hjbo$NH6L>KUL>M-@CLT zLR3_W!urAM!L!d4TY4HHDj2$Vt3@TNh;qvOF;uUL=xi)zh}woeTNCL+74ehX zOv`si0r&z|&h1IT`H^T8bRHUQnm z**rNmm)wCIPZ*6mF+e15ZZFobeptg|RZt}sF%YYZvX1F5W%nv2BWO=`$l8!0^t`%= zaQtO9&!{J~nK!6X4G~=|Wox22Zp^9{G_r>HzS4k=iF()q7M1%i!J8EOufP#w2fxPQ z*VM$I_7Dh(>HD-AK@=1vDim|K6w;La)HX`^x<1~J$fwPKUHXBrecHw0G&M^2xeo{0 zJPI%8ZGHENe`?){c0`E?Z~5g0^qIWYQqMilvdNcj>NoUd57W7D+%3nVlu%RjP(p_B zIPd3KZ#_hC^Ail19v|@F#nfyE?^nX1@><| zlg`x=HLUEji^U4nN-^b7wKy@;ZaB`hXj@$9RGbL($S+nfY;K_#4;!CMvZ*ahKDL= z%#xo`FX#?!c0Wq2BL@w>wy}F{M zGP(~Ps4Mm>-T^eZp15AjYPoqhX-~J&fcnB@JiW}!jPOJ1O)Kh)j6^?3$cBzU5|kPT z8ep75rcK2!t~?fpH{C6TG^IC>eBIqUA-y%!(E+w-4;y`2M`{Nr({~9X&?%-Mt)n() zGObGxzbFkyQi}$nv4XSO77L$Q6FuEP#2C-=M)>u#>BSdy1ViKkK7bzgXtw3qy6j ziR7+>Sb&GS6d-LXn0Y7Y(*z6qnWI_^!G1wgAaMFE8InY3nbrRx$Iu8k7iwUE#Ej+k zAXQ?%ouv~jrQt0YS;p+^v8Q>Pz&Lvq_m^SEkskV z;^PaD9`iy+T4;l<=}`;eV`WXYEiow!XiEcHiZT`2oEQhj;lrYFXbje}9%xMlh6uv^ z!Gcog+-T{x2>T;;6zw6Mfgtj`XU$va7(^?-5eXhiVUV#I?|BV1F^D?>ZTOe0S_!w( zf9pv|qs7$xabA`u71r6clqqQsqHz@Nl z1~gL63VvFnq4e@wQPC@>!8IJJ$?JkS9awyyEU_4yOp$FwJ*OBx@}KEne;==`p40R; zVu9liXQk%S|5+4;wS^(d*Dscm+KSRjeq|ccR`jDEodALV`?nW64J~&dtYtum5BZl2 zbfM-QL^Zo`2WVE0U(l=$qP~;iDR&O&F}SCeGJx)P5cQk~I@L7m3fPbgEKX4!g`d;J zCzg!f+Liv)ts~Ujq+vH{qpz1It?MXam8K)RKHO8gCh2fV_Nj7JnjMxseqsky>FUBDj253kg1y}S7QK|e`o~G znaw{X?El*u-svv(_Oj?;y=X#4gp2kId@eX>X=at{TUeY&xX?1i$%9I@jJ7q@NW4h{ zSJm;PoNi*5Vz-7ybQke~olo7s*zwhv^w21=zE^V8gm%QNO;lQ3wj?ElwzdvgvVeSoVLdr?a6{?n8!@i?VJJjV;zelk7YV zKh?cS-O7}!W2k9PQEJpB>%O9iGOaGP=!*@_Z?DtvzM@R(`l9BQ>-%xoS?6=QUgIJ| zc|h3A!Y3^#m6PR>biE1R!oAnV>8fP-W~pX|2VagxQ{mT^jIWz}Kt5*NLl?jR!fHNu zUex`M=n|gX)5os{q0*v{-kwmzC}+0uJdm{#ohhgvc1+XjP|JRzvvOz+?d%5=woM(n z(oghkS>h?|9@3`we1*R9AIW4(K#fJ}LBsI9%QdotIW!E6Wge1AV=NlRb!3ZvEXt3-f&$DgKp^ zG3zYTuts~b9)w-6H9e^DAmI}$m_LXbL=vvs;A>w<7-OZRz#y!ob`cTouFr<4eS~3*lvvf4= z8H!!2CR4~|7^Z?5HFeO^s?v9u*rbeaNB+abY}f0HqhGF~k%ZxJo6Y;v!z?2+3ksgf@r3@3-#gNlT;blJp+L0FCMn?4WQs!6J zk#9RvO!fY;5Ac;XGC9P}p;wlFOCLsxWPk79%(h*&A6}`5tb9Q-zm#1ZL%m0dvf--- zn~i{+y5|qP@Xdh-5~7dcfk@n$HowkAA{)Rs$Hhf4w11Qc4*!Q8+x*R`BeoaR6Mf23 zZhtNkjpiJ0{)r*~??efg)@P8)wkd{I+O`(e|4s-OTljj)6AqmEWKImFekUTro4X^G z&GMW|<53W9Zj4(cu%N{4z-lD&c>~U|>vRm=`%VPA+$e=|#m%XcR>x4O(W0b_X+QGn zjmxyzUJ7A0MvHQ(RZbVe$Ht}rjp#X+Iy?&3;rjU{dLDA5mPv^I!IHCC;d*`Z0GOo= z@FhzQe>mh7P_6Rom?HFIv}lm}Y$Wnxi%2#@dxaNg^Gp2&c(Lb~tc2)A<_Z^Dz+He3 zb3vDOkgTg$xY&|oTs7ptCa{EDy$N2}{?#qL<-GyT%Atm%ldPYbkTqMkQ-e z?if(5W8o?`!Zhaay(km@U)4fjfI7l+s)s~8nyCR3B?>euFp?2Sk+Ai(lkjjod z++TT0E!yu>p}4W&Oe?lJ zTloCqi-IiCZ!P8a3`dRCr{d^r} zUWXYt_J(P4A6l4|hmA&_gkH_SPFYhOxV;7V;^SWfKh=k`7 zZYQReTs*l;d%@_2IsrM!d`j5)x9LIYc%7PnJp$w4i-~k-q6jG;oC&f|w?!ZTLG1g&&K@}DGB&q`1+!cT!7&@RmT3LmD%P}@nOq;n_EpTz}| zQ?%_3D1DMB>l9)EG8m4P4QTfy%=^EmMboWGqJ;D9qm~k=qDlj~)?$zUozMf7#UorR##Z|uJ>H&stRzeKa9h;Z|VK?NVy zyuCyhr-+WetA6HXr$?zeycXfu(sB)*X|rj0ElQp$+!Lu3oEK12B!6K|?Qk$G09MD* zD5y+GWpAM5!)S}Xoyw-gw0hi!*jSbw2t--voc=wLwoDajYUh=5rJH-2tCSXCUbbT^ zY9|JKX~|wlwQSXCFH3%fKp7ywM*3rn0!LGj=G1lIeR<_Ns+FNya_jyNB+3Da*6E_G z;nKty8lR3G0#(rVbTQI%8?Q+bGtgM}f>|y=X?#TS)5I%N(0Rx*DJtGiF0`HIR9)W> z*~fiV`kzbGK10+s?Ko%2JhO1-<&lLlZ-0F$`*;SNB71!|Kw1Wu*;XrxVW)KfH z5GDjD*bSP7l&rAyYGjxp=GBN_BH3(rH21mXP+7qux!kWf*HuRr)(yM`o!>{J3o}HR z;c}UqH{GbZRsy8a&4U)>pW^GM zuMn>OAVQs*jVV|Sn|#eX_Vwn8Xp?$pY!T;4uee2McqrEt083&CB!Bje`_qfo&J+HI zDvRNsg&z)o{f*BV#*2T`vw5OP=|$Px5JaIK>#d!y#*N@mzTN-|I#pS^D3LmlsA}ke zAM;5BIXt^9i$A|jhe*_ST&lk=yFHeiYL+UgtoG3{Z#-YrcR2cA9!TrqQ;8PM7uB3E zSLF5HbDdzLyU?BaBE&cygv*jrS=;YT{y&PQ6`p-WvFiS%k$qTwo|Vxx*i7N}!Ajy` zCBd*^L_6G>=Km;;8FEI{psqiO&}z-2Sadg4rDM(|q#=w&~XHz5FRJN#O-} z$!+HTYdBKFZLBALf@E9YKbl_tBqCFH11B?-a{m{K8$&4#p_3LpWh+Br`?Q>Ou2g3F z!H={NB=-bP%DaYt=0IT8{nZ;|iwq0l&O(c%*SbeZBz^9z%f;EJm)0&2B|BNWGKcuv z@MHYJH-ICzCtwk$X813bAJ14EF9Gz`Y5<*Cf(9&M>vCy2y#(g9*RGVe zM8p}x2N#TXJ6Ec<6uUN;`_rnWqLKHyfZRe6y)0Lm{^ddr%S0RnFBL@%51h>cV)8N( zLo1hxP4D!*LRqK3;*@`#hUrT$Pn+mO->wiz%CG$?ahZsuyDNmZ<34-l zLgRk>RI*(uRAqya!d8mcsh&^Kfe73^M4r=#)X!{yWMhBTC4D4*|1n&b^s&;u#(X4r z!q1%|#eNHO&IInJBuqYMz9}U3BMZd-`g0KbY+i-40dP)fcOWb`OdQjH!UDMH{MaIz zR^MzG4CDZQ@L;o<%*n3x=+w_5u-(ZmpRp?Pf3eak=qUYc&Q^d@!2d)En%VoapOK<1 zA+0&DP5HItP&CB`>dK!WYV!=@E^44h@aRDxpF=Z!HfrjZ8B^=jvB{D z84%q_`@@m^ei8BI_jJXg%X=LJ1_r#fTVgA%NFG2pN+ULxa`}Pm8oULDSY__vM`j zeOM;~>8CBis2tT_4BB$}BQkpGx-Y777{J^)J&3nnwMXM*b=}NazN+qOQ(2vtvhBED z(Mxx|qSNbzi&Yi6xn3NvF}DM>9$s^4YpmI2g&kg`$?T<;vVo^pJ;(t^Zn0a&B*TH@ z!7fnpOVgbVqONi4QclDcVz`C?ZB;gkMow*H5(tL4v6};E#zx^^d?ti^rt#Z)P}#HSP9C2n<4uMPYoo#Sht7FjcbDbwm#tV8U z!5VAAF3Xvb^-vsHr@M1KH4awVNK$3hM zh=9iqSiU5sZ5DM6f2Ks!iOo0)VRE4nTSTbx+F5ps7oa~WhLsi@gTju50gwMc=RNSpV zl4wB~W5Uy>|3}TXipa3RW5yNH`gMmin1t)vJ4(j(X!jRLT>Y%`q<#w4O3X8C%|{gP ziL(+ZXRD~}+ys^8@PQYO*V1V(ecUR1jE8>W&d1WmP4o4oz-=Ny8DE{?TF;*^f1-T`w^Eed#Mi?rh#qf)Av-IPif$JoW{ou#0d*Exnp1Q6MV-(ErjNjbjD;0vKw~eelhW_Hf&jl+tIV)$gh5Z=z{r_Oe1q9M3@qz^F0~ z#6f^Jdr6NYaW4GCiJAFkYPf3Sy=l*HB0_mzl3xBMRG;68Klw>vij6Gbw^2cB^Ohs> zo2XhLzqA>vO#jK}fVcEB7&8(bmEB3s_5;m}1+D%&qHNL9JqaJN88iMZS3L~(=6Z}B zId6w3qh93#+_Qf(j+q|4`5-L!tXu`NZWIf({ngk+YP3U?uX=b%q2^uL$<1qlMZ%HV z-g?_=2k32!p2rPqwGT0EEXR~Gz<`U~4(a)&L8|obY1*AnM{eUWl!DuDDz+3RXCqORnpcOks zsGq|fbdq(OFFJ{JEN|`Uzw~scXzu)OQK6<7cTn;!;ZuFkTr=LuF4|!ze+8$waOpWV zJ&u4#+;t6QHuz1jzB({cTi{MBc8T!%J%)kIK2mqYOB> z(w|Z6;^KY=?d5BFenWVY)ox68E^r<=Drzd>uW9{mI7HdOsrVqAll#A-fqO)K!=Y!F zXxAPwPFemkyXIc8$Vyr9M9=Z?IlcN_q!>bBp%_rb*JNc*Z}L1lYoAEA@_09$2`;S= zq4^#SGQf}tM*3&JXrx4qp!h#TX_rWx;n9Y;@D9;Ft&fZOx{t)CjG!-V_yd~Yfa-d6 z7oU**0i0Cz&8IF0;0z!4gccnTO$}KOW%cEh9uM`58y{2XLF~~!t){SABMM@jYgvm!*?n70j)TUowEfG^!$H6qz{Khb0y>fB_9#BmAw0U zdgw#icm(;f?$eVafZyjnxgCXli}I-cQPlhRp58^yd35F|THdlUm-8&nHX0sKY*2(G zvfMeGUFVo^wo|5#rIu%5?pW|D5-wQziMXdCi_g?&+N2|e=Q~Y~U|r5@L-CC^oDpT{ z^jT3kEZ0iz+G!W$^OknP{C)sWtma}N)}d-`m#O=-4OTZP{2Y7;wK4SioTwR||AH%h zj~GJwx+r&wtoctQe_gXQ9p_A;F6YJAqVGTPIDV$R{B(nl_XZoZLpPWgf+_xjIHMf< zj@)Ckg9-ajJ`ta3a|*v1<~Va}j^e59n3Uc9Ptn?-_>G|bmqef%`53vZ@ zPsUN`6){;U_m*~C5qp(xLuuqyAwtGH_sZt?^5$nCp4@r9uPmMS_&j&sTjhCwdUR7% z3bwiz35EOpD2d#wyE<}`z#!c|ATI0A#drF&wT5?gyIZ2Rl~S`GExRoO%cb1mMoRKE z9w|Z8;}i?|xV#oIGW+3eu~@0l;t4nGsFo<7`?NaxI~?oGA1dR?*p`2yW6LMW-=EZ( z&3I4zqg?KZ070T+c-{@k%aFWsl{ZAz{3jBbvP)4Z_uW}Mbxy{23f6>w_JsT5o}uQ@ zuIMo5iSF!82CaOm%x|;gDj4{u0TR?4{AN)4CkrT?x*kBr$M6)*d5A+04<2Oy`%qlB zs&3a=!YlD5yzt9_7lL5~?1QzfGIEb3Zg$oyF~v$bm_k1P2(|Rp(^5QX=etPcPvDh%6bonR;hEEgy8I&= zIE7y0TH%KOMk{+wLM>~J{@SIZXaBEwW~JO|N$=i(Pd=S63!nYktBw-tW27)tjA8f+ z%5LmP@oz;+(YPx*7gWDuZokV89puZmV!t88lq{(|>BASj*X)Q+;Vg8fR=2IJBIZaW z-To-ttlHA+k0PS@);~e3jr?y7|6BQ|P6~rIe5)h_&Hhi+FuD}6C>)y2R=V<^Xq$SZ z7h5JGu!>4_wa<@*j{F0Tl*wD?@O#Z+9O=t+hi=L~O^8nYJB$mw9^jT09Fo!|tTwOX z4}-NkWHaCsN+9P$eiv%2j(^sDx4O&*vZtGum!KIkL#4^DXK#s${sFEEo z^ePqp1^a)qrKmFPU=rq2Q$aQG`C0pQ-*jwTy+V-lq)zCn2I<+i?9>`o${(xA&jHkF zwwk6psH2tE2#niOb#v11=-G7?thfEuB?@*_lZ>5t-$_>)Tm3>)9Mv`z9XX(Orp?P* z=*=e`*c1vCypYGScI9P3nbWJtrKmdAt4TqURF8Bex%w*lxu`nWc<4nz{#`#)P%$;y zF#5$M>RL?gZE(VmL9boitX5{ z|5EDZvPw=&k^B{5`@)W8)Vr`1a5H*Xd z@}<22D*1{7Y_x#ldldW!lN}eV%uxDYr-7x_rOL^foVzSlE2H*PB4^T;DAkMhlu@TE zb7t_D0O}K{ey9AKNe=?m_P$v#vs~rS$E&5X_D39g9$RU zxmv&~NtrijQwRTg&e2&gZ&bj*XqR~Hk84_MNEds0hzTw z?a<~-W8?6z#@hjFvm45n%w$k1#PIiD~8TK z2y*v6Fy7JzZT{tg;+Yxryqx-NJzI%N(XUI}vd0vA&oC;V#dP3jSZ^*Bz1^|ACdpA%%4@pYj=2<7t#!PHkPknGWnkrLTaE^eMD+{~576sRh7x zTr5CrLwa_YP|sQ^i2o)85215C*{R> zdQ?gM!O-Tknd{@m>-@AWRIRVvK1Clx)hMs7Bwb!5Gg=%aw3*|mX_#8Y;7xy1>G%FV z@+zjE!&JX=Z90KQI`6_ZRu+weZ~nDLI0@`qFrNQSr3YbZ+wxaB7RuXK&wD7h5!5!` zKV49wpuoUX>L0E)P|BX9o#ARbufr!S6euL{wv45a%4$2M*$J9nSsmwf_W1wEl=D3W zMyTzTHpeL~LQVFv|6iG2j-mVr^&4fuF^aFEw)cvH)lnDIg{mtzhIUi|PPoaL&MIYMdG7_0x4>E$TOuf|v% zruay;gIA5i{{vFlQM5Bs?WByo#urVN^;&S~e`K0Gl2WQenA{zqi=Mv@I}T7%M(CZt zsD|3vP-Js72OaYCzB}R?cP9=tYC8{DKxrF?Q)rah%~1bMZp{f5$@Xtje&v7zXC)^qX?v6ACW`&Nh$+VHJ!ywwm&j!`=( z6^79HShXFUEhlWqy_Q;2nLb#TeIsf?_PrUTqx-RzI#}s9hz7-~9k5|=E?SKsn>e)( zqCqCtQhU;sIJLZTd4QhTzqUF@sW3nXbE&r4&kAQG;vhlW#;bFcNB#5FTAS>OBX z25xmLOWo?L{S1!13+Mi)K5|d*^}ljYN>HmBO8;i2v0X16qbCV!b7jGHif^C}F_gnS z&T_^o)>Egl)VWCEZcjq%E(=$3EgOSBlSn+L02y3OZ#>@+tSEHwS|IXGp7^P zkxKY8>U2HYmpZm~EUKLD!r1~StFbyriRwazChD}nZ+RO`Zpzyndt^K;j4XOObonFob_ou+ql?{6v^i( zuyYfOt-w^S@Qd^Fd6jslc>KZ5Jh_3rJJF=3m`BTZBDW-UxiY0=q2^sqQkyvZc7fLc zRkANorDWB&`rtf{V9zlrrecsWW+EX2c3FR`Vu?lg!lBRh!TOEi?Jq|W^qLNomJGQu zumhb=hWcdFfvPuC>-tnZ4d|KvUS-2^m0N9@ANEA;m-a->)cQV$5sMF>vxD$?@aNC< z&7b@0pIhw{M# zSF~O7=QIAf2|u;o$d#CWT>JYws+ppeRYtd_E-C6-?%n0AA zW0hs!XK(mcEobGprU$wVidiQwy52@jQGOkjU9GL^XywqPI@WU+v{xR~u$`Lh8T%YO z^;78>YM^px5w-5AhWRvO38WLy zu8+(sN5W{F7w)MpG5!RRqfctu%mixMOI=>fz9Kdjc?G6*nw|Zzmzr#)Y@AL>ebj)^ z3-AMHXR}-Qnt;0(G&}?OH+G{g^E1=N0jn$R?)^(}<&C~WOZ%vPb~~#>k#F;a4)jr{ zJ2h)k3(X1An-fB*FRPWNv3*se;<}JB`>MS{Y&XMX636-)cBAAu$Mk6o8xb9DgT}DC zXZ*_6JkZV;;m!JCo*7Z{J{|3+)(wv4Q|7EueJ=V;7Ttb}i?Tn?Exc=Xov2!WwTbgL zG8s$y7H2eVZAY5hA7Z}ic)HqO-CHbRQM7r3b=P#9OHsQy&*{PhJga5kso8cR?}6&K zJ$l`cpc`k*dc&Y|+TXyTF+*d7jBA`eo|E#5NGrwh#PoB(d30yp&{J7H_iOp)XBRxB zP2ik%89((tfiI8?6n1ybCXTKQRC_A#U()Kqs_M#ER4B-%b&93$2Z8lHUXnUk{a%^( zg0ofk$YIqAS-0Y8?qv;L--Fdg%KPUOKSUj%OnXk-hN#~ZpWVTdMK`Yh5lwzW)m=*W zXLNa}dRm$HlvWQ@dn>_D$$hxGNg4Ho4h>gZR-MrH28VVTjfXZI|G2u1ZTKk%Z5MM= z8$7eXCG(j^Gip%M2sO{R;#)oc0zCQrNr^f8cH3rmAF0||*`2uoA$9yM4IQOcR7!NA zm7~-uO8h&@9i_HZ9=)aT@6^gl_FL-lof_ZqMv`qt)3~iglIjt7Fu0R?39R*=@(FjjRkUN8YDd*`9tl zL+fBbLcH(>KQ@2McF!_b&ZbYT!9?FP$i zTc^<3xf*quriLk^8O@spbuQv6IcBI${SIhY^I+0WkiO`7V|c!1=DMIAyF$Y<)P+j< zE95pE%m17Q)MdIFtjv5sGpDPOcH29FEuM9v)6><~ipOPAGoh9&xI`;5)yc}sdsKdg zTH>2a_r3t1B?s$evmLH3Gw5ZlviVuw{0uZdedY72Hm8oIN&4W452OV%)VSg)v0qM) zv9WS`w7U`y{`_+QInD%=*!R207dm??1Io~VnQEYI!!nqUHF`6(LdoPcRf^;!Sg~7y zwqPamH&*UAhuutH$7g!51G{s!d&BOqJC;k>f7=@DTBbu|XebeIWEkUUFYO3?%l)<0 zxRdSQe6q_@gMv5jHOoWezcW*D(zO<=cxL}Zo4ZJYo&sxtmR_1#W3`+kNbAzT|sP020e^g!U6Cnvxw2A%{ z_M=)pd(vEWqm{D8msPW}+278CqM^)Aq4lK3SikVOf$Jg~;GR%rzB*Mo--V{nS63(- zyt7eskCpPoQ&&V?7O1}}yPna(1!|9YvYLK$ADh*r+ z{ky8i4N7`Y#ho@UQ9bFxLUp5f&l?puNS)x^>R5N@ibqF;y>NChp6byEew`KfXAO75 zt4-A&jcCmxHA;!B!hnLUwG(cIA;m0Ke={VMzeoQrR)--z<$#51d221c_~$%#?RvJt z=(w|m7A#f6jLsXm=ivT?+iok;m8EKett&Qgz0Q+q8K(VN8{kZ*2Du>(stjw?Ju{)w{c`UYfYELQ`pl$lj%!wS{k_DAU4{m;74wYb^z?R72c2K$?EaoV}RP(K*|x%Sx=1dPmUtm1?5hjb=c#^#&^Yv-+K}ChoA7 zs5)xs-t|AL)7^^IG%xGlp9C{wmVQ=*1}#@hz?BVJW$o3pU=?OJl*cHe+iNf(v~VQXwQ4Bs`bF(nY{JEA=C(v0&n~xGtz>0a|1Y?z{e6tuu2F0H z#QzLDFfBMwJOxSAG^6X~H+;=jW?9;@2KwPCyKKPnvQoAo)-GGsnyypNTj$tV_^A4N zwT!`MLnDgWr<#;N#r8~c4SKvC?6mDY1^=ejGUP08M16n5I&QPLM>Bs@e==-+XD(Pf z8>`vwk#uD*EVut;tJReaZz*gC*nQ4YOQCWow1W%1u@u_Lg{qnh?c_rLQrIrFqG8zL zM$~y1mbrKTG3Ry7QM)PK|DlmNYJJ1wg^lQs9DJVm+WdLYZV=b_n$GP;=}8M3k+Mgv zrUcfas6FargYPSIwyS&8k4m>Nu2DGUzF@XsZTK9zikfz?Es0zCR3}5}A3^`$)y9V8 z7v^#+e}}2${&RZsyBcqJOO2@gdbOP4P1INYV`%yOI-R@ZfCvct&_Ts3=^Zrr8Kvw8 zxE}KwWv||^wzdjvQ~e@bteq!~!u%pd*+`zwE~8V-^O>``XO=zDG01LlKn;PtyF8^G zR3nwrk7>_AwYK5jY_#+c2vO&e8PhF?n9K6X^{{%y@Z#Zh+EUiLEEPYZ9yVCx4af!1 z`y=W?>$-Uuic)rMI;w^m_H1rMe;-xrDpe|zdQ2T-sHT~lvga5oTC@oj9an29zTp&q zT6@h!4(yh8G;d46g5*(&_oejvC>@9OwB}7v2Y0!370glTm5o@ zFjF&0MbuKmB~x?X%e^sjOETAdpXWZ$J?G2}?>{AQ&*y%h=RDtY?mc&FaKh4{%4g|9 zE`C3I|5L5+38=1(x!tsBCt&=E`c3=xgr%Fu<2Bv1|4u+1Ex5#;J@lldrAL4G^%o~C z9o?T^)UKU`Ba?L(wWg;mOQY`{g4C>=N~sxyslg+g5wvFU_axk@{*t$8a5M#vKGu7z zJwFAhJ_;_!{d&y00BM+M4%I$54HfWwC3x;M44lKmv`42cLp-LRXBBB@ED;{H;m@ni zSZwauaP#XKST5RfP76N^YrwOrlfO@&wbXI9pVc0owVZ1fxdu{|KMAE7uV6_6b>7r} zchXQBJPkrm8kGb>vSRORL`=Y9_5d)^Z7-lU%P(gn*G9#v1X zx@#Apn1;cCQU4-bSShWmy?qg;>OW6vr57!?-BYV-*DhIJ_gj9#VJtXWQn!{i>Nm^3 z(XD5~jb!HWWhZgqSdm0LB!whq-_;iWZn0Gg#=pRet$W?oe)-)JYAzXrTfz;n^tuB5 zO=ovC&&w8D`JPL}^v%txg-y zGf@2jw!>He>e*5$gTSNV>I4fAihZt3Dv z{yr{JoP(0g+3In_@=>|kDI-9y|3@D~`2zc`ySVNIZ;pl_?Ni2UYi`2%kmn)o+)c{~ zkC@rrw2gmQ`gvUXxSLkV4hQe^4{lAg!)*la_9|Nc5=$#>cOpbZo`6U#pIE2mJl^W>v`AGx8nD8;D=w|)Hd9;gjVu?gOb_dckSX` zOY`8LU&o(~8y)c?^W+h*dFe>ade0JH>FaEqq7T`xPTxB9o+YlFe~s60`&qAMcly^0 zFKhjJ-_pkG*UOjSwL3rmpqc&#Eh9e!lm88ad+HB7>@54+(x&3g^51{b_Y`n{8`~VxT!^W>u;}54gH{PjvmqKa2Nbjb_ms;ky z =5_y^YPACT;j#A5Ls&p8 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 Rs6v%AD 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 #vRu*(tbS!F2j&f16KXT!y?WYPRDf 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�$w{C zmy#|YqG>z8@t5d~PL!3NR->0XQO~*3C2dqH$M5Tni)SR^q1&kO_w-Eg_oHOSmMP(D z*m~Ba2(~)4W^7e;=&!mmRfj+~6Mc|GPYIVRcGimywtu%k|A+LaBYF{UyOt9b`jfkr z=o}*yiTyQ-9RxGk2Y z{qiJWBRqkzks0?jY}80Bf{kCA7xGSVT52OoIBYmu$Ur~WqwO~0o^CxYvK0&P>~Kvx zai;_QUuhWr`EB4`zz$(ObiP^0)L3} zOON)8ws1Vcv5Uc=!F-myi%ypmy`}HoQJqr4%dNpLAjQ~&djSMpzOv*{es09S00 zK%x6JBbi);(QwgI9d%Ny7Y%d~rK|m>rK`p=7BEsC!WgxVb-r_Dla5C@pPipNcX03uX?Q;m${0!NCv5*a>AgN4hw?zsw~&t7zh&eRET zqi8pgZHRMMA@9S~FnxYwH;M`fXl>(q*R{fy%@@It&VdAf_TB^@{%FBS}* z2M+?aO>0uTyD-`yTUjG$kh>UUXyvB1aJrrr5ovRF0r85N9)sHE zaHCSsV&jjdIc?X1ZXG6E48#>>mBxJ3r8#bg8-PWqX;Vm+J0uHP&RSML$3U_!E9w~X z98^N3Mrzzh9m@&_!)Yxu4w=kL`daA~Xj)l;n;0h3s=-6Fe0)0j|3_ zl^qYzy!V<=%k8ZCUE#Jeeb*wviZ~L*5I%#OAFl60^jTUnN-862Q@wJcwD02|P%z0- zkT1#M8I$2EJ+JSgcYb2I;inR6Pkn1xSZZ_!@T9YLjY054I#*8AbqvnDp}6u6w`1T6 ziqiDZUo^4NL2z_UC^|qyOPwmyhyYQkIPwtdrX<&(4FO`KO)(U?nnYcVC{n8u{bUr? zOCm2J<1xEodH|0~wd(Z9C{9S_r_%O7F>tj0LpMwo1(E7quQCUmXRd6*(;9CghsGf$ zFDfoG));3w!pK5>eFYy_b2#|E8!FsVV|6&x$Or(ca*9&xhpHe@zbtGF#1!K04%{cB zN@f;Bq;z8V128D|#NZEt&j}BfIP^MXw8Z$Dt3N*wj??4lcH!yql^ae_r<>8(+IukN zkh;^E?NmYd>YTDdFl98Zgeilk5giQ(#U1t?f`qq2=kjc!s5d43{xeMo5E((?t_t<0+?OmwlLXrW)z zIgo-YiHrJ_s%OZmvWPXj(WwCY25SIqOn0G9Yth*tfB`N?6hgJ37nMaxEAMOn3py=W zG%*Y*rUH6V$pR?l9{{SS0WDU>$zte__3?A|~jilyfw)s_=I>v?JVd zoO{d3U9`5UFn%)|S?Y0aWn4P;(I8!MtZy>f#iU0+FUtsnqpVS+61$YwrFgZaF+Al0 zQ9EaN4vAq-if@IpWJrXv7=eKxdO<8nVQ98$h)B{uz#R&sLxj<4*rhLfSf4yYMJat) zI}{B?(dm1PG&)px*auc%AF#?`HYWH8?h;J;?; z#mgY_>T(xS!}_>z`d*O6*zfC#Jk=^@-ehi$I{)PeP1G_%>@$@As5bm#fQ6pFjZ$Yg zFovtNeh>ru!K&HWFDth)Jbtg%>*8Ze>JMxP7jq#fH~o@X@m(~Oo(JPugPZBJOwVrc{8GOHgBqX9LA zn*$*uE>p*|!HI)3v!)1e9HM45!i{=hyMuI~rWjaqRcWS=w|em~?*FbuR6kNwm3j`# zPKy+m@aW?bN~|qLNh6og$=YIW+`cNT(@E9YqdekjMekKJCTdE2Arf(Tz3lv6*4?Rt zm@`%CWcp^Qp9J%zhq7fat%(vLrF1Up0MUF{T;?!mW#%k;5+$k|yun4{Ipae~(W0vqzk_~@7R`&l`JFc_b{g?6N|ez{+KCr? z>tY!&k{|08Z;N|<4|!+RN~g1IJ?XD{Vvsav4z-ODzS6gIvWLcq1(Fmymt0MvrnGD( zC7MKC>G&Knn?yNj^&Hx05|#AJW6#k|6V{R2x!ox7vz`eFpPEVoaSW(8% z&yrp>g?iT)LG)v+2-e4}G19*J!jGQCiVC(z*qQX51Nqb!9yM1L=lTv7Y0OalQ@CZ6 zDPpJ2oLh}-KqJ5im#_Vx7PeEiWH9jN`ov#VxZ@4)AE<;FP|}N%8wh{naV;HNQX@=| zl}4CQ{%f}W_%{espEe~5SAFwN$LUOh2&X?Ah=$Vp-Bh6=7J!DCl++Moe>fw1U_;Rk zkAr5>$v7Y-cY3x%ylAY`Z&_)?xl!SzpNk(u8;M+pyk%$eAJ0&)ndu=>(_{7gaiN2_ zYB+ye?OQ?#wQp`TCQ&#TS817kCBE9h>YgyinrR&jNl`o4*)~4=WPa}JVzlXyvnwSf z3KzrmTPoxhh9Z#5ZO}4<3}1!pXskf%6NS6JW;+e6)N~tFNfLMmbrK~ei3)9lY%#s- ztu(iQrn2JT8ER4tbV_q%OC}BrmdCEz;$RFjmX?J}lKFv27J%E#x@PN}OW+FLuIB}O z$zna}WRmc*y?77cLrc)JB+*A2n@{bN;T+M8p^?cVNh&vyP9}>W>HP$HpDez$n%L=3 zKJ8nA*PjPB5f`Op$Mcp~4w%YC=-bdCT zbFVF}#;!!Gd_wzwTJ4!w&}#ZG+-e-nOA(F9skJa<0Ap&TmNuz&XZZ$&RjKRo#mWrZeGqO2-7&^PxxQMY!F?y%O( z4i%S&TLx^dK5}9>-1dd9yi6Q~66pscJ7giOn@@mXN$#wiNg~J2&^%9$(!akZ)$>%U zkHm_?9BVY@sOx5IHQpO_4u=kC;3HR;Dxo-`l4(74Cu~AvR^3H1GeWlDN<_#+-@S<6Ng?=XOn z-*CCMZ+Fw-E~36PXdpRs6=n2~j^@*tz(ziJuc-e~BPDkg&C7qfj@fDsFEyaKHWo*1 zH44=~7f=zwsa|e9xF`M5RaB84DD=Lo@N=GkI!r5P=Ex7Pp?kWCpY+OS=oKRZ>3KKN zJhI(2K!3~Yf&V}s_pk``OWiF-6o(tYRB>Ap9!NiQ7yeSchqR=-@GJZ0)gtXReWiJn z)V`YCqEPr|chSK1<5@J-;t^HqAv#IN2avgkXc3iiP-VOe&osuRQ*eNT~Q^EWiY427Qd6qP~_O)7_I4Aro)!^l91rKqbs zJBqfDQ1^z+)_XkF$eGAwYS2p@k_O?)``%)7x#W9Hu6VTm;1jOEf?V%aJ7dA-z-P3s zw@3}lnE-WD+EzoHS|X#-(DdjPceyrC@;#If-%*1;qN7y(F0Jk({0y$Bf~{vI_$i(1 zBVsCMa@+~nCO&_RI**vGKP&-?n%@Wh%nobe22+p8EWblhec=s#*oj*A1=2g$q~U!< zJ@4haI2aK+QbqKHqfX=NGr1q%`Ala2V3o{OD4?IH8rb+epg-WX!+&T!=r(s*jb}dE z@emDr8doVSO3lOBCAc0K{n+Z-$XMXGS`{1C*Ul9odE(>jv;E-yl&a(8*8oWS`L1+! zAm+YX14OVir!zSW6#JzOT{yFyl=dAtq>6evHEAhxv6EJDQ0F2Qt9PO*-;28N`<@vn zB2-|yITZXo>PBc;qfYOJ09a~-H zQO06H7pEL=OS95MpyOKYinEQ_K2zHKMTgVGK>xCxHKG7OyJ3FCl>VDaNpC#?Pdm86=1d4LE;TW@WrV*VQESgI>wJBhT7$bQ$r>S{5;o!C}R(P05|bDz*vs) zR=uWp8WKy)YII$B0y?W<^Wfx1srCL^Ekt%j~CP#A==6gMRQnffsm-BWD<`7$+Lq zpDf5zdJLn5>B5^zri)Zr^vjR zQQnw}eviQz;6l9H%~)(V>M#?fV5SSzY_(rwP-Nv<8a7#kmpY$V$e)Kh zArfxiQQ9>by3Oh^U7ZZ}d)I*MGDJ6NS_2x80Y7uq26QGv#7p}68FY|(%8W44pYT5Ns4GliPOap zX=ph*JY7609^8p13}xjV`aMg8*}m!s-JW=tUS^3ZwRdx3{?9-Lg8Bz=7}gb_3wO>8 z;EW#l0kuDG7e=0D8<&amYmeRVMt2Y8K{U0QAtGH)$b5bi4Buoj97tfBC_h>;LyRuI z<6E`Sh}%?orU)rM4oQ5yew#Ya6jf>^AgNSXsWls!fHhXff;MBcHY@JrHgV^4sxb~P zn`*75)uE#^MWkCwjHOjOHiY2ZcUArO4oxkQ`0)ZVu)_yf(=b+>iS_$#1T3_3gD1oP}LL6;2kkO5rTOzT|Og zI#-yT|NTi5+ematnek#5J)0{|mh$Wy4lizVYvRa;dx@#Abw6LYg{wcyajfrXHUUUlfzLQzZl9=qR*L`BCx3LA3E`z4&Z zED{0bT5M*BxDUpDFA~AYyQ3_9guUQr2UO>ewb&ff`k}>)-&m9! z#;LKJnB}f)0@Sq9%mr#`h!=y+t^Oe&k41ZjQ@~$;nMlZl(`)KmC1f^Z|_rDpP`4#MWQ>B9HXN4H{+DL_iIlI@iBB`EY~*cE3D)c0pGzSO0v1+3lP7zsM# zbyNK+QK8JHRp?4;nYfG*#!#?c=kbhhJQk8*j8radrnpriAS@$Hs|y=7*60^^~LM z^T2wK;rFv#gpyfJ4PV9Fpx+>Z%Q=iv2QhKAwk&d19aZCv9{ksA-6ps^HQ4}v|C|q6 z|Bq}yCug-dNl!M2pxQwr)ym6OeYNrmsfY`K0T*i9jqe%SNLsTV4+mb@D4GS$<#!v# z9$bo2%pqr#mE{WPr7p190qdc>$fu-DqPas}aS$i{pfilZtbAI(30n<|Vb7K8ALxPw z?Ucws^4%;Fj1kizGN<;Uj}Yg{toGFfZOS5MDRnu!$w!@I0t3{n5X%LC?XiJ_^WiZ- z!0~CCiPuJvSJB8(ZSY*aA%ck7oF7S36x+yTG|50qpxNI}brXVtTXulRW}LAfaI znhRC8UxrsYOU7N|s{Joj3(VJ+b*cDn(K6y{aDmjkdA(m{1>VnOxNO|TXS6?qA+^b3 zggD1%Ry(7t!zSi#kr1`#Am4TS8oE(Q#K{u}2`H?LMv8BYL>MeC3CkW+qCS9qy~gb$F(kM*e#-=Z8B{!d@}2^3V_znl(c$ zv{ntXM4`K8bgNsIrs3P54QO~LM{?Q+kK;Nsh3*p`6=xqQ!be9`V&UQ|l+7)v#!PCR zQ=azB9=K2ZsH=S90f^dt`j z;Mub}tE82nqX)#ul5?hTDZDwi`3#fmp@CW-6y>FFrqJkvP#{0UO?MD-z4C`nLF0nfQ#?jWS}r>=MoGjk?&(z$?3G)CtkW z_R~J-kd{AF?g=qa8atNSpA=>F`*eqB)JZVPyVtb(q^PCOL(IE+a`n?m(Nt>5XJtfG z@vV0c=I8duyr*78v+@*{qHXTdgHzBQb+9pe?z9N;AASijMYsxXY8E2`0>H6q%(Wlz z7hO!*L;+_+UBmVEsyMfpW|>diXG=s~Ypakw=9A zVq&$FE6WdzEErGYFNzA%TZz_P6tSfq4doiHcqUhSF+S=e=`V>Mym8R?5=^K}Df{Fl zA?bX2xD@EA^lSUo>uFM2@=)9^jP|6*m!VcewDfAE-LDA$+IlTLVl+>`xXMKB5PGel zyZLUoG$&iAb{kwW5UF8#EwE+-8>_o)U{Pl@tk|sF1?25CvPq$aO%$H^%*vxuH$`>Zmd+s8i#e2Z z6Z&cJKIV{XCabfOdR(0vwA ztzAOEM#KAl+?HyfBtEB?w?t+Ao_;;()|@zZ2NY-HwKRt*?0+k&6 zvD~;7`pok4suK7NiptH&N8bS3;saBFnXUKXdFu%@>{?rww;qOGHd4(8u%1e#01NA; zG8Q!Dt66HbdlVufOHmOaNj>QL16WT#w$o<4ASP0&L1h0>Y_;_7q$v*uQltV_!||%V zidZM@>q(J&^V*L4m-^8-|>iCk~3TAoI#s~cWK2F5##xx6KC^PAgAjW>56~f z?7yF2uTh%wh#a0_hbZY0J^dj3Y49`A$$mm(j#7#RBCZe0zV}S@z{aIQi7!O8itWB( zcy-uup9SplrDNO~z?XFzd=-JIJ?YmMLY7uNq^GDBl5^)EPSE8lTktna>3aqb2qF*_ z016g{3sid@8*8}(-sIzK%Ayc&>itsG)PM8Y!hZ#;d)G@?__LD1H&xa54vJd%IqkV` zssNR|sq#%=x|;PB3%@czutc>{mUU-&sw1WErkqzIOKNtP5?_mX_Ln=eNF`+4QTmRe zm#;-_ubt?;#pw7sTJskTWy8<2E7gA^s_ME@>Kn1zcIkJJJnvBy@K(gT_iu|nIgNjy zX)^?FGgfo1Qu1e?d{!ASf>m^G8y-_No|gRJ zy01ooJPJA73~Lq<6(ij7O^ky zL|ZB3E;+mxyKT?Dh4id#N9W#)>TVZnY2)g_<5DtMRQ9zZpAW*PL>H7(=gRAy$n*i0 zN%h-!D-iCg-)?1tb%J!h&kdjX+VuQCe4TKE!as>0?JvFzutZyr)zQsQqOq;h3-EPF zHihJg=D`cvdK6QB8=@(MCOpoJ!0FHuifbx0 z`d3sPZKe2W=*w$vvBA}92s>a!rTxYvP^Ss{&h|L`%zy{OzxNqNhn7?$6)>Nwh6>;D z-fsqst6wY-wT{>wiQ(u{AnZjl!%`z3?3yz$E%d?L0?-aw7J!Nh5PdOQ|HJn~wqb~D zPIJE5x_BvALb04@cIXhpqlO_oE14SQBjV)gX&RU>+Bvvi(xd~|?Ap|%EBT^~t`5D= z7q#0sf;P5;G@`1^tFFgqCoz@OxWh-MR8H0c*RTQXP^(@zU)TG64gOQ5aUE{5on1oj zyrJ=CAKN%{%H;Iu7D;n5Oui8S&I(o~Yp=G9S~$?vZaZABi+Y$@xJ^K_*Pz{xnse0@ zE*-l-4mwjs{l#YiR7+=iCB42xRV33WX~RWYCz)FKdp83w*5HQ*GWN%3oJfy8+L$}M z75sPY12k;jaSG6z{6jBKfienDW-~EUEurp%eNelgdS7ca(Y&u}7k_C*X?jx)X~P9t zr#F?Cj-928dQ&Th*B3PGVesVzMOv8#OVb|HMk`ai;Xrdw)oUBokM!0i_&||Xbp0sW z+SJ4`q#3M0v+q3XaNK{`kQQ2-8cXlikYa5*FU23Fq$HCsX59PRjC9M!)ZEysHactF zN2A3&_FAg6nAuRJ1@Cq#M^w!j)=tgBGl*CxfS=+rwi-2o#AEiHMlez>Z7x=@Y*qR+ z%ie5jveA|LsX8=>cC*uJ{xG{T9kVlq+jd00a=ioTi<|oEKOR4bH(rXn(B$GKFI`hw zQQY*ShgUf3o<+u?sKzAih-Q?)k-N0VKKmL>uEv}s41HSig;KdktSQ1q!VJfRjqQnxWCDN)B^t6O&y!3b!4YD_lGBj@N zi3#qwV(LblYMNZh$pL&b{4{;2X{tfP988Xe>SfUYF4s#c*KFNuEv$B&8C4Nkv?EHVxwN>X zDb-LJ6?t$0oyfbCsezPojL?G`#Xazp11{p*iHi|Rnff?Zt&jdx?1)Yo092-IR;n#=(OP*l9yQX-mUXS$lo=^SFziJk2+x0R{%yPGLM z8k0(Yx|!;_Y%jsV(TJz#2z>Vbh3un{(x%1wdFR6DbZOH(sb$~np6(!!Za!srn7T^+ zzNZ%+CO5-nR~7GB8$HO$)8tiqmW!G`5u+`M23U|WR6|BuNi2!#S&-2Yd4+zch100B zr>VE^w1H=}Ju60)Hb>`aAh&MtP)X~v7jf4)9$&-gJu`WGnL-UOOQ{s;743=h5GH@a zAuU}O>9JnuWH~L}uAWA*+m=o$S||6mMJL-@;P2&5GMRCGhf>i@7rjj7Y#&SmDaO{M zf4od(T=zzRO9up4SkWr@XDfnh;UT>Kw`uh#=lVZz!CFTj+qd z=~t;=IQ922c{sJa=%+Ht2Rl%0ax~5LF}0Ld<0-?ABZ@ZB%~#U_?iy*elW?v>j%7?8q^3KlZyD2Yhc{b*4DIHu+%5FBjHzbjjmT0S<3IKA z9KzbwwIFBC#ecZ0KGj+YK8>*V?x(4BSyNSAd74<(G#U{ZHh!j+__Nl}^w8!V&X2Eb zO7qK^lBL(d^r)Q4UmCEE9Q{oTY-d*ohNd^64gRJGdwp-1(CWJ+XMU$={!plG)W0=o zQGn^O?Qan%yD^ET8KLu=bR)+=Q$5M48zl#t>Ko$hRDRO^r1F;=Z3#5FMY(F3Cs**M z)NJDyOxCjz_yc59ky(_9yD@n_0$XVmGtSBw3 z8fW#_vVyd%a>#<`2YC>?H@_aVoV9y|Uwpi7IsO)&wd*bW&si@MGR`SO z3yN~0HxlUG!K!M9cm0KSKLn^*o3yN7IqSZbwM5Gz&N>%B!4*wQg9ac^=^f9#z%;HZ z_ySh*eKrdOWu2xR+noKTqA5=2wA7ik`cz{iGw-0b*^Mik0(G`0Dg(%o2H8V`O;$SR zeU&^h)SUVU^PRTMHfHH*bg-#1ZL4Bhrnl~JmfBS{)fwHORd_LxZ#=SxcZs3ta`ZUl z_T3(|&naDfq+0CZh(4r}oRMmvK1PGo>xxK4?qR|sRWcH(N(E5HFchCXn9lfHoUak9 z!pHV|ifie&kD$&WqENWx7GiSMN3=gn!6BwNy^?a4hJ=_}8Jzyb*#ooNAM-uva)_yt z;X2>xWps4!82_UCX=qV$%|Hpo17cFPVRy{R~-(u=k$-)f*$3$+zIpn`9Ov%&cRc#F<7!Y~IFdHyydUZN%_b@(T?OM1qolm$Su zZ;OkNs_E)9X&t9!Z92y?KU~YJrsY-PVm-91a$1%bXSH;tUm{K3ItMxwY3f+l{f$cb ztTGz)c$O?;Y~0F&>hrU7mcJEPJ?e6CVL$3z%QVU_<+Tdqg0BYS3+}l%hPfwX^rA6e zFizepwOXpB+82ytY7RX8U}^e4jFaB?7?j8&V~{!n;?yrI6SKAbIIzw`cb*;Ll~KR( z>Dg+o+H`6Uf#i}{cXggk*P~5G^e6G$cxZ~rb#6;jur=OZnQfqBQLtJKbUzBHdH+J~ z-vIBgqGs3?pr+t<{{KPE@ZK6~qBIy=y}pW?-$qioXrN}q$S+WH{kht73rn>xP}4sa zsOkPS)O7CkRn$Bg#cI>_OVqfQ{2$bqW>8)XP;>MP)TG+dqq?R@oh=2_Gc~Av{;Ar( z1dp$x=FbeEru0|1MoHad>iXf&c(J0JvdLAl3a6}KlPB3D_)cd< zo&rX#71a`^K6UAl+FfV2uVQKW#Qz6Ns%&|8rSv+c(PeWrMsWQqqFN52u_hqOXUG?b z8m?7) z`}v35v-`~K?C$LD>}-QI7&4z;#mY6bQ*(~cws$dAwKi`}?=Tc(4 zTtl-pn^NQD0L|x6`YB#+sx2{wS3h2M34Xl3dKtam&5oBG_F%wfW%#=S_CNRWazh&r zI5h^fZwom@6E%-Iw2)hy7l$G^YHM*QZD}FL)JV85bl|Af|5PJ0Q$NzRlwCAex{`lO zd71Ihd7yQd@i6?5;A`^lvY&! z`%qfbTK>i2^Vkk<>V%9FdNb~>=6A?(2XOHe@uC06@VChD_rVk@ zZX++YyRy=|%J1AdQx_-u((1PI2F>Lel$eYuT*ew+v|jM*=&$sXAAe^h<0t~p#?`KI)kH11?`Ff7h;mBn!Q_XX5NEmQiCEH^Yujq$^)I2pP zRt<{gL1_qL>MhhsV9U2x#(hs1WCJwCGwD=ExgNc1Cl^YCjd-u(LD$;LYs?N+5w^TL zrFW3K;RUmcCG=ge?4<2k{~}%@mp!R!N4cBjkrG#K8o}tVO6eV88@)~E41bm`e}zl$ zoExQfl9};_&ZX4Zp@Mp{#q%$MQ2)r4I(3%kNS*MlPjRJZo#k1REf->H+8qC(*qVOE z95BnX;dW$X1&>~xnwQ&6 zwlp$oPwT&v*BG^q_hU%5{x1d`hX`^p$&CKYnGP zh9A)u7KW1?t^e1cj(UPt~CN z2;ws*HSmfWc$VYL)SyFZ&^{jY?jcWLvdLyOY&{RVk1))X(gu~z#)snWdn>pLg0zNKFU9T>Fd4O(jZ|0#cSpU_WdJmLWXbMBgbdbD7Gh+zl4U*4jZiLc| z!SMLuZ?z%vYR&b~ydy*8XGRwD4)Bt)mh`T)XP8{gqL2E0`-v;v8zwt?27Sd4;S1&D z1Myv~qm()Ko=2P_`&4PnKhsxI_1i6S9o$ z60@Q&U}g9gxeb>a>3~X5_p!XR9*p$>!>adOBRue)Ggfx5k#!{$;itq! z5f@6C#$`3o#bu2F)8{wo)o?k?Zab&O-JsU%zM{gPKB2G?a&zCypv`gwwC!D6JCl}( zvelX5R~zw5gI^uKhUTppAx|~3aNjG6X6f+jtkKq%HnuhFGfyq!h_tLMfe~P+} zl7oy#q^sHYq)nsb_8wc%<3|X`f|_+mX{Sng@CJE~mP4I@Fx+6uv#t&+4{^##PSsop zr9Vf@yEPYQ;JquDO6NoAvF_`t5>=xopx@!<`U@->Nj{i%%tdLVQVk}sk z3#H9t=byx-edDH2I8b3GmYs zPshA2DG|4{qDAKOtwHLQty}R^3_2(EYw;7WAfUzP`?{n2tsCHvzIE;aG%ns;W(cYa zpijdualk?xbs9gi+F1YU{WFe2PrjpK6tn3VU+BzcmNW>+ZHnIiAip2M)R z(zhMo{u6w~n@p$5$^P;|FOh5^H+bN9QQa{uu%OrfEEf$&%j5M-7byjC z`qtOz{4}{q@W^D|mWN=7-o~3MyhIQlHFIMQ#=8_wpJja(JDA0S_v+KsI9;x*aZaHA z=`ynj!5yf4ab&{_+MO=%*Yr)HQPbrPn%Bv6cDn4Ld2^DArprE#X9x04Lxo(}J*Z9y zi_nDv?zuP$K*|Hh&iAeVk#vT!wFzADH$5 zb?2F|y1qL>lV-}*t9{*9UOM{Wmyr?7C`I{ZIUQ<-Z8S4w(w-thB5ucwcV6;-0iJ4Sx9=DXUc(^zHT%wQ_ir-Uxv-aStbptVBZ2>y|tYyJKO9&jMQwWUqW-# zpO&fqTzQ-(RHonN%275ys2iX7lE2>XEd4uIzF5bhHxzgC5urir;bs;Z^yMI!sEc<0 zLeb!4tQ$jbvgBx&Uqp!AAyi&vO{a2QP{f6qSr+16u=A;h=KaG>ZGDSEpq}wT!hOfLeLQ{W`?Z>Qy0q4M#u9OFT~2VZQKSv<}dS^!t1Q?F?s(e zUuxHHeTBfz5B8T#FSMQB8JnwZcRMZG(XYyMyuGSlo>3@=jOUxCEV6+Cb7SmD_2juX3j@OXaFzv+nH|t%kQw^|dT? z(CTlr)VQ4nP2TUrjZXf2M2P-}2DEXh+)VRw2fbK|rRA$fp|6H6T5tXbIpxYr>TZVl zq_4wmD9l@G;4gp7@sQp{gq+|%t?)BPf6Vt_32n`>cBDJGiDndM;%Y^jWpadewbK!P zjbl}6zYIG9raI;wSSHsrlD^DB_p*2=J^o4db-l2aizjwIarq4!pNd1sd$}AKn~CXa z?VZqFZpi;2j@v?wcKc&s(1~F6*17bko}3NZM>WHSZ$8!oIhP}63MBtVyu5_ zdxTPdY>pSSR?3;0p&9gQrQF+fb_g%rX4S9(GyO=%(%qMrY-sQ*xs`)vCfKSctXu?e zxDB0MCHK(S*igu7xvlnBH0{#!^FMC$rWLC(JN)%0wCGr@+*g<#UfalXDQ1U(0b+Kj z`FSIK9U!~f09`sa%->Z$H}uAKli8QVmYGs#3Cx1W>XC;gYJ^MpUB_j)--vpkg6ua{@~*lxoRWN}*UY(%k&{Z6#b zAf1K&xgWLJAa~YehtO{u!5&Ow43R@&B*;1xm&{O9Mw!I-oRBxT=R#SZCqx2 z2tS@y9Tnf>2JTPC(6sji5&|MRE|cGOin%gixWpCjws2$m)OkNT`inff=d#c$iH#1A zHp!gazbFh#!zH<)Rf_y#rv58lOL0cXbA)h+F7pq5t_JJI)(E|Z(9n`1O=t0i-s^f5$zT8t<)1zFXx6?pic{ zZo6>jobB#8S?FuU?WOu>f6=I|ax0DLVH&+vj-cYLNYJS%)!8QZa!Ep-gbs^Cl>7`O z9~Vn#^)`8h^l>e6_x503i|ul_k+gpezViN{2|M9%-Md5HC!NIp7X6XmdB`K_)+&79 zpi59BW!#dwj>AU3stJYX3-^-8k=#Bko-)?!hW|Yt)R|O16Jg&@7(&jn+woe{!;rx^8{I%IbA^8}^TGZgV4X2Iy@>EH;4CP>z zNA>o@McJl0kJ%=97OlvYN$a~ zc~Cnw$VLs4cu+GnsCbDWeA^m9!D^6R4Z4RQXsjA`MGZU4VP@HiNZ^nfwvUIsnqLHRq)V;94tdn7I z&Ug}+wbN&|#Jj1o6G5Gv=yieYQ!Unr-_<(TCl#FI_}j|2`E9JYFr264|AHDEk(<># z)*r>m9fBrJ7NXk6&gP$R_}$RYwc$gm=@(jjM6RQ8e@+EQ|$$>Dzhrsd5>1}b(gn>F~3vXG1rD5n9zz*!KM^ae20pCN-a0os?^N#OCuW$WP!j6sFKI@@wA+-d1*?)XXLh4zST=l4qObTtTWi)7Zr>q4f`F( zsQ;leXJj{{NA&oNTvylDBUHW5)zBV;$@{GA@9a_8t z_lV-nJa=M&!R;t|as8lsH1dKx&#X%TRR7>8FKlr(cQ%3NBVa$Z>FVgLS#_71T$KBG z=liPwJ~ZK&G$y?GQ9CZP8Gf{|17kc&A_z2h>E=Z_s_BDbq%JV&hcP=ATXA1j2*da$ z!U}m<`Vm)y)u@U!^A2^qBzJX*`(Kd`cj)vbxlUAV!HpYB>4)qDw-b6tmB6kdH+4Ya zOTyg2%8d`ZqAlWRt8ahDP)%)v;H_>`&SkliW@K$Dx-5HYQ%WQ9Z;|&EI95E2j?m^S za=W^2-+|Y0_<&Hg{2xCWctQLP3wpy{_GO*HaV-V^iC*k*3GMw;zN8tzUpte((T)VG zb64f>H50#5;x+lU)(8PX*X8Qk+f{JZ@4DPrJ3##rL>`yTZMAjqb?&-c%lOIl0^GLe z8RJOSH~6`N63V)PhMK#L3U0{3+FGGL^zMcnG5OV|Q0!Z~x=-D=7UtJc>|5Jsr;0gf z3HG10-KSo|AGW7AzSur>-&)wWlkgS34?C`qv9Pqc_^MsX=2-`PRo$m9o`-FRZ@0*5 zpSo`?tVdJ4zHFFL#L%X{uysu?Q>Mwl?exWf#iL0*cbmF!~a&VeC#8)N}TL z028GVyrY9%HfICA_09gF&xLZMR_jDCj_5m@>G@tT7)$&Wp!f`9GfaT^><$W)Wzrpd zG1{IC!kG3$D%fL*Z1DTi7R2u;LTm5xC#Bz%6Sck5Lh15NxtFvq0+Wgw%P8uW>~40X zJs)UeSo#ayM=7@ksr)+-dTL@mR5FblG(Pq??KuZG+zv@Vjr$(}gPb?Kog-0b758)6UT@h`)~ze(U??(RTPs;JgOn z$7uw|W#t?MSzKmnDjt0smykJo3O;Gm9obErIxdus-;sT+o^p=ZSL1XSAs_C@6Kzk9 zMQ)EQ5EZ^_EVks|kv+8Gh+TPCj&v#+f*jjUZ_bU@%#Nwtf0X!wUf-4dZC7GvP7e0d z;tc^OU*P@k$&I8NW5Dgod>V)kn}(d2Ut^e*s?T~(+wRFJ<`EoFZ$28$u*dM;)V?p< z*sL8~j{EdCvHNm=DQ7frnK?MGiiO_O_hoyVuY<}_$$wMPeK|(5<0wl5s^tTqCRIRP zE}}sXsVLwjdMbV;SEr+o<-U@RVLWq;^VWi|q;R&B4xRH%o~=F;#`a(XH^x41V{ zlwyV|W;L4rRQ9xK+(%?n$eR6#wmg*;DGorroWV;w(q?V%a=@pD#Gc8qnk_FV>zSM{ zy&VkT%URUA2>I#UtCE<%KA;6fa)wzAU|=^JKr?$*0$smPegBrHNhyQCsP#;G`L|rp zW*=V06;sUURK4we3Vtq6G@CyVfVndYsExhiK-KTd5}kc6+uD?LFPARm9zA<5$7rVx z45gqK@+h;V13>iS^#2msnF%7Sa3pc9=yI2n1(MxM*;Tv0e<%gKM2orJAGDX#>B3jJ zHZ6Q9dpOqp&LBE(Z{h;dv^!MrQjRch1}qpwrjz!S9B#L&8-Va!snziAHpRb^Yg_K< zkG=pM&WuZz6v*3H!ab~rWcNcdbEc^c^ToI2nUQaEy_q5H?+ZZQRG|qDH8}vB%amrs zEv_^f(vvwy9zc5nQ^K5RX1tb8+o7<&HbJdd_ZqtdrvM^toQ#wv95J47p-m~*}s*SN%MLEmobTUy_NlJs;Gc?-l??X zZ@I}0C3g;Ro5@SPqE2QDLx&MtL88 zdWf$eWI285LAv*HW9fAdkp4YUt)B_+We*!gr5BpK^g6A1FCUh!b_eQW8V&g%_tlwo z;0d7Yx~C>)+|qZxMh`#8$yO%7sK#pX1P<&-x&O*Gx_a#^p{HM^egDd_Qsj5w7%qS* z)b*q6*l%MioU2F|#T*I+k9bC!lvuqQwrLBQwi&VYw zWkczUhZRyW)Xy#*>IZZYL;WQivEL>)iF$pOk4R1k)!U7spf7SiUGp}T3U2X5TK7e6 zE+usarsZgkX+ptY=D(ZuujH zHrv!wA)=$6b)ND{SD$?D$08<6Ho)o41*WTi z3lZcrL#E1-ktVEjj}9++djX`BrU)-{Oc%*#6UnFnc)4U4gmf#J^I zNCCs8Beu*@x4vm5?8iS;t6`um3zL3|1JlL5REg~c5MvM|?)OJ!i9Imgfy7$}gwjh} z7H??`LZR}-J-O7rYN_@4#!x6I+kL;&bUQZ5rg1Ei2sV|1HO&nib9+?4R;434=3-N&0ztb2^i;?C*t}4{_-Xe_;4$_9w`x+(ef56IwP&@o z1N(;3QF|6GMR2Nm-FYSYRXb+vRy!dh8qZ(|6B`$|MwXL4&!;vH%tvF}hsHWEMZ5UV z5c*?8QQnz$hw5yxnd8>``7zag^BpQir7 zX9f84YYTb*hjDoi6*#lQQeHHuws)bqE}+sL<@~D|r$?29ixiAnkgXG|NlvcJtxYS4 zU6de-pmAx&hF?a;8j1q2FU?*M$N6xLt6T`N99vcht`|dSvMZ}yD8pDa#fZj{SpPhnvS%zDhsx;F9m=@znyfgDr;=NsfidC9bbj0?Fc(8z1`U! zvmOYCh1r4nc(NeUd7!c9)+6+pEZn9;}}3dT1r2|8{cp zWG$rIjUmj9b{yD8r>l(VwT%ir(FMA3jAJ|U_hPl|=Y()RSoDlj$F;(()XR$nXj(0# z94|J|I^uE7Du3XhLlynFHWx^$#yaaF@8_2&wjD}(CuBD8#kH^{G@=^oE)B#s5PhFy zx>1e!hwa_3>Ru9G?Lnh!FBaY6;xZOZ0k8C^JwZrzv?OjfE^>;?Y@ez(-9inkvutT} z1o))3rE}FWcpT5C57n8M)3HE-=gU{!Ilg(S-f=Ve*I@0W1L45$X+tw>uwZXLjvF;o zFiiW+(6M0!XE-1H__mUT(!-6{7ScK zvKYyW1Kb24h?2dTqs^#*a@5I9d856Vr;)U=K45EG(Gnl#W8>v-K)}i#xsgu$uw==L z1Ke7XuP+Pm%B;fyv()Cq*Cq;o;r4_j_ndY^-*f8lr zFfgZEsLWQ@W+C<#0thRIPh;*tIoIVqsLfg#NtQu?n#OZzZR+mNBAudrz|(emoEWk@ z3Zr@68rtg5LisU)`9HB5cwvm4l?K%XW#3r39>Ah(j@9IXsO9Uvn!M|>9@3rw0CqH| z%(|?BjYkE*@KtoSE}IhY(jS0ld>sYdP_*jXQMG7P4MV;nc!`|oL{7S^8ISxqPaDE4jcn(&<37OK znAG7AQ=O*d8Opx#xaY^Kp)kfUAVH(Knx_JB{u>$_%3^H1Jw>Vsnf+7s<9?!Jq3A1j z`XbRS(Ue_})zcLJLIw3$4c8Cu0IEBW7K2X_I-gdl`ew`Mb3N8cQ!R=*)Mw0drH|+U znwBSs$036RShYk=c%7dmJL|2=C4R<(tu6V_(jse1}xGg#+$Q= z{HB}@)~>HKCi^fJ>oCm?4EX#pPSpNw{iP)|IE>YtY|~2=K|b#VFuZI$hkkgXxa$I6 zl!vdOhW1LX67ilTe>ql#nS2**v`&ff}I`ITwaa_hVeNhui4rh^?pmmfJj&k*P73Ip$ zX_b~M3TE_TIvLIarRJd3$26fY;jETTo{K0s(d%0+rg{-9dDXj9{l?6z-XKpg@?5!K7rlNKsqhX7zyx2N>R zY^2m2!TOkn^rbNisJFvGaF6GCGW(&-R*cVxPPN_LA}+2M=C1q>x`ZjXR2sz{ZA7;d znH!CaWFC&cc~qz*b>b93t0UPrn!*+IAQBaI%^vKziLpjCG1Sqw=0fslg3kAjJ0$rl zoO(B5wRA}w%Joxqimh5e%bKu;n*KZJY7@3f(|Z(6h+@kveX1Jj&OMC0zhOc4bL==B z#yG>=tuTjreZx9fOmpMHUDQu#Ku3TxKlKwYX)MXmwrJ+!a?+MdX3oc`XnxJU7*w2c zs7_PX+VY62A(8z0l-?AH_;d6qbe)EQG%cG7nzC>USpZ?E*C%Z>4C3ExI8N;XHQCf8 znng$_U69Ko^(Y_)HTPpQbI>?0qm9uR_Z&ESG@cj0whb-;#=Rc%=vFi)WUidZK@bIL zdgW4=80O{D(;9dz`c9-qXPtys5ErJaB!q$Qi05-Ngo`*`b`ieFy`Yh z$bz$m{Je1ZaF;)a(iv+ejpe8jL3D9mikw4Qg@t<0wikN*`e+Cr{Uo8fqtvil z2-9zn3TRtXGv~4))546+#wHnkm%%*8)o7K%G9(=+^j3kixjA#C7R@n`e{aSURO{l> zY#Q90MM^*FfXb=MQT{gC3V@EY>2Y(|Iq&TNcpX5AvCPMQpu{3HMn&TuTfS&k`#$5J$72dMQl<*tPVB}F=! zQdS%rrHNcm+IaR=Q`nERE!Z?|hkgZQH@&G7{nUbGYTkO{93*RHdBjR6HOi?LrMHA7 zXEUF+wq!M&EVM{TRSdjTAylbjIz4X55^I}-MsHk;%c>gsW#Y}#2=Rpfw@v}WP{%~X8k|H2>rT8^(enS7F% zpT~k}1tt5i4qruoqVyN<=kxKALx=A8x|p-s%%`@#Q;!0Ab;s9@eokUP*ZyjXvi?{@ zm1!%e%gQ?ai%3Ic;`;Y_ecP~DBPrVi@Hy3KXIs`>b2x)Ow`H|l_Y?!k`%LxWac(rg zfYwf=$YeH7$}k4W^lG#(nRT@}`pLi)V?)(6@=0OeYVz&!(o@)4BfF#P`0aal^i~h=#Xk!Fm1Kv+73Dt}5WN)t%;bV2w3zr_-qp=&WD8HzYh)Y<%JggKy+m(spEz zEs{%IM1R_{D*e+D9-xeL3hM+Te)2o&)`@v*@<&s8C)T3&u&*w7I>GIK6v5lKLRvAu ziXTnyIyp2C(@?rBr@OG)cKSD5lG0^> z$dRP&%I27DDF$StGwSmfR;_7;ZqP%(GevO>A5k`_KOMu3O1@{~wf@uSii@85qLjRU zy0SY)nt}84u5@G5jWlc|b?(k4TKD}RijnJ57khfpodtz$O5=rv9*x_X-Akua(Ph)A zjn8?#RO3-bv+oZmXTp?E*dO0Rw!|E!;~rANN-GWX&{Zm(cv4 zY?9^KVWPD4M~4;AZ9h9VGpMqseod%zDPt@d)k7#OS3$kCxXzG6W&`y-}hmOTKfcpyKn2ybzJiP z?Zf68Nqb(Q)OT1?W3@$bjHV&D%Ga}Hiek?0TmbM<@4%k6@`r3L-dpY_&Femv){s!MM7&}f5V&B>9xXeoK#lZzWxNvNSd8kjx(dWc-yHk7gmd z;Ws!4h6nfj{-rPIL}{bh7RmlTFxFovbPT4s6R!&lXT+y^=Q>jA7)<`h-UDXDXO5{( ze~)1{_V=y zr-X5AxHS0=KodUEk#Vez`>{U(!VB-Hb=&Ff#5}UUaGu+=r;zc?%{sX=@1$@H_?iAh zCu%<)o|>FX6Ru$`W2m`w8=CbXkB<5@T9?_0n<`IkCOV7+W>aGaQd z@X1UHot(f%OJ8pS@$myGX_yNPxeNq1X<)4%PNs=z?4A7}?4L;BmmVBaE5A#7N}mWz zrc)sZQ{L0FiL96Nyo*AFh6d>qGp?hy+T`{6o{copnAYbrdhD8=#KIg}pY2;Ej&BXY zzgOszO`4yj=*jGmCNh<@Q`j+SJxMv!Sd_)E zKRNcYzTYdlhHveLP6c#fD&`#_>1?pH;tIIuzNFRZtiI-PN4lQQ>NLu2jXn)$kS>EV z%k$P!SdRJ=xVJgu`d&Ws)aSS2<%EOSxZ{^YGcNK&-jC4d&EIBMLo+q7+$_uceme6o zvRHjdZNa(E^H$Gbrbg1ji%56g-xN9z8E!fYZFEHrJRzTFG9Sr<$GMcp^^+D|K*;=} zGITJ#oyF=)PCVGIJXkRCpwv0cl+tFymp}JB0JEM^-fY&(ye2*{&bdD;V^a~Int?fL z_Br6^JpG>lqdBaGRFwmq{uiL0wDc_Ee$cRlI!MFMAb9W- zj%H*zkC{`oxy(f}<-taV;Hh)5Ry6E1LIyrofv#C_wtqZ@khhQ2ka=0Go-~n%j5UOS zSvAR?hgge{i&Ep0_y~JgCYd4MN!c*tx1B&7wi*0Kj^;c##tJ|H$GsZn2cJ2$P#5{KNJ#*)C!cw(k!C1iMgd)p~l9+AU&@_+xrNW^4Q2t4TG9 zwJ|+;5TYERka^hpn?vlp*6*$%CgTspOsDzTh`F#BG=6t#QqLu*o-My4X5$T>V`m&q zVq=Yq&!K5=`4KA!TNW{iVwSRw7OM{!TEul)y_8S$V|dbjWS+~SbU*IkofCGF&E|Xm z^-t()`JM%?oOzUusuHDp->I$llVx4cfp8P1y!HRoTZujA;#2eYQ-8YV@f8MC%|62>_n6ct$*M%tg)0Bvemg~=l3iOi?2KGBi)Z_~BM z7l)ARa@NVX$mv1}ZCi;#n7bS^)46+j(HkZqV#vNi1I}Uky9H& zkw3#=ULHbYe`Y-_d+#x*QJ2f~;AboWpWiHsAR#kH6hVz(@?61YNK5k|`j40Bmlg1z z-jAf4E5NkyHp;z*MwGl7R(-!skV&;38*;N@rVwp=0L@*E zX`QbP?Oo00nvdP-f{V)acIT+o8a7gs){+X=u;o&h9T4W~S?a$QHSlRWK1QFVlWW-; z%`i(EwvJ8FJh!0N>sTkPz1sy!T+jMz)~8V3diK5927m0ZUG1-WNZ^XEA#_0kr z+{k<_eSWN}_6Y8WsbC|+{U)Ylu?a56g&`EXi8a<1I^xZTO{{bHq|q>_KOTgsTR7T2 z^dNu!;f8I8gW?(K+Tfqb&$8SYg?GN;*6GNP{&d&3I7^PdG9Rloe!}j?YL8!mdT4CL z;wVe)IM|X{1+PXke`QTI3qt5P{%YGhTp;t`SQqKvkw|gmA2jGU*2sI0DL)v)u*Dc_ zgVoD+iPr#z`yd+X=`ndyu) zX&Sz0;!NYWuxw3(XtLPKBDDnLQTQRg-O6@q0-BP;HWsd32xBo}8+)hCtuES|i*{4RrhnQ7SL9aj2Out;@P%gqHQgGhWm9-HhobudL7)=!fq=Os@vu zfv?BAnU`jdFPY{sAGd9U6#4R2f=~Y>e!K49|m!J$)N3&BFp?DG4V@+h_=`FGaNa?KJ$4s&ff24 z&R*ckN}{(N{q;M#A}iqZ(oTx_1DHwKoLAWpc)=D&b+8HaA`KFI31m~z}`(Hg??ndIUABp`(OsHr5L2xqA8V?57(VC1A0g(|trP1J%rX@n znPosPSjN%5)aDrT(2NeDVaM3UkS48hEX9*|3|V}YqJoKa^6rTey>VZ39pW6(gdF5@ z*9?k3j{IUJsWlH(1c zbcnY%rMf5C7PB7nxK4HXg)DDi;ilvy(>a`;&Py4-Skch95pP1?r`Sm;DGMB1ZlIvE z*g6(}3kn~6npJgNkk0YwPp0su#vcs2r=@RCvwc>+b9n`FuY>z~PNh))Gfd~)bDAnl zMUpKV%02^?bIL>-cI!C0y;Fy&f^%HvR+aM|{W|pOOU|+}Qs5lmYOfVI*I`pQ&Z8X1 z2akMo^*OgNXfHVjH`?vlz~5L+ea^Eu=b*_P51T^pRV7R-p@Q>lt#oA;fah1yunSP8 zrjs}j?LxJS=6|K%E-*!E!7<7zI{yxsUEd2#X~9ZgDYU8LMoAZ$mvn9>fG1bdh3Cv) z*F*)DGMo2>wqAr8JRpRMF0xd+doy@V6s|yhXE~)HbkHRh60ge)=qKHLoS8zYA$n&Y4v5c$NFBn zNNhQ$K1_BuFnUh9!t5PePT(}CdqIP`&;4|mHgAFbvhNByjk+My*IG_4f3gOyIpcw~ zoz6Eg7&6a21ce`|*Pj?bMoa^A$WL_fPxhVbrf~w=NI=WfPSJ4l? zi-S^M$mB}h)G~OYL7!)4@>b(UZLY!l(qsy_M&y!ookiKx7%ps?Nfvmrj>vf=R^=N@C9XsB=qxc(GfzB+Uvp3Lz)Sd*a_Y!J#6N=sRFILZK;3!T| zQ9<{60~S*6{)lTp)G|_?{{fP>D3~R zZtoZ|LL^eIw)&ZGXwOa7SMuU8Hv_Eu@c+WLyr%41Y?ZVr1_d^AIyJlvORxl{8#*(l zZ$F*--)4=i8}nGF>G?1q8{$0lZRTm2Q;K<#PS`g1ra+g_ZuCybIdn{QqxgC9Xk5x75OcU<0Z$nJJ;hiq;I|`?$ zSs3llr;y#zMWTT`PQi9F_#8LzE+@C$Y>l{z0*;d` zr>QCQ?R^&K8gcbJZ)YKu+0^Jn2ktYb!Hw$L2W+#HISRR+nXPsP?+1!pm$u)yBHkGU zkm-ti8vwhERyHX@=6ouDP<(oQ93zPnf6wgF%MkYYdd_ZoBk1xRPB( z@xrc-vKOTonL?|duy4%M9KkHh>1{GSd%{N8-5rMFDx4#Fuu;h&RVe5Vt147L$NE-M znMIFjgPtjNtvN*tmEu9$QVN%+Oy{_x52vW8i<-yOpXgnKZ`V6~I+JvAgnpdOt&#+VT{17C6YPR6gs|}?+Ltjz9 zw?R@-ANm>aEbi&OJl$blPprDxspT{Md;es_YyRQmaPByfRrM($gIa;t`%Ko zk<}XvmUeHM$)dlRtFEA@0j)M4rw4eljV+bN4}vhGW~$2eu!jMoN)div9eG|31m@Wc zb>!)+VoFDzU*X{4O7>ZfwV=*WA88~<51k?O%>G_?a1E+Oi@4 zL!n{(>-G;@D7EYjn&y+s>eI!3XJ-K~?Fvl+54sy$i@LvMw$j;NfS;H|W8OkXB2{E* z_mTA%ZF`HwJ0oDwb9^tV-CQtmEB;PLL!xR;hQj?-YI2zV z+XKLV==^h-?0r>SX_9-cm({pC?Rt-?vqHz;v#ydGr*WJ}{vTKa&G#Ls`v*+&PF$lg zAK>cm-yM;?(x~tQYvg*oJyN!v-d_ylqCEMSZ-0&I{>yqwo4*6}mkIRazpSh4vvvX+ zQ+dn}yGrICSwn5^p2O+}`i>vj88g>zAaodS@S`-Et>|Auo_6EX@|DpW`iEB!8xBPB$C$hA>@ zqAx?Z1>pM$G5CJCF}9;r4!$jr&KFhlpg~_*1EVNf@s&N4_H+dA9V02TgvII1S_|F= zvs~Z#JUuL7!!+6(KekiirR5y}T{7awwMr{TeIiGe_q4b55$8xUQlh1I?SXnVoLU(v zt#nNVtjye+f0lkTQht;^wFBl|D#dFQ=G-cQv%=7_)nKl2sn5`Ajk3r>3m`Yli-*w} zE&8dhT1DqPv?V8~+@a*3R!7!tTE$Tsn*#PD1c|@yQ42$!RK<@tt@h2;j1^C*3I`Ss zCD~Z1r5mmSOEtgX6r~v}1Emhhz_cAoe;X_Qx}))eS!sp2oT6GLN;B=qU!g$!e%rg} z;pdxaqO6ph+Jek(2nCsfEIrOZrpoZ=2^wIkG}ScNL>o<&J4O*SM^b8QHtwOFlJZ3g zaKo7E*OT^`DS6gm7_m3nezJ1eCX{a~r+9K&TUBMeX>qk>J_ zGYV+0rIIAo=hz^D{myZ4GY<1e$Xvl|OH7&$Q@WMXTpHODu%UhFf|c@}CU;9ikW3%0SD9@rE(8us7M-Dqg<0qCZFVgw0kxVex{n zR9fDlEIvr5gRrDs;^}P?F-Eu!zmqUletq}Ykh7|@i6E|-Bu2V9le-tG3qB|woE8)6!O+;yy z4({vsm-q3~P!1f>o&K~(vEPiWRO~_f$<9HUV)iQoX8m`EY1;$Yfi^iPZuTyfkpuGK z?68h?$2k&Zpc#&KVjL>$Mz5OX=l?d{8QhHUTpVXEE69q6> zmtVgU#(F1(x+|y5W15Jv>rkOa9XHkE&~sQ}^xU?TMzmwJ|S^cC^q_iEz_#lTz^YVu^ZsDjUIR^y`=YzfPI}piC#)X zXonDi?ZX>d8CJh)D{l$n8G(g7M|=>eVv80%S$(s?Gw7TNy80vx^H3YXI9NDz7+34yxS60o1ey*-~X-b^wkLt>=(#3G(@Jt)p zQcLlmc{LOdx6nXdaPDP}7#yeOlhd@{_?*OzZq`7HXa*{@h{!gS}OwdA=3r8s-?`|6hhPH_{#-Fl@zP@vQ_y-TpcpR%Z3uY~=iw zOGE1cGa!+(@}xJuimThj+8p?QioyMt3dL|gR1`yDf?5o%1WDy$$lah8!yZ4y%E*b1 z`Y8{jA3~5=c1vF7;g0Y9{wue#UQJ>s+AcS*O=*g^VlG*6DygNKjR}IPEE{LmiB#|m zlasw8&8@BUGIF3-wUx#;_Q9aCZh^ImET_H>)Ub{c<~-DwCs|p}{I!%`N2#l^wxMmn zXcpBZoZ%R5WKW&_l^V@@yyN#MM>aG}sX;qkT-s}!m*B&1(=f6RsS5X7VXM10c?GJK7cirFd79=M)3(2GvR{)U(y}DL_eZcpm_g*UigG z6g%ovSE;8<5+r4l>Q$>~SzYB9hY$Y1zfsEZ&24!SJ~S~9#$Br#qC^b?h`|H7l2!*Q zZBc^n1C^gOv1UX;N(^2OyAh=9mttR`1Zvi&WxWV>^XfH&A{xi}4m6_cs+J+T`{hiHet~678&sgtkPf5>*qZGKq#SsUT594y+%g zO0>>Zh+Znuzl$qKG&)@AY~}N~v-mwY!M<{i4vt0yzqS}4y|03!g zp{$m|ssj@eNj42pJS&_lrSWDFB{WpXNXmQIP-$u;?R|v0_@TC1akemeVXltS_pQw< z&Yea!R=%lW3|CyEQ?@fA`Lzg{9dTb%9Cn0NiOFmnlR3f|S7p$p#!9xP_#pL)RGLW< zkHN8CF#Q^-47T*~Fc^{U5#-$jB4^tRapDak-&;W6HUZI3?htu#IIRQ5(Mn*P6H8}@ znCdN{2ThbPOCP}0*ueAn7kRaR0MG zc}40JyGo@(IchZ~abQaU4AkY@3QVabXPv{VF+#fH3e5TXq6QtBag6GvP|cME*tX6+ zfY7QDn$N-1AX@37*}ItLM=Kth+{LsdT4^gqx`0J^Jyjl`7)58d&bm@s|56Bd40MZ8 zYDfp10p1g;rWYV^6`Dj^mYUwR7-fP~2!|f z29~NV+Bbu)E6QGJlMcXjb@`a&MjjrpLY>VjrQLtF!Qgt{Tv;F;umgNgfGD_{-^TrC zo>N;Aq@{{5VHO>UMR)c#m|n&zT{T~FC@~H;$gLc_C#Hm&F1H1Q*>3W zOgTMffN*Oepp;onUb04zib)8?E!vh@x1hPV1r%kU=*UfN3>MFlLlEqoW8Z_dP^n3^^682|FuH(F6mS&LFw(d%@WXG{mO@)DzAcR>mMG@ zv@1cWqy1vkm+mDf4qkE7cp2eNjFz|stng{5utcZ(Oo3UcKhvA+6P54G1`QH6XMdW% z+|x~~j~_%oCMqMfS9%?$Hm*8%O8VQ(gaTSA*XsPWBpBzwF+bET#SizyMyI~FjedX3 zXp}j^4)934H}5oeS1<*%R+6RP%^>7nZ<^6sX|A&?>4PFD8$)|erkkymHj*vJSa?%| zBqcyM@vFe#S~EU0>(Ak~+ax7a8`-1MY%xiBDP^02Y)%c@*+%K?boMhR!|ny4z6lwB zVF>&_&%3RHmy~QxIREMt+*zrsODi_;SM~gC8VyfY#!GFDfk~`JualJo-SSTcImJqy z{?!C(m7+|susQ8kh2fOmV{5vef=;ycS2y0vchs-5rq|!0ZHBZ%0#i{lv2(Z~6 zw41~3elWnw788TVk!=TMi!`YUVB_66w+8gFgQ9c0_?~0E%6w9HR71plEO~cS#+j`w zafVLkR;AS)l^`qch?<6Hpzo#At&WPn$CY;=uW%L?%gjPHl<=55?@o$|k>vQ*8PBx1 zsUG4iP*)0h+-WTjV<>>6M=qoS_oH@puF7*(79iF}Bz*1WfK7vep zVkUX|1;~d^9O*`*dy3u~CL>E+>7~PILr<}T<-=S>2@aXkoZe!9JL9gce4U@-+PcGq zm6c+oDOZYGl+sJAX4M!}__n*wSs|mFy+nJfG4J%>UQ%)FBBAqfKIN-8=SEfw-|9I% zGm$wh=_B?O?tg@wcQlmRS8Pn{`XJR+{ROWP6h>~v7-WUU45f2@5W}7O0PIP7j*YFL zdCp;#N?}T0;3(dszG5qNwdy^}Wi;}wPIcnNl|tfsP$t;X-FRrkbAN+IY)K)f1kq2m z@)(wMXk%z*e%5xLD_^?J(MAf&+ z_U%zF*&2J_qU(Du^rf@?#B-LXeej)g{YH5{w5-3_+p_r^t~EGfVNIq3#7>S=pMp2{ z6Ix{KkqyMP0W@TQ_(XX23L^h&siAZ#qID#Yvb^CyLlp2$;(Y(n^HoSpWRhm;qlMsmz)TU^sg?|KX`$E$-nps0 zb516S<4lC&rvQFcDWkCaaM9Ue(0$Gk<5jOqhkMer;o<>X6Ckl_WWqb`WQ!%q$SCw2 zAv#nX{1?ZUO{E^{Atz#DXxCZhM8A#@Gu4_WD8}041no+JZ{B(&Bp-iImfT>pE_bKl zBgJ!8X8-Ez`K_3mj}pT?5(T9g0i(q^>K2cHi~NyCuezi8cx5$v?-&VDz8lp`77yCAdI%)@FYl+S?!V2^ zWvgo5^{1+O;y8{tRcQGD48-rWGX>rruWsdiw?Hc^P6uBG#W}$h$KaQJ=}h8Sv7^P> ze_Xf&!?(_E@n!%3| z+S6YXVKQHaQJeAbb+f`~$9Oo*-|s?%PajB{0Gbh3_06I9J}0ptKS2x@vN$H=1N}Y$ z(~@AoD7$96wxxe3h!KJt$2fi`EI2xBL!pi{C3U+Q~SWNu|6# zZ4?=!Lg?c}v5v|Om604{h# zb7zV!KB+&)6>8%$y2a?r_zz`R`GQn#0{1uMGZiktqKkU@6<^^=G*(>?N)>43Cx(5d zQ^oN@qZ=r#-fOuuc~iT~jtiXTC+EEtHJ>K77PkHg^oCcobeb6C;3xx2T-<)G%2qd! zBmG_})m`_8kr*FZ^6EAdc3%f(+e=!ICf0QDQZRaFP&cw=S#AwEvhGWT+phC^Zb~z& zT2jO5VvO+nHDGqUpseX)h(iShW8gNpMJYFr@*EiSLSeS~oDs8cQPg~f*jG(gfm!f8 zj~}xQa53SaEW5O19#81A5Ur!=^$gKTb=!~1&lIN!`|?4ttB5ybb;oLFjVhdiyc}IE zVlH%lrieYJfGXW2!(E6kf;-GVV?^_a$$jNVGiJeOZ*&FR>pd&mO{Y2hr*0Cdc{=Z= z%Rp}^RM0!pVe>s?bcvUcBvO957-i)Ppdv{j`ON02mQ#8ml(u~kNj+wZ@#^uHz;LWi zX%6=%Cjl}XHXKr>O|+3@pMf?xP>rf(z$+Vc5oG{sk9+ z$$Ub)=OFX=InM~wvKhUfBl@aN`BKG9ak^?(Ag#$1gR1ThM0V+f-SpG&uc9)LSW*&9 zO*85@%@|=8g%h}mAy?>QrkJ4G8A#pdiVIZR1L^f#vA1eRAhnw(&Q~p~ME}l%e>b!e zX|lwzg41metoP*6ye!eRQte|9BN?r=$ak__1a6Qj@{}7YwebnEd*Sa%&liYlD$EkC zRoepTQxZ!yWM~%1xZg;Hx78@rC6G z#4o4$7w{6>M5U{-CK;BVf_Fmfj?(4%qNi#^BYH7kY;3xFeIRKUh{M8)Z$Qqw#}5~u zX%ghi$?9>kXx|#?Q6Td=!Ue}0D;@arGF)mG-Oz?~b%7YD+7d{rg<{PLyCdX$2|p0N z0e|Y&;D4C;BCuMC7lO=mQ!D9rYm8VZMyfUkQqDq=g>DJt*Tar>DTgH5ZGcZ6>`5nbiUsey1ZEQ5?*FNw!%N@ z!(uUIQs9F=Sgf}>x1P(8FNX|;H&Cs~UscK2 z!SKvs)T^8ccr{!dSgvrsj4>Pi%jB=-quWjXTHbE@QU$#-7W%LhXug||e(hGVQtZ_n zRD85rXIYQCH||mCIH+TDbQMw!wZYzrvyTM<4p5}Yuh+b_({Q0vQBV!oA1V}8YIrw{>X<8RXC)m9WDal`cqHVpZNW}-7UG|f95@E zuUk-u<}4Khx>Vu6z@1m?y4K;If+?;t^oq(D8I&=uNmNEVXyNdn^pqyk8hzQP)F1>f z`AzXQ^&m?ES{2IO5KkfDI8b31bKYFeNxub>W*H=_<;*2>rNm`oSKDz26?OX#94_W! zeWE_={aq&AT!~hna*E#@FW>3TIA#hkXo*PQCj3B&)!;xFrB``!lcb*naYHo7%AW{r zIAK&7LbP8Ac=%7?a@+A7m^;AKZ@K8@-)Zm9tusALSyASVrBqgp%3fKERs_=IY|*<#w>I9&aeLi}cZZ7cpoCrKBya=a zgX8WzvA16lCrau6hO#W?vMh4{-v$_xgoVAA6K;HHBnKP2H5E3Jz-mDPV=z zRE2+suYhGu)!>w)7@&&QP{>L#QEhU;g9pqwp|Vn}QpsgEuPuTceI4{9^H+)CHGhRZ)xR)$V9^l$%5Vbov4Hru*OR-TNlmy;E$A0W zA66l6yE2fxR%3^fLY7P`_g3|xo~y+p)+Z)bD90aOyslfCN7dGdT08X~IhheA&lhod zIq_>mJVKYV5A)ofe44Ws%Su(Z@z%ryqxfZGYth-YVppq%yA(>@?vf`=^YtwtwM!dSX4>`kC(qx+?ZU|4fgXC9uKp%QtB!4^%IifJmEcEp z*NfeRt$Xm}hD)?`y;xWEq7GeMFZ#Ma*~EJT*SP5KD1)6_BBvU(HOYR17;4?4g?G7w zcU)#q16LANe1V-3Fx6M{g3F3Nv>?;;DbokxgQ?reD?@Nzw{AW&N`e zQR(uj(?Xwb#l;8YYfq71%J4I64CL=bVAQC|XS3MMdh8fOug4su5t~JSt6V&ci$PsW z=Xx+_<7P43MCi61<#s$rgE*4=9@b-nW%WtM(;q&80J>Ag5G-9i`N2st3 zWKL(vZ<`qF+IKC;`or~%MdKJ^#~oEDYa7;n!^~;RHgS-}xsed&i*C(6^4u=E*;e16 zaFo*x`>6SLQ4;oS0n_cLY5sO>nDbd9w}BxBPWDzZ`3O_&9C5?QIpx4%X6*=0)ZjFk z?Lf%#`)Yl|DJpC3P4#z(8-yO4f$4IJGj^fxJFpOZc@+m5JErblkkrR)~_3B5R`TOK{$E&4fMS^++a3vW1v>F!BBd&C~Xk@djkb2 zbp?I}Vm`j>U9v?^cc1IhV`lr`$SjG@MUsa8Bzx)D$w|SVoPDnS^!5J zRe(=8@cvRGU{D3J-H(iG{u%%;9N|DW%6clA(Y*blqo%$wI>U{A-w(DC9NnNS+A9a> zO=QITt1Ct3pfeV(272yc+LeQagW@GJMxPhcwRNQzImk@^w+fighd9QKdL9rfXcLTq z`(5JiY1$r|t z%Dsag~osNoms$h4ja7+wQ{a2A}8-^vX?inGaWr9It5y0aY843KVW3q z|Bv=fgx>(Yt2{Aq$#JoTYGNR@IxY@Yr3KP~<05W^S;}R1|6QrEj^=wYPda-Tb)Bo1 zN{JNNZw zG<`!Jf@NQY#xQ}7u|XoYH4+-c_a7WRC%ua}|_TDlh_Yy{QtS0jy=>!^X z+8m>XyJ1aY3xr>j30PUd+qiR@NE6cE0VvJ6gYX%jpm?}4s{ggn8Jt+=R zPg%rePu)o;Ph#(5!E8N;W%Aq_U`3i!qPr>uA>ApAx?KxV+SVO%gU}BA;^1H)Q2H~$ z@&pBaM%CY+61`Nv1m?J$#!8ghdx6~W+sWq)792;;(ifsk#i!IX?u@usu$>R)7TZeu zTr**&3^a_rD*_EWD^@gh9F8dAEbQCZKstUFmi^W|P+r?YL(Yk9Tq@51QL?$1mdkf1 zD;+wdJY72{4iSFL1@Oye63>fKF0H3??y&wcM)AS2&1v0vY%K>y83MYVsRq6^Yw zSqxqOnCH#!VeH$jknHHrC(%LJlnI)3n<(j?Sj)jlfg5_gKj3n^y!}HwBm{MUKWs&` zwL0^$oq;ERp*07%=W=%mJ-#5$67n;^>cR#Zbx~~OUeZDLPP{L)gu5**gGLIN#OEo_XJFgrP?U&(mv`Pn< z{l>xFon}swarzeLxSPc}1F!Jy+t73|< zdj_!E)^KcK)wq(4)mckX$!U!&Cj3m?G{vIncH|Rz1XR^5^PE_xn z%o{Ab3~!BxF*4~B<=?^v>gSVye7d|0(xLMhBc7W-$}-fXacK^u5s6yf$vAa5ZB1%}YtV{{^<_+B*iFHx)NA4q%t661uxabV`Rm||)`M*{Do$Fqma%nUvL z;x#Y2mq{<$eII)Vdr>h2QH4JspTEWKCOv8L-{LBh?&S54*vz6G@jQ=tXlEMy4@lzZ z!argg^PWf^WKr9(bsQ=5f#_^8WC=$($8@5$55yK073Ghf-#X^3dmuWR2s4r)(UdHl zAQjtJxG)&PaN}4|ge4=nWg~H#&G|Xid?ZfBLt?)*> z<*%_nAPQN-0^OZw)bFu4v2s_QQoJ*|N}&Y;lBQF>@ywgu^zX=m;6TH@E~NSw?!ecP z;Qt|$TKp?Ar|3k^A9igupKCa;>_S?{VO=?_Lnb}@R}6RBKTr>o#o*^F%nPah6NKx_ zM*y~Xj;yG)H0Cl6!&aGzI_v1^6Rfgb9}dvv3>yAatm_muK+j9Ya9-1%(&48#E;Oeu zO!9znib;MrsMI9a8Ar2pVh7va!@wtQwxXa!<1S)1@Zo+xv$K3cVTEFS9BoZ16qE7K z<3h|PuZDv5*(~btOl%y`B7qZOEGbiL_G7(r#Tiz(F-dQ3FDuvIUFrBUWPCS-LAWVn zsZo*WZfiEMRJblqE2&q#-0cbA++-b&h(cbn< z|58*%8HMd!&&BB$Uj{+g_tW9u;iC)neIYi`MD)?iEFbsR&3{1KUqD^#IMi}F?SCcu zkjE={F}+_R{_5OYk5+nO^FOrsC1RJBi9m~K^yQ`4Mzf%o5$5sV)a{knQOFz!%&cjg zW2D1_p1_nDwIP3#^=lk>_+tP-r>D{{ud$oB3I{2R_lj^M@6*NC;xhHE{y<%uqBmo+ z-e3-C)`PO&AXT0A7ae*dw!(=_K;#pdVyI?CcfCZ4y1%?fZQeo`xAg;N<7AwzguOWU z76V#i04mjszsC);FBQKPlP%6A0DW?j;vD;HLgS2hPA{N?@5Cg*nWO9{m0BECS~u$Y z9*)+zyEv7JU6}LYftWp!R;XEZO}TC|7lT1EhB3w8O^Ulik3K*LU-tp5Xgsz5CAOmT%$+wKt%cuCP_>yBHRb)=rOA zM)b{V|6@cyZYq!H2H}+U9cDj*u6;)u>}WR>c_5i){3kZnxVDwq7$&mBt90W(goIWc zQ$CsM{SX5k_o)mW*Xq9PA^E;0?^LYTW&IFsRE^uvsvlU+o{>)neu&f5CS7HhWz^zt z2)`1F#mbs4v3gOJ&fRi_78Q%JLf0-RqXWlzEw*HpG{3ht62<(=;`*$vaIrH`XGbEK z3vmol5QZL2y9|}bvZ3qZ>&#n-;=tx3!LGK`))>wTu9@7BJezbWk9NJ3oT;k`+oNi9 zi)>V^lFIWI1*ljD;c!Qg?jK${G_-!voIz>emwNGk%*N^Aa`P59rN33Iy|Bdt=5Bf~ zs&C3dZC}ThTDr(yWNU`T$TnrQ1ZR$V-IFexvJl(u3Thi46uWwI)M8;-dkC{AiME)r zHVzM3Kn~d&?UG}okUz-UoQ)KYwFBtjP$g7YZO#H*Y&r7hEg9$OkvZ$)XaY3aU`QU` zeBYnuy9C84vEqR846bJsr^MW#Xx+YZlwO`~v9M^1BFsR;LvDY~Xvqk5<}9TMY>^Pu z1}Oi*rA?<=#i+5GxvL(Xp*S^bAZ&~UV(lQ=ssy+(nTx@y3_9~anl+`i+^ns`=(QT{ zk<%LVdlI?N?M!Pdn5)J|l$jW^s>!G6yakIC0y)qxk(?}9L)DOLG*8R?RJ|f8)`q#N zHlCt^Hfa7|VgMRFkah-w+b$dC?(m>FxXDedM1~=!$l8i|nuL&_74uRp@TX`icHZ{M z-(Jdk0oNwHm2S->;aV#&yVRdXShISXkY=(}hAmfVC+Lth^H%o(2Ci^_dSuNStFo^s zV$E$zc9of%NuDCrrj}r|u3xEC8vCX)H$%##4!-b12fIpi+V{KVu zr)o_&v}~xBoJ;3z*)@wbQM~Nz_&i!Mf>l;BR%h*)qk~C=QfI@kZ+D!Y+p&%&LDbBi zwY1wMf&JFL%2>}bqaV&l2&^8))O6gQX`HMY%LSHfBE6&Qc8ng|vr8sg+M{7v>aQZ` zKlGN1^`W5-P_iBk<@y*3+>FJr-OeLEzAfYB{ksnqCcLXba`sv~Kqy z%5-ACRjR>#y{mT9Q{dfAKF}QhN4j#b?CROf^QKs5wpxg320l?e=%X`hSPCY>r@Ifid{F72S1V{4NKH^=vpD+h%9=Q>sv{R!#=CsEpW3*wR_Zkoa#!#tuprvE+IrFSHyPd6wcJnd z-PkIN&5gnCx2}d!=OhD5#%BM0d@lE(_Z3)*klzT<3tg0)CZ(nN&mTTU6t^Y_yB zip<-jDqX3_j#=z%2>h1L3TqeI=FS2fRiU6z92vzpxBH!*yR+IR-c-edB?;TYL9?-w ztY{wPLjX=zV~<##S?L}z?$E~Up*J4vf_21Y{UFhGnoj3DF+>6yfI*Fpe2DltPHVI* zNS4qrNQ!n*`${a*dVPH!g7c=%#%(HS~e$^lX*3 zJiDF7db5^7Y8_z4v@Kz4CJzbC{aQxopzUN^h3yr_)do7b4M*426!;qz9k7iT9V^@m z1Ljt28IBn~7%&kE+F+IEZ>8-%Y^>nM(T=g?@5^dw(){!sm5b$WZlQs`tdlS?6qsLH z(`jI|&uVfE78GSa0e;Pv|KTXKz}4`G=Kiism8-H&DoI0QtFqqK=3n{4BD`A)8Y+XO zbwKF|Slf_1s5)`0|4C-#i!6HjVXtg z&Ve0&qe4Fx@7iVrUNHBsj+J2Cb-f8LDwdh=4fdjVe-@(MSacTYBISEsx4F1O2_T;R zj!IwQ`x=JnU=wbmbDqtkrr$*j#kp7$zu*o>z5 zGbh!ZRH|BwRW^0YKS)w7c3i0A4|#(b*#xl0nk;WwUc*Yw!!^`BfVC6m`T>(J(!Kx| zp?T_MgsH!V%(YAu-qr->MI^P=Vww!xp$xMsUUXQ?s;T1e=8qOb!JUI#B1?vunR6Aq ziZWHXsz85f=d8;8s2~s>dT|wv3}khLMKwS)uQ?~GX=-ZtRa!-#0^uILt)6py>3II-h3b9?Y03ZmS|+Yfo+l+)P%|reGEz45$WPeQ~Za z5Q_)zgPA7ariZ=*l}Wq?Qf$VzhakYMV=Zg>90v*sVPjNbX0#=QtyRDF1+$_E{UkXm zlm%$Q-SthU4F1e)+8xT0)SevarXYQ&Wf+F(cDbYQG9-ziTAgnGHeEBP*QEo_zg2?L2b4~aH@i`?HW;F9oEY^ z#*Oo+7_F?9BI3dd8(fLMz`xSKleK>AmY*1BH!WA zw;~)|R;uSsI*oxB|U4gKK$1-koxE>oP z2q4y}8t`%(s&IrB0UnNk)@OE=>pB~ki_OJyxypXA#k_1c^7tyMa~=V1V$sqQoWy#V zr&fi-NwW`UfzB%&dD*4W7S4h%%%etyxaVqcIP(#9cz|YeU0NK@!kw&SFuZ?xO2d$k z19s2}$Wt87npuBy2liu~l74Y=j830zq}hWU`qAiy%ty5zm#;QtTZPXRLGrG)th?F) z8ZHawWJT2u&i@~(hFi+GL0$PnOKTgkfkFsp5Kx;NN4z0vuVYUTYvB_ zci2lF{k64;XNz@-FLPm2P9hoiw;RYS+Ct>?3q?D0uNUI4>F0|U^Z#XGry5_%E?7vW z5iCKt!Lj+FJfifV*%8pVCU*Mrl~on6Lwjc-~w1mFo%WF*QTtY(|T(?R$gJ`k8!`BLoJ)J93k8p*g8QR+lX4V$6C{o zCd{4&G>6w1Z}oEtdop+lPPDo?!i6tdI@+8Kv~zU=3x`0gYGvA7_^hR{Ncc;GEIDmy z_utVSoK4ds*&J(sN5HFTEiL z&7v1kY@+JQJQ~^p?$j(>5KXH|Z(6ZxWZjDSkXcK#?HMzDHDrzFSxx8ZRI?=}#2z*v z=u)GEAj~P-^k?j|Y1E+=OiVj#U}LItY&W+o6^D812N77x!?j>4#YeM5&2TF~2Up|G zuFQFK^(JyFpQ6!D*G)KOiO*VfDpiPK^Mpl~AemQ{cE+&Unos3qjKKo6m_i?7;CQ^6 zO);%mBca_@xCQ~Z^1U?+x6LvubqyXn(%sf2Mnsrh5J#y=lXI9X4*LgqiqVROTGtddMN` zKB;r6w}ll_RhvTf+Od2g%p76|dXZgwHq5EVH_oi=DA|_Eb=ZgYwP%}!`=-F&sl>6N zw6p_;ittrWP%>0HjU!zL43(8CV3&GwY)^TBIG*|ZGjnH}-yY+mVJFtXdYcLG8$FB_ zU1KNHl(co96#AKAnomsfhm=o1^ zmle`!+ea>pVJ(xxzKx;gUDy%TBQ2S9Wxn<6&c)`xc3-e}4sK5yGj8w9r)}ml2#y%> zud%*(8(t9KKX*i4X_R;F%1=!(AIpMdxhlSs;qQ#}uVu+Q4R2jmy04|YuFT8sx+fMG z($8V*SZ1T0e`)D;S2n^aH3dZJ=X9g+uP%xIFENFZyJ0eqok%abvGx|W3Q_hsmx$6G;G;d5 z#@Xf#XN=j~um*t{Y6Ly%!I}saIE|At`SoPYT!+2pIKvrBc?jYv-{CZ^CrcF?e*v<- z6L()-$)gvmtXchv!=VdGB=>e0MfYN9>LH&29N-9NISC=dt(SU`VrOa&qajIXr-0t9 zsrBVgK%RHtv&CIYNG~wuQpi5d>>z4IGU$fFiZi1O< zD8=_-Bh&*wf+AicC&wMht3UDypZaiv@!Ux8sza$lU#3+-6I%3TUZ$h|)Y6c?EY^O? z2i{Am_7E`B*$LlX=!=O1x}odKDm(pI#JQk@<(l!;VV@!79?zQE{qr8>7TC#Tqpxde za6EIbbx&Ka`57}uFKkj!=6?MJT#bHWb4NF4FztzFE$o|u4U|OT^XD}!StXS4u_|3} z*7I5U%vc=U&^3tKC9u)zG4CMG2wSBYmdr*g6eci7&EJJ`D;SoNf(MaJKjc3@zXkf8 z4YlfrX`;V^F?8{P#5~%46;IeK@5ctK>vCj>O=}u=ane$4>OYWf_h&6E!(%SXBl{eN?S9+<%m%P(_W7@!F;)#P z0G_a-@dH>3)u++i3G}48smw<8>Um&67uZ-pc5ymq6tQvys-Po;$2#u+OX}+j5ZBp8pkRet>~=M$|HNx#bIoLaQ`XrcT^>KWt*Bq)BDEKEa*wwhO8iF|(JcIN>Z+DfN3#AFasPr%C&c#L7P?!G1pq$>;b*&1SdO3qUU;ed zTA+IpM_op->gpcbFbwLwI!H4|v5;E%GT8+D6I@W#o$vjYT^Z#x`Ha6y#)$6j%Y*dq zDCTFOP*l&?lG|w3)#Ab<$Z_UJu3nC(S7e5(uV`u2XjVs4{;s|ecFBtgUAobe(X6wD zg8Fh zsPqr0DtzNq9@I32r!KVABL%rR>89K=2H$>JCt9Dvb_j*{LGbts1tdX*I^58=o}!i; zIx17=u3s>3M{}U`g@#W@yOhpsIe+R&6wSBj$X9LMC}tdUvXDo2z>V`-8Z-_O;-J64 zq2Fh^GY)S5Z+%KlXJxt$Cdwvsd6l%X-ux>Ld3(i}q^2?ti*s@xtvaWr)v3rix4j3J z(Vudubq%z<<#^_zIeg7XAe;6SJf8ItwiE!l{v$0L&uVHa7%)nFJGdQPAI}5^cJuO-g2zoF@AFCXXdqO#6-n0?r3!r@Uw4n`7X$k08kSsla%z#w~OE_JH~0g^JK?3w+N20ERpOTM$@{ftcyicP+{WN zlR0j^z{M%MxX4d`A}Beer6bdr8~^v_G}cLD|0hbbdW9f9W3TT4oD$$c5>`$5#^KIs ztb)_vKV(k&DIeN?xMd#Me#HIQE7BM)N5Ae2L#RuANhi}-2qpJpcB*L{ z-j`o+g$vL$KF|4-cz#(eXvcImRP7B6Mvx5hpokeTt{La_vdany<^@q)C2`5+4Axml zx(cR=&lRS3&KfcGk0QsJ2;-LL1GBh@V?5~eOt^363ee!Vbe8DpOxD)Q3_w{$zdfVo zvse?0`W=)xvFze;tuwTH7OS8d$#O2vVkRcSu*+aSsF40lXObrOl#vJyBGsDBrV4W} z0h6x#d9ZysDWeT?w2I_%;P_$&Vw=|&K~nUT+GjwJnr;8@h@-pC`Bs3=o;zn;X z*bw#o3!u95L{=B~D!rrACmXqnEl%jgQw&0OGg>zX8M|FtIy;ALiTYiO1*=DP({+4S zPv3?}2YZwkpGu>s6AH_P0s&J-Yt#opjG{^TJ`QJ3(6d(~z{m}&x*6CApFq3&W zmCr+A%F#3aGmakBZc2rj%wM%rOD=O+?fN_U==aRn#4Yq`o|xv7M`0Ydgqc-GE2xC(f!f!pG$LSqBI&WyyVE$(T$i1YvO1X z3gfclgx?PseRlGYas-cmsXur%5^}+9AG|}BHq5jG{>YfeJT*JC<;36uG5AH14dkqb zuMf^+^(_1kc<{%}5+2gmd8~zSCkJQp-an+4S**U#GX5cKBOh2wEqScT*9B34=XR8n zv6tG6ghO~Fi&?3*Yw3Izi*YQ^sk|S8D${xSwi1+^Y4$cP?OwoYsD>S-r1`9t-_-pc z=&^5dQUJqNH}V`0Xa7%8-?nP$)O=Q3g@3=zXR{oa?L!HB|B*`w*jlCpEf8`Esv}ge zfNA|4fh=2s>Dm8T!kjHy3SEd2@GnZ}N+%bxC{-hoY!ZAgUn@i8vnhvSLn~C9JB6N^qsIga!2i7g|Sbx-dE)OCzy|C~zrr zby>WhtBZWDc6c=IMrnids1NH<_ob|XYQ2`0E@cB$H>#7#GK{dj)v4k#7GyhrA1@KF z`9|66p46r;%UBOnVWpN1EMrV)d<-M6{v9%3j>&n|UcGF;%Wlh?Fp62u(p0GR_2sN_ zAXlvVKa#D_G_iJu*)Cj<@rI2KLuipz!v04`&* zS!dO6TFTF6cO62I7)DAJ7o79Q+3a;yoax94Y(pqI1c{#9pe`#B2gL5yOOzo?v?iEV zu4IEOYXieqF9L3m=2sS^N^MNde`UTNqj&MnzewLE~<2yF04U7xgiJ% zmNh}}=jDUXv+VMeYw8EDWsOaJ254#9S~jLiMQr%T9r1FaI?{K5Zi~b5GM^<~Hz$f* z$JT0=^f*{7+I22Yh|UPB`WXj@az3qN)+T;;614o`vpl=0t7U6pZ*xWY<{UcHZfb`9 z%M-n{6tJF6Q6)8|UF+Fs8@D|?=)`f^t2&!Y6ubcgqGcT#y@91!MegSPfah_;FOum- zEF+DoO|3R!38eo<-k|cc?Doj^@nb5=iMt)uDQhDOwf;x)Dt8P+9=8!v&XtXBUyoN|hEw4Ysj$La(j(vfG)Q$J-e8 zz}MS?PobyDY6sM`o0bxGuztd*&G<6u6y@(=5kdg}P~#N2?8Ms3paANylLbY)`SQ~8 z6%ktb@DH!`E0W0D;B#;;gwX}dzu?uReBBfL8LixFQXv0%Ubhhc>gM|7^d*B7{tVwpivueHrWD5RTJiM7wMp>140jR_s-So=T z^>_Bp^7T5-;i^t|j5_TFhw3$m_M+b_E|>eAPZNfISB@w3tw{Iw!X7WEWDxtDXK736 z4&#Gj4CG_Q_PQq<#gAU-xl(?U1H3OF#4ZuTgl(rwMF&)+b7<+_X z?PsBygJguUa-+~3Hq&D2YQ@hxOeb?#Rn5C4dXzFuk>2}~gVpdmtH9~cL%hgN&h8vz zmlj#({9U38-8jHPP5=CyOPccT6{&ZQtrZ0wWYMY_TAFweBm0*yFWPvJ`I>gbAD0iZ zdZy2&d6C5-=51QDsTTztVm?(XMR=7vXpRxkH2qCf`b{h>;_o8ul&?p^mo!YSg}Ku* zO-sp#SWUZ1E797So-^BMkqBOptDHaXpFY~RhRz95hvA}u)s{zADBZF*hh`sUbyeTI z=;UGM>+^mAYQgOyo^>>~i{XywTmH4YzmL3+unHC`aDm7AZ9g?X!u(v4IPp*CC=WZ( zv?FYjpvgvCS?{Niqb$N{(0mRoO$-+34r*xnQMN?wy zNrfSmz5IK}nY*jQ@-hg53?jWDjtcfNi-AKwmENJv;mMf?ifS2iZ3O~bQE3}=(F{O8F z<4J)?G*Pyi)}3MdtR83S+qqyX#h+!NPU1|tZ2jEI_arS6Xvr41@Gy3ET{{qwAr=~!JZ&98*ZXkUlc zwWJy6*)$<^E=aYT$^H*)lU$v~3n)3q^VWi<{$TFHkxT${Hqp#KST$Fz3^YCl zoQmAprM^-C#r(ybgt{CavWcuOFh9-uX)<4Z{dAv9m9Q=D0(QRk?f{=VoM_qw=5MuQ zCekO-zF|6ZqJtM$U$yrfx$QTS)g|Ulkr$c9Va8M=A#Wo|hBwRnX#PbuN~o8CVna7@ zc!l8_Dtgra5QdikgwYalCN9%J_)SKTsLX2^DhVMjJy~>(^Yz* zMDj2#SzdtyKN9Q3SJ*Gr=FLJKX0PJ`!Xn>XVEH?*Df|_TuxS3kE&`2hBj7$>f#%$p z$mK0fT@>hii>YEhn{2UmrfhJs*V5~&2qbUbL9lBfqe~WnaRBX6KIjdd!&e>yO`$?gwCFl(##9a}v^F*LXUNQ<$%&`qwcNjZW2bRb0U{-zeoewhXsR114q_y}8b+ z)jTy$k5T3rmv6a0ZI>y+tt8HW4~4hbjHLsMMv<Fk{$}d6q1+8t<7vJONj%E1smH}d;Kwujudg1#Bd|$|Kkiy@N z223G*vFHqPyTK~h^52^&zc+zk5jU7i%n*E6N%?NPfo6eBlVsp~3K;Hd7k>O9^DYs7 zkc`u!c;vcmRt|ytdxN#8(RM1@DSBlY-O04^1P>$a88TQ)jyGAD)1nmKkkB5voB1N) zqt6s~lSS27HU)eZtuW%#Z}3li_71`-7Uy$stjs6MusnHR=l_`;Z?VQTiY9~4lWZeC zIfH)UQyzSNxy6Dj1j~F3cYDffhLL>A`9vpgu^aZkP0|n9?B%@2;VE3eGT-6b%)!NW z441%o+{S&RN4K#DBx53En6a$PICwvrqf5pC`#`n~cERp0c6!~N0Q8Nelz5lbac;r{JVf2f6itYdQj+z%>pZC7;V84rK zZUL+1;LU;ZT7;tQBj3@*0v0Spa8LsoSJ1b&)chWXB&7nnU`g5Xc3K30j zjFUXeh8qEkUelWjxCC$TeeCY+_6yJ*7g6DT7VMHY3_x6M!JE!t_ibNO(BG_!ur~$3 zoeOE+->iPPBL`wHwA{pUE(-G>PhiF&_lSo_lm+%c_`dbCDJKzO1 ze}J8N7so)bv-4@wV+5RyIl45dkoAIgJYaE}g_VDb1gYXf)<>O}%qObDSv2h-@(gyk z^AROhP!HiH;zA&ln8kx&vJ!+Q`0g^MBDzeUV!>!@yrQchd!2q}~6r<*HY2 zDdq_~q{0qVi>IuL=}RAP(mrL4Ck3t6mTOk*d-k{$pUyJP|8412uBi8Md*ze=9DHhb z92*?@Zz-MeDe}0j^2u`qKGivHr+f;ZgikdLT()p76_48}zl}`5C+p+bfXKOchj<~A zw#auNB5*q@ddgf>aqGxb$C_D^2y>L_+~$E3#p;-^Wuo%A3OMsB6+&42EIGazfk z$WF5r3&^FxyYah#nbzpnesYILXDnEa&$`$DQtLw2P}5fVIyS?@o_m7p{-x|f?5$UU z4-X(_QS)b5=NOh?AeNIjd5>wrGd5Jy-ibHD0W&T{rj4n&7kzui8d;eQ(LU=Ob*@o4J1t>cR6*v!Z>Sbh=aY@i|*-6&b?!V>iK_TgkNU1q-#A z(NA{v8uGC`nnt{2eq{5KRTg#y^QE`Z6#9~dT767VK)M(i(!!z&e&y|e%`coufBohLJe1eejgV)cc82BIPb(3Ypmk99DZ8S-i#;(xpB1 zF#U9RNB8tTb$-oAXgvV17E|fNYh?6x_AqJ|ll#=@4F>b!{=n>?!dca<>ZRYAfvmf7 zg1>@HWO(GAhZh6?qML8nW{ac!KzCp=)++ydhn22XZ(;8JyYnK-tmUTOqmys3|2d3< z11FQ+JM_=0IK3ds?D3|6<{p$PD))b;ykld8)(KqfN%Y|z3)1ZGW+b+{fbuOc>BYRq z4%CbB0G^%5*?K6qj?^_qr{AT0@7YvMc}uQe2hC*t^4$NmGDUr04J;4!<@%MU+cSaY zd_czc+Y>tZ0lCBXT~MZyvYHH%k}w&`tvh7;kp)>;fKq2R!BG45AK`tDOO0#h94KZBwL^U+&o%9kYiz5X$d0V+r>Sq>dF`*ZrDdQCWH5`jNa%h>LEc_;! zeqo0#CiVpGmtV@t;q<%%2bbNL7Jh?Fzp^93gdUu03MG9*pjXsh&r|MLsCM|Dw0$Q8 zaR0`lg&W-g%^xd6HO*ycNkG5&I<;LbdD5A0EYZS-1Jz><62yK-+orZNs@bJ$G~zo} zpL4LNV(q-0K3|tx+_fm^F5*qu`V)sY{08lq+S9keWFR#XYg80l;S=pqJ-d16yn6d)A-)ACulbK4ICv5HrA%7cA%T-c{t6em2 zLqjTDzqKvyB0W+`_k;-@fJ_-i>1I+WeKD2rY(Y!Flg)6D!{BKvX7B>}m`S~aL+wGZ zFNqUGy4Z5;&j%s@phsp>HjYgKh+~s7=L6<=Alab>N2Bw1$&*0Bd79r8TJqLhYN0j( z8fJ0`H7_qkYC1$2Avc`MSz2ClHWB8v0ngck@x-O%r}>ZRL5e+zJxi|yDNs1(iZ)x; zO>S+cR{GW++>P3+r7pt!STL9~i1w(#pjb3w(DqEp2-A?8g)~Ok(HiK@iL}@PXb%Hg z8DvSP`5@~q*mI0kB86H4GcnSLWBw_w-flF*Qralk#QTRwpKPQS!uJ*ceo7$8Rtk2HZvu{dN#Lia_;g!yX`!w3NH`M( zbY477u#Mc~@IH!2>vzMYP_G>J2jpX1~vIDKe>pPB7mc8Vp zs<(zV*h|N(ao<=|<$kdp0W@4AEf+!<*aY+;je`{7n9&ey$_5t&M`X9&qJ^mm+z97G zft2PTg`4 zqi&@2km_lo>KKtM-_M10rNeHLtqGo~a+7YUvl|1yq$^U6j!|_r-@=RtV)k(YuWHr! z5*wZny;@KXXEK|@H7hsT8il^|MO=RWk}SYeU#eSCT4_755g5jIkzK)tzVxu76cKVL zRAy@k46XO(VoMvI3~i3PqvR2EX0jXBY04Gex-Ii+>h( zaTbvWRP#I}wTUk+^^oqV&ou!4WJi5vY6Ke*jN7f$zQ7Z;_oZi^sC{aE5RB=dCnyLs zA_&+;n#z)wi5G=b#sKM357_qDNz+~m(45rjp^7>?@06!Ki+VY-{7#jrr58HGy)H;x z+9~p<1{iU_w4FwHOJ0`n4du3dx01TMOCfa0TM9MxyjYn`t4LK$zg?(IHL6JU?6cev zyYZMn_jW;XaiJyISCO1eFW;_Avw(9ub+dB0<2;?O+r)p)b(7`rs7xoSNPi32VUS}< ztRlxZKO;F}w$dA)GIDHRs>l)JD=iZ`g@UkcYlU!sO(R0}7NrAPS49VS=5($q;o+Tv zU=ZAlRtUmt7!hP{qTSU{l83&=T{4uCY^qDk)JuXuIKP#?Cq7m)qKw+86lGfjMO7r% z8q!}vR3HeNw^T~nRMiOob-mKnaW&D^E;Ohny82rH@E@b}1;qIp5p4gB=KDc3XT4}k zyD6f*@PlakYk_jNq^ET8F`^u}P7&>;KSXn(PyW(h>Vf_sh-Z3&bKXV-71t`Vg$F=3 zXKEP$+1&j=;3Db?QoW1_F0G~!TFB<8m(3}Zy4UB5qLtNJtAXym>+2))IgfS8-RR>K4oY3n9ThK6A!l8dpnNXjG(VbaIDZ$cr;apV!Pc~7Q zhk6)EHGKsg48h>Qi!mY6U163lpwl9h-q2Mvf;PxjYV00{8rzaz7)D085AbywEBNdR zM)()YsBLYqwxW@>r7rdkf4d?Q#KQ9}9N^HUHK)6^rAijQKaLkqYxI{}0-4m2yaL>p z$pLta^if#PZ#EEa3cpx<{e6&PF|Zy&%_y8sSj`8>E|FT-k^KFedvgyM%Nh-ph;ykK zKy|I2-|9#;-0b*wJWahqX2=hlI;nNtmeS)o(sp617izR2 zoR-#w6H)9U*GTUZ>e>>$sEZm2czsR!Q{AmHpdB0NyZex{j5Rog)=OlCvS`9(&U7v^ zr}p)w3qqwzps7$_>5FtHBa(texY!!E{*7-Sg$kLT0M4q%fgW_OyQFdW?5Gz;QHz#~ za`}4 zLaN!2Tdh}K)T^Q7>M~>SnPOeuYra8%A8V`Y4*HSyG^e2?sT28!ggUvjJsaM4n-s}i zb55fdP??h}E}-!#s7|9slDBZbBH(vw)7-vNEr*se5NlfUq=7Zd`J|bL1&!SEk!JL| zE^f3O-dS=GI&hlU+Da2xHHQ0l+}^0cH1jE-vGi1^Q2{`oFbZlaMNqd00EgS@MNu5P z6Z2?%gtSYrcLUHWR0dYTW8O=%pe2~Ql! tr5|dxwNQ>v{-O-1(9tCCu*aKv(Zbi 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

Vu-t_5D#2796qxZa63QXud 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

pYXIfBhvj{6EsbXl6{!t}V?K?kr& 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�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 Fxcs#QmnD?Y@KN^#8@@hy| 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

C({ij!J8$nFaI}{untWT2 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�xl3H|)v!@oRhrX}C@rk|QKeWIx&Y%pm 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 =g3oHgis_WGD|tgJ6KEwr_$ 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Π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%0AbGNqT2ic>^ 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 TL2}~sndal{DYNHX;D7pG$D90e delta 3992370 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

)vQR}aSu3#Tb)D9auvvHHO9m!qRK@I|unkL5K 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�b0lYIeD(v7D8 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Ξ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

RHy3z1s^txUSOC7i%LOea7#Z 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

V3PLCm;1@C zcyRIKt>v?rV)gUmHEc4kBYWU_TI9!T$%B!4(vQd3be$4ds_8ykGL+>NX?u0}&kd^a zx;C@Niewv0vKy_e#_QO;>?M+|Ey?a=Rh=s~ExU?js}jirMDoV=B3ZU1x0BxACA&bL zDsQlkHqEWU8ylpTP3WvY_jDdzLX>G=2}_AZd&=S5qufJr(kCq!#^5&j*5m_ia+{&s zKbk-bYx1rxml_KJdbCcDIgY#bZ|Up$i8n|N;C19brDzHX;CriH>=*%^vzxsYGFV&t z3eJJ4$=Gb5HwWCAiu%n$B<@Xtcc{TIMY7^%q1? zkixG??f#(~3a@H6z0lHZZwkn^7Eku7`~qb<%@vD54yo8sl!9Ih_3zzWU)3H&>uT|a z)ek=hRzZ56wy>WYf;uIYje#LkVH=Ao$E16qu*6?TuFV5$JgFykEzB-PT5mzppJLO8 z!X+#73w5l`zmPKirZu&BMA@+4BVd8K(+>47=%35O+1Yo`cBJzt#Qsa*L^A9UfPHa1??tV5yY)ERBZO;d{y->y8v{X|7fp z)vC+8mLJ|9DX@X1)H8ETOX_lFsQg!5(MaWE(j#ou5xE6o;TmT~&h8JSf_i*tL#bsk z)$+6Nh-J-4eZl#3GY1jy!43^QKa82JdM2j;%VBjf3T~MYNYm=`M9J4MJBe-}n`nmz{ARh?Hqx%iGzyH(kV6}hjB@|Hm zDn%5Q?!F1qnnUdBSPgb?RKLt6svpejIkwXvHrgpk+;e;4B25hD4eCyMjeCoMoek`` zw3uURBs_-5R%zXi;h5x;+JYDNxb(iqo<*h=YEDk_MY4C`HZA6b+5+b;K`U9K5wP^lmT|a?_uBTb>efXk#d!Pt#@m#xldG8_igk(nr2nUm^w4)R3Dd-)OmBlNnq=2FemZYUEQ6IS%0 zdxBJpJhBVty6o(#G7CR)upXr!s+{tZ#M^w4fH_v*}bg z_jRc#vR>?}XVsU??7X8y){yX&0Kt#=EZJ$H$M|$zs`-Ad1P9~Z=sI(v>VU~r%Rr%v znS$tDFkX-2^};h6bFW7B8W~%4_9rUi;Sb;<@e))51eN<;bUs9{1(h}tIu%0`?p5}i znt~ZzLw=e9n{apUy^xJM3K`&)iEB=9ObM<}&SUXm8EhZwRFeiYfr#u*(}E^ES<3mI z>?8PnX;6RD>j)lVkZSd#TFrQW>2zPBW_)y|QCQ2{k8gxvhbe<;J2KW6J0LyiXe4)| z(B?cuD(XXHn)5?aU>{T6NcaizSL+J&`wJ(x;JMP*Ybm}ZA60in&pX(&@ZKuPI6Y+e zh~fQ`Y&7Sms4AS@2d|RB-O;GDTaer6brE>UQ|C^iS1oz0v|cYZxv%M(5|iSlF4)NAarCk>jSvQQ%SPca*lahLZI= zL62K=Z>iY{a)?1kyLW_Y#qe;LM%0Ie`!o}AR4Ucu* zdkcM1>$RtVSfKYjOtG;%K$4HsgjjxA4yqAIZQ5{OY3Cst(}rJ{Y8|E6I6l6@8&^T6 zVqE&r8`$&nt2$sWU5n$M^-qg*V`_J8oGiX0?OVSP&6BtO1NXNJefQU1@l7M>s@gH0 zYR2>4(#gZ7jCdYp@Yv)Vh~Z(qHdTlja(iU!3=f~Ej6{EIq^LyC+wyAm(fU{@<`inz zHssfi*H!LgdnLY{1Dm=+d%6>oR-oqSi7{zs)E3xZ7nAldChafvFN`s5Rg5t^rpu+} z21~VO_QJtfKE-LQv#3~QbrwrmgLHdns~KRl(`E zewkooAO4prl7fyvwR)z6udV<(N#$b1{46@a7R3;G2%}v{Lw5w8uIbjeA?k?0pD5A5q(xvU_r`(hV_9&TK|cdh%M*DjTZWi+ejF z&AbmxjA|-xLT!8T5v4cu-d;#nN1!(D{W1WIOUQhKAF54X^;-n@sjeJfq) z&0}5GSVNSV##He^xw!NWw>5d%t)rkmyq4#;V_@()*N1<1I-)kduM5j97TRI#QZ#m%CTmvq7l$ZK3Hu;!)hIwsu2-IQ3MC;@3D@(RUMhIk{`9*`!63QOePVzI?A_ zXhz-p@t^J2NTM=gZ>Xd;SWW)@;hMK7lZO+WyiGYLZ7)`iT7La!BnQ;4B)^;fiKIJK z8o-Bng%|{b9mKR>y8|x6`oU!wo3uPViV{L2hw)0Ze*h1bUaY4V19+%(e?9Smm~;BM z22$ccURyf3i82PlBCXv-I|lMFsoy4gJdpc)Z2UMGw5vv?>GwoJH9O`C+V52!OhJRV zn?&n2#SY>IN#1CR8_cU2%G;LJd#Pw{>b0^dH*FolBMg-;z89o0-x>QJEeCf!0t=G3 z?{65dCNFwFnF5FLx)rM61a6FeD}bi+_H_mKQ|#@r$R3lX8JXtamQYh$y^a&jS{gZ= z&+{yLCkjdsHqA@xKi1!zYYeLQ)X_m#Xy-^?ap?%&TB4N{JA!Ylkmg`^K{Zl|F?T-F zr7=9vRC^?5DYCs)AdMQuD|y!YQ&8;)2^7^7Dt%AvnNASyL!qKkZDP7Nil-VXba*Wg z@yU@%MWUYS$%Qmw40o?nLrWhm449~zU{8brVlct44XS4zi<%dS-Y%R+bwAUn)}z11 z@Jan!yb?sUb}-lJ)k(b_&IbyQ^`N<`Q*W2BMZwD~WkEgph0mqTcs%MBj5#m(HW?349>?dzaq#t_!E^-+gcR z6H#q*-;+RiB6qi+IbW*)Mi+JB{Leaw=yP?3f9fFROcy31#v?a+7eLJ?@%p~a9|?Lr zahSocXXKo|evKjcXH|sx!9^4}*rVR_HLaM$%Noi*u!UA=Yt~yEn|4m-eum1wKNOk0 zk!7WaK2C_LsF~iTCsVkUgI2-k;$_DH=9${V>HJ+eSCoa3ElSP3 zPmgEtHuALllc{kEcd-Wq9Yv?(?n!-8c!o4@7QIN}!GU=Qnxg4NXkiY5ulPmLU^NUc z;zEcqT4Ij6d8WD0p?%GTex1te2ED(Iqc<6L^$v!kqL#B5IDsVL7=iBWiX#Gfc{rsplP{CYybi&kJ+8RDeH9`?-$%uGC6?TMNEC;1ORd9Y`*75r(PYX^NT4_sI4K3WQo9+}74sjT=wKuX&-o{y_*m{+f63 z-5VPYx4I0vD4cy;(17+F+u9gYRy7f+nBV5pp!vM-)cN?Dxwh3)ocs}IyjF=1vn+Q& z&J62?coyT6FsZ^ogn*FHFdaJ93>AZ?7F5-^hjmTV;T_CyG3XWN)~&CA!{3L!ae>T_ ziomtM8TmSpRd)wdpG-bNk`LYsF~(o({wU7_&B zysuZ*sDIVzY-!Z#WI3%)hf24iql z$5Tqnc3B}5aG0mdA59^&?=XVfX-KJZg!h*H@Q`wZ|0=iN8$x}L@-O8(`$J5pj`9`; zx$W){vOkWbsmM0+IPWi4!bARXenZ~03xrO9Q0|@(QtW|Xf_X27Wm&J`wh;0>3&&<`6&ie&$9lfr zAxvryVMjd|X!(?a(G|p7`j!y7a+U`h^S28WeS^b=?IGlLj?b3EJW)Ot=xN_MOmVLf zT|3A9q+a{z!#Q5n;rbTMP#0k3&cV6v<`81%xrg68q+-=P53A-5M~i9;SXyxsmWmy! z`2ut3d0t-*^C+f%o~KDG+^P8m-c;VPCB!uQ0*^Jgsp1rsSZdbJnLXSDks`m{D6stG zB0nwJye88n{)fCGRI}u@tW;aqPx7inhFspnao&#_JJLTz(-C#k-R>4#iC z%pecm8bFovc(lycg;2jdK1}{|2&b!gn6Lc4`trXPaBZ&e=pK)vFs9({_z1C1I8vOw zh|>17t9cqAQXG=$CeGVo6;THqFavrDfbj4J*I;c}L1-hZ79IbE?<;#}7V3>H-UGtP zYhqKU(tmy*fbT<5W zdCPywE6><`%d|3|TN&(D)PkU}PE!#A%OtNQu1<8UfLE2@+rbAtTgTb-u7LM3*u7n4 zHsHhU(}?XVV%_+ ziloozG6m+jL-f-f#Q)|i^!N_%5HrSZA}%A$H_mE`$#?Y8dsY~jIwS3ibgRl=q<5=q ztF@D;gqoAARr*ZV|5@qY9|9=jE_ac}uceK5d6g#Pb@WmH8$IeB6hsdZ{98tmD9e2< z$@ehaynlCx*5BhM+os_WSgZ`oqdvd!8-AWMaE(vMAzd&LsF!}=vtNpkigw`hy%+Vl zkD2u#KU#91x3oPPCh}+H(!Kk9O|^aL2=~7{sOOK;^CRNsHACb_w5XY@x~D4r@H-z= z?}zC^S5p7Rm4NtO^#?TuI@qA97AF@+03Y51Kt1UrlrsnYISWsjwC4LtPSo`Qcanx1 zOd}ugAcLIft<9BOWbaZ1`j=X+s62>uK6G0Tu-fVYR!nfxoqudsBC=ZF5P|CDsjhkZ$|6Cqf*|LGtO>`6&tuUo^zv2QW4*3aNUMW@6PNMZRWHh zCc`5qHX{)S65k}#=|{Y#8=x_1g+fDx{DeFE6S^T5{~Tz<#Qnk?}+c;b3z8KpU&IzIV zFL`6v??Kjj$G@vsCyCNuqJT}7DryDn-(ouXl2133-iTavwo%M$-b(TxLrY$BU&jp= zW`sD@JwMWxKe?~z(QEE(D7_vTzS=@IeLE=)~VVz!_=g2Al(9 zr)5lDNAd@LO_qwxJiPqCw@5sk*8IbrZ8jD)!H0EE(9i$y5iZ|%3(*Z@(3|MfM-al$ z)`sU%^N+l~-M5x2@Ym&kqy-*rU1{Y<&ZHLu>D))o9ao5=wP=kfT1{HLq>OSydeCsm z1Ep!{Z@_E(T2c&3eJNo8^)o2kak-_rvvb`kQF~i zq?w6p5r#4=DM?nIN&|zbzm*c_x)fQCuPRnLC-kd!=vUAB&;={Ss}i8*%RqIZ2y2FK zcF5Ms8TpwNny7j}b@{>Fd~!Te$&WlrD=l06wHi$Xzs6sdPfRdNxo&3x8-*Yz#>v* zA>Xh1QjKzoXZf|3ls0`SzMSG*J`}6a`&|VN?`s-WPVqKWh#YE}kBQ1>ZO62rywb`b zt&~iU?GzhHs{4W77?n+>g%vJbNb4MwFzIGzy6vEN+9OSvj|9;R$ILgCb5wR3>~0Jz z9@UrraGTClP+FH3pO)^MNp2ODCQ|Q?lvq(|P(getS|95~b~sn_OzSEt8w_&2*ZEr9 zK~@LkmC)>U&I&mkJJm=te>3vL;u}6x8}HuPlLk~$D#*?~LugVZWnJl16xL-PRdZ2d z%HtW~m6)_kI0;UZU6d*=UTrZ%h+PAE#IwjH8i!1`JfU4K$^@zVTjH)tJ>L|Na7l;O zU?`6l)V^w@o%DoK|l}{@ktB;iL(UR+SJ}n=~j9gXrGxw zd)$=h@_5$jd`;aQE9&gx6A`T)N?#QFdDU^@o`Yrx+>5BWyE3x+R8ToN``;YCh!N~m zh)H)7!|BXFDBoSF`Ne)Mwd*G)&2|(aS|Nc%(6UINjpj63w-RY3?5(JXS|`;MN?+M#?^D6YFlu_WxidZSQf^AmTG9n?C>`#H6_kZ1pw60Ndh4xp zkfcVBsEwcUrBqmC+U}=JHb^=63UYO*oBJO$qPo&e`uQPUsIIh>k{*(C4cMKrP-mY> z6k8Lvgf*oFHDGs;WxeXS z9*v>wakRIl(n}ikJ5>%)ysD(!&euP=7Iaw+#&cBKGej%ZEw}PNs+(?6=K!Ui^z^Q7Y({f|e{&?6!T-`5%rq9)jzXMzyEfI=l8(e+DzZa+ysdu!OFnIn z3v!m#5qoGvUFD$E{RZ)R$`t8lp=oP91$&> z6wcFqXDtlq(hvGuVK5DCphS9>(=cGA%^3P5Z*O0q>>NZF8YmlG`=U9mhl0H!c>`lI zoN$qGyJacib%H28Sn+ZM)I2tf7n*hqL5N@_PMUn3>_U{t(tVJ*#t`ZpqSTV=*QPlk z$bvNU7&}eq&&dI_KSb#yO}Ivmp^C3tc22&&fT#%rFSu4g%#wEGP}`A$$xRNTpA86{+Sg|owt>ZTt zAF#b#6o}qe9nUbX+J&5dC8El&`%qdFC9ndXQKC>--73EIr&CRo$z_lZRZ#2np_mAz zrDIotCW7#Ad0=YX{b^li%_3Dh@ME#p8 z+ogUN$)%aHSh{(Ewl-59%BvcL(DLR=rd$pWEK;c^`+lXtU}Gx*2C4Ht`yr+sV*O_i$GaRCD0}8PlOvPwS!lPwNSJ+ z42<0^Cq%JYDpl<6dkaP|QE^n057WJtN~3B&zXATTw!qgSFQrO#i4dWN61m$WcVsKY z-x#OmcEskVvUAjXhbXy~GG3aUO|M%iGi9F|muYg8GRW~wOu@e*DSt*OtE_CQU;aq* zq7*OMAFVWSeBAn9SWCZ9qRPH<5x13`Q)3dS-4`%{XHL>jUnngr9`gj>=>Aw<^FZ}~ zRoi7z`PNE+<4geRH_R-C9v9yz>y~E|_=g z>2nXzmDb8vQmqpd8>3+7qR(ZrjYUnq>SgK?ulSN@ywX^1s=viaarL4xR%lm5b8xDAGdwymoX zLW|oe*F#7C0VZ3wfEK_P5#A?s0Ne8&^zV|Ok`V|#1vsP1`f8q-m}4b<`7YYfUP&#D z&!(wyaa5~=f{!0KQFI5TW@V(Ay;&^)@V>Pmo{F_<8o9A;C0f$~!^MUyy4FESmgg?Y z7rVWxQO3L)HZ;AX@{=@YI5p^`w02JP(^rTxGY{$7>};?Op{1QLFr6Gm?>Z?vohuB} zW^PGF3(9plgbsIB>PY8?(#y^YtDhu`Zj}RTQT#EYc(FYK%XayyVOKtGqe;eJ_03LU z4Ybsvox1C08#xDYJhe-v#eb`0+L54S86@Lg8rD@AXk&8^vb!5jH@Yg-%kH-mYJnXC zo2h&vG}yG0h9xSErAxbMYog*-#!r}|Jat*;mGIdkp!nV0-L)2~Ktf7zuOykMhmPMJc|EK?U`X`v0c2_!k`V>!Y3dLo5 z`jz+Qo8@iG(Vp&#w$0M$ zy*H3uk599J1bNO&OxV z50dnJ6@?5}LhaA}0HL-F5JGM8*Cd)cTyZbM^r&265Um@ojPm6WVc&WXA>4XZh*)#$ z7revWQNpb+tJWY29-(*#_R*3W#6Z;hgxbKpAE`IVS*DA58eTCnzOPLwBa|rV=hbv! zgmOxH@SSPNNTq?n7__Wday9UjNnEX2nbMC08A%$gkkz^*h-=MP*d%E`s6tuO;n7M( zLzzF$G!h3!jw@6+MqyD&V?+P}Lon{LRQ<={ioy)LUIvW+qD!m6jWAi9StxeviCDT8 zY0t2dqcS3Z=Na@MSpR~U8uy;!#-dXvj-`~b%6EoQ)QtPk0aQ+(@G6JPyPhcF?idHO=?>87?Q6n#y*>Z&d5+K?BT)WoQ0$TW2yr(8D3 z7tm?yj8|ItqKB%6KwZ$>j?BM^DI#qSZ%hFSc7~gC_(b~AA+g#1f{4tKL4jSsQK^G`aBU7i>EDb(rMsC zrDi~YNHwOOhNCJr0g1Bkbr!##C@aScWeFDnY3lK6lr>RlB`>uOAnRo1ORMq2ATY-n zrJZO}vNF~#@}FP~23_v;k1|fVLkli&7jl}U94$Nh&SlX~w~scWUYYhz@^U!Oh=emjL@iZsk_(^_+YCB8|wKexd+o&{2^xTNI!Blms5+@J8 z5lo||Dzodl7n{mtU%fFxw7w&*WdC0ML@XbBD9prKljA0bO7=TGMLb8SlPGSQ;u!#9 zqA^5-Qnm7erOvSa;D$8JA9sLJ0lSW0Rjo=(rzxp&(Z`zPIUNph*Z^8LUFqIo%RA9R z;!rl0-+G)g?zQ{o&ZJWKEV!+HFtex;Mra%}!e5-9RJl}u@3vWw6F5hVdvPfwDhUAo zcF;~7dM3ULrVcX{?ontEsKpp!#5ZG90LIE0N{t$suY<)B--U7Z0P?x71Sbh6iv%j4 zq`l#&@|$2PnxWLH(NITzt|8a2rz4-zkn301k;AJ4xoL{R=eaQzKDkfDHtT} z`k8W5l-dTVun*zEiCktXV~o-Z!NJoUl<0Ztc`z-XsT9~ew1ay~=5V4}ts8 z0}0~Z&y=}}x4iFBFm0Nvw3J6Y3N}5Pt3($(*;I~MPHzMm*QS1RT+@9XIyy50!U zwGt?}F;)Q6wfl-EVJ~OC86$!|tg7fr5gCe+^1fD<$crcD>-V*H?P3m^u9y#>ECUxx z%tv(T>gEy!_Ux(^sE)5or85<8kF6zv{yI>XTv%Odo(bPIF(IGUPxkYrO_|EDhMTSl zxnoCHTU_HGh7sfc2>b51s*dJwxmUP|(u-6pDxjV{h}aNCr5Qo77u1;8dsiYFHCTd( zC6=)!_8PnKnqZ>XyI@7JYxEE_!KkrD-|y_XfcoV3dG8SXZAF`2n%L^w zesr}<66H-2h8Z3PY_&NZspVYdZuuJS7$UIbP_*?n<(0{CdgE$LH20xLsnvJNQm^bw zTnL0i2U{%~g95*)h+BE@29j}}Lf#cQ8fQlMEdg!82#ycKqsOQ21k&z#%3!Z07Ynm@ z(i~+pXOBX3gZau(dlwmvvDKt)7;fG(UrDj@`sO^c@Pnv)J0e@x_;$obTA5+gW}!00 z`}b^yh*x9B7uaf@hZdGt@^v5;EL8mLx5{`4GIA(+lQPb`T49z^S+?5JA)JLzzQnx> zq^*Qm#iK0BCdJ(_W(aAdEb*?N^+6F^AlUUv8MQ!Kwn!Q6x9J?mLlx?%@0s+GNw{LI zuLqK{SlQ>5eU_70$OapNg>1QjX5$iNhS6I&WhsJDTGg)*rN<~@*7u5E*%v1f|0xMl z`cdw3Wq$cMjvR#tnvq#&kPK{n&@0vFZykcC(4%=^-z@0HoU{ZB9mD0lz? zj?e8=n1AMzKpOIcqT2iEDdN&>v|W8@^AAd3%){fHsR0HRAe|_);3mywx(PJp5D&;x z-(a_Op)l>Omm+tWcWUca*@;PBz-(-ZXrLa>Q%uF@~=b?RBq0 zqNx`H&8=1{-&uKGJ5n6qs%K&R)boMn*Q=BcR^U!flmgJo9(&yg;h9P8sLr zE#rZ5M_X<7=Y`pioDHO3)+w)iZ8JGL$V{x}XydvUrr3Ta(0pz^bXT9_`#A|tRmEj- zH-^bVKNa-4Adnn3DgpLWWdg@|Xi`4i%*{3`fmYtFev@d)OxmHu!aS*eS@PJ+c$sH) zB4un+Ui#SnD$8L^(csBl3NhJnA`mOp%6PBg`#6DKl?R;*qkR$G^G9Wc*WL^n9hVkk ztJOrbemJb>@j&w3qKqn6T}H!>5o2M=rJV}XWFJF6+oFv1TKG$037xdkh}Jtr6GS)K zs*LorlhNF*uooDum)x;1$&RDIajP=Se!|ZT0rkRZn~v0Cn=;1x^a^3{ehV4p<*BrCN6Yr+rx@|=3 zc!nJgq{to0XdeSd^FcY8V062}1e*^9(#0LhexHCnoFDI0bzo92ZCjWi`ydFh6QrK| zlPo|ARhy#dhKO#qOEG(A?nbl}st~%NZ3?pw%nT&A-O5q#JG%{swg`7 zw?HasR+79Le-OR9Wnu0=ehs7rW@SpbRojsp#BpqH+1cWPG&%uek*4lm<+%60ZCnDH z3@opy@r5vISOqc1d;7eNPi^hgeDZ-6=rbwd<78^d%TDps@@HlF#MY>k7Kc9!aC~l{ z37qIV#Q`cOsLp>?`LAMOOs3|+e&<5}3C)K6R)zjd?H|-wdxAd+I#YYV{yW9~%WxXC z>{jN%zbL~D-ZwYPsz{NewQ0^(<)Nk2#Xx$o51n_JjE9tS&}ucO8ow${B3jBIxA?TK z+1S*cBUwEomUHrP&XLyxOT?!}X4}S2KE^g4$kdxRqDuUX`6RTHvzqf}+VZQCPzGUI z^6xpA&FL z*2fddw;0*9=9mi1)GwD$w+=ooZ#x(O#11GG9Zb?|(QfWi&jU)l(RXkR?K+@TGhQ1Q zLpKhwSTCsxi$ws@!*oT*-m@Zk4NzXzDR# zhJE}RTns1mXKmFA@;$CZmGNncM(MzRt((%|^m-op2XrkzY8an z110-6#&k3}6GqQpPAY?(7c6J+MP#ZLMs-gq^$dgk*Z_COrT;RHE{oH&e6lJ>dtIM; zomOHUvcjbSpPN4_9J)Afp11M6svmQHc3O!r9vBltbGeo5ob+J!hL4e*CR2XHy=6w9+e!gpBwGp1)Yk|jsCzn^$9%Zz*HP3dejR_ z8@p?Zm{Bfhf1jh77nB&MRO!EoAh~!qpYB~ydOM7qUt9&-T688?39fR9z?cPR(LgYH z$tt9N7J(Pi^rSc`u4+4j>BoyoUB{exoE^&5_<{m$P%sU+uK1DTCB@OWwNngLyaXbB z|6O4T0a}Pk)h{a*)nQ9Oq=5(jKSXLSbK>npLE|qgRa<&l{NIWHqLObDQ0YbHhg90w z!9t~5b3dh0OF;#fK_%}6I+bdjrnoCgtmE}M)LqWR3F)mK2IU2}@75UY?!4v6HA zgqnKlQzCWKlS(4}T~jBLrwp?Y>BpKnkE^7$5mAdyrj^L|zS21$nj=``+hP7y zk(D50ynKhikhh25vrokka!3233N62{-1kiOFEkhrhfA&uztZ~n%k>m@+HS04V+b&^ zH20>g-<56^TXlxK{Onh54?GR6Te8RD$pbkXsiiqppq3Amk@jIQ#c6f$H%A+0Wj^~r z*=}VjmyOpCUj0H-HKm*Bmn?WLO*H3e3RyMTHyMmtcdOn=8=z?%ji_fpL#;{RRTB)2 zJ{$*e$c98-?qWB~T79SW+X*Ykq=8~Sn8~(;xIo~vdUK?Lc-dhvBzuy$1amM z4?%ij*jV0)nHKj)Bu)VGI@5B&5Pv7V&7<-aC#xoVCjzUGAO8od6)geL#}dv<2f*|Z zhnYBxg*L)c!e1uSkw=PRIN?RlA1U#UU6R4dp?g5OboX@~VyN|F#mBQ%vMfFhxn%L4 z@*0k7o;2mLvcN87TocKMi9b>0Kb0=_<)!~t92B9YLvd?kd^0vG^y4OQMBg>k@tIQIIcgLW zP(CHl1GjvbooV_rWr52NxELB`jKY>d+2K@YQl2Z`rgm(L9J-oXJy(KUn{pzUgk|!HH1LH|x6JFNjZ4T~6I#~KwDpDJ*Ru6s z*5Usc#yH}s04zMAx8(a2x?qe1FQr;J)0Tg+sDHu1T=SiB*{bAK zz8Tzpx#GE?yl7==iB(>$`Jx4*MFqpL#S2Jam*wIGZ^RtKUk;RRC2AU0Euwu^Vxpnq zA__N%8dclcvMPLnPxl@-6`E3^I3zv*UO1^@o3{g+Kb`xwlqan>h`C;eZ39}O{zU7qvulS<5qub=5S&4^2(n&3D zfca2KVX$g6wi6S=epp>rr}g73Otd6s2~4vx(T;q_H@D+3gcT~)x^$jMMjLU@u0ux& zqg9=TRA3`2*#+tT%J8?g6K=le24X`$Zx&@JY=SM~hVv6B&Lo;u+|ofpSQq-AShN}y zMB7cGtfBn`I$;vkO3plX`#nX>YVSjiwxV8{(hxGiOPTQp^q{u3!rz8NtQOG(TQS*V z&x0gPBVRdA`-9s$^C2H&Sn`0}N{QNb&)UgyABRZH-KlRWVQ+U_56ncMMBo2&pzrx# z=nqS#t))a|k9)s!5l)rW4iqxFtp^aXmx2Zxa6QiAls9DSUjv= zMl|s3&{awaz7(k*8igNZNr=$yyrKzZgkl(9g0_?qw>{q&Sis>5!_+I0sh6AlToHuO zu3f%OYwbnw#0PJ4z{hu)r4r$cO?|1k%5Q;I+Tu6LB)54V;$9i_imx82si)%5yKi#z z1A2JSV4+NWLUWMc18j{sglNk?#=XVPEpX0>b!2IP9RW_5Z@Fo>YoM2d$PFERo0}sW z2Ul3{%e>3Y(V4^2N)R~Bq)PNHn9aiedtuG=-Q z97xk-(yOYY$2M`?lMP5OZ&{%4LyQIbbq@Pq=&pkd8^W_G~82a1|{aVqT+2 z>`?CkOmlbBJy+3Q__uAMt94vi1hMm(=cF z$f4GWc;VT_T?{moZ)u+BF3wtoi_thaFkmvPVA33*Yl)L&b@)79%ht^17-8qjrCfbI z`cEB!?bO6i1k$du!maUwcF?G{r!jdC@-8SQNL;#qVqAL7O71ZwTBZ)Vi#x;c3|DmO z_`5Gt!Vf1fzRtK!;%Bdff(4+-FdKFHzsks}&b*9Wmvfe7DciB4MD} z@QC(!i5a2ST`~UG&l>FlrLdn%46e7_)5||9?@z`$-MuQx%i9U}15|CnwA|JS5!@0A`*G5fW^U^JnHEyeysj@2%2X@vaTU7;`%|4PYGYpg7Zif zg_V2g-zD>?fuD$Me6uA$znWUq4hIlzX@_QxAGAYPOFP&zq{4PssnM@~VqnXQ`7D=k zRpV7H^$~-*sx`q^UJR3`?UAv!`JRf+MNZw?vlM>4_pn&`HqPH!>vxjIloNvtzeLjg zaw5lgz&^&jzr6Uu%G3}Ke`+1Sp=uRHOP7bAvC@t!BX9uVidH`c3PO2*;ZDmcir$Wi zh}6bR1}30==@@dVBm!Jgq8W2+b?kKu*Cgg>ZujZ4N@BR}%I5N|s!4RHlBf}KI*Ly$J$PfineAt(2<6=YO`-WWPyHLx+%*_xJwTH;+Ao?ZH&3VUpQEqx<@1VR};v(s%U3#geNZbA@Aet)Rg*E6`c(K zHlYJmg{NW4ExJ}!G&41hLV7%2?O#oN=Kg2oM>7zO8Ej9?5gd@QS$(?(ZNoQDbeh`|6k~cvyCwe10kkw zmyDsZfudS;OCx$pPiy9onwv_-l!&kY$7tL5)GK+t^)Q9wo9S*BJ>GHZ4fKcRDajQ| zj4q38BLQnlpqOp!Z;T<2AW_ZO7>r( zmgLaknxdBTkp>JChex|e19-DMJy#reWdWq_k1=HUt}y9E5Oda-Pe> zj>~UBpXTUO>17h*QpX?HB2#-Ehv*$wpKDqvO?2|jQAgm^hvo2lhz$bCgVwMD4inpd)A@_M}{=LMm@#y-1q^ix~gT|3#({Muqk zl|Q=yVDlk5>YktmQ1?s;9}~iO!pMyIX6bBd8!D1q3Tkl}8}R+m-nX>LS#%>*v@yiL zpx`><3zOXou=DRpw73qYIBox->UBl9X+Fbu97IFwiq9P%s|*2_%gD@j{i<7fKKz%P6Y&vq6Ujl~e6`YF)h23)dGw;-J(rTQgTJ=Pt0f&!f*AwoB zy=Q1$Jv7OtXIyRtdR9-w8+85T{#g^#Od&7$a#P2s z1y9^aDUC&18LA&>IhYYS-s~MArW+b0!dMC;pVrp$Z6Uw6wPu!Y7`|E^{P9r=1z%nI zYQ}Yx+f>Xo3|mV>nu#N7U{C!>evaH9j6=JuLu1DD;wv!BE!bnEP00G-Kk}*^pNZ5n zQgk=^)QX|Qk>a+o6GhYdC~>al(S>1{gLTu{%@z_E%H?fP15aXCV%~6va+w7`Mv9F6 zv^rWeEqA%1Y<`}QY(VMx<*=mtx2DrNaX%Sj#8uOZs_3P;33M+;)G@58Kt8d;+feN{ zsv9d}4fgkGa;$h}iU~rZrmbjvb8*#SLPO9B<#S1IhEvba#8#J0evATM!5-l$XR=`# zRJnz?R%TCoq_ss_t^F`66(=^h*!fygex}NlOMj+AaU#fQniEY0al+GSmk%c>-1r&& zGkL~~T!Yw8&*R0gAXsuW*Y+O~L6t-Z_vUOxr}WR6X?9Cdv)X$v4sO7w^!b)yu-hzv zuvpq65W?bZX=}RIQmBT$ndII|gn15>nP4}Xp#e55IoxKNhnf1d5nuD%a!x!`d0~nh5q%;9@^ImB4zU}%58-S;K+$|u8pW*ocJ<`lmt=1-k~kVmj1El zAwj?Nq{IYK&hC)q_JlXBC?!Fx!G7Q%3TiDH8Ai>a8f`=Xeb-uyFt#`lM5Z>PvSCCT zhpsei8?S>-e{KQ&Spq<>jbhN>yHokL0$W|0a)X7%>wr%^4x&HW0`Ts19dMg=Vsn|S zU`x|#?fX)x_F}x9*%q`;x8MFSjOKO|ZWVe2;Q}mvERRhO+fmW|pb+T!PBvyDuE1z7 z)*5P0rvV*AqtDvafv)Po0Pr08zI#R`=(*b-6u=3 zu5pF_?jXK0#{3aPLpq}3rKjmwXLJ;o?BDzrXt{vZP&V7Vyp!l?71A#rz3%_GOm+7i z?s}HXR2$FHr*a+pQ?)MQmyqPR|ISzycLf}~{Xxbyv-OMv`jK0rNVi*Rkd&H#N2ipp zM|Dt2e|`O9N@>jkDK}9BmP{H6^TCaJjeKzCK{U0yVkH4&-L{Z=2CkUSX!d`RIvIz$ zx{5$U;&wXQRWz&KA{s5eF07aIRf#?8|Yp)5o{Q>)9le5);VL~ zj3A2cfrbj1U>?{*q*{4>>j)8YsE*DGSu6u3D{Qx+_g_K@uDgc3dWtARy;C&gOOfQY z&;iM_L-p$D$$6IZo3)-iYPFs``lPu>Pf^?86>tyfD~EiV-pNQ?dc%mgZ3Ug{EyfzA z9W%%F5h+%NxsB;eUopaK!foVBQa{bt8^)U6!mCsd7MlTD$?rM4A5lNi#gKcLp7s;3 zOj$RP^^`(S`$NTD`7W9K1_*yc*fMH1Knyc@9ipEGh)VT-zrkHP67nOr=BJfE{%n%J>@ktus*>s7H zXXim8!SLn)Z5|{JcsrLw-ni5CI0a4D;O);x{Yr>u)hSl=c4-~#Qb<(qH$-ouyUbEQ8^yMQnA>M6@N z1t2(HTFUf8+}mYRiRfBA6-zp#vmhX2(q`o}BSG3^nG1Mc)rP^T4J`D7J{+GY z{jVef7WR*wMSGG(i=c9l&}Lue3><2f5|BmOnny+4=A`qK>kO(sUVLt9QyVSwxGK#Z zFT%?HmCr4MZAsYZRKzREspfm*#ZQLPYkm!bl!-w7E7R(UVEHE+k~>aGkZXfwY_xBt znXgY2R}7}qN8rzr9`x5#;p_JM??q)FV8P?0wM(HtzJb!RWh0eJ5q(OX`8kYD2UW|{ zj%mV|=BEh%(o+y73&WjvHD-v0rf>vkd+(FY6j9IgZZACb%Tv@85$mxH9w-NV*iSNZWZC^dhNtmb1Mu4aU(1-#lcU%hs=>`A#pVbf8&6F!lYVXSNU`20t;qHcdwtt%5~`nTfC@bkA2>^P8ZjKdYr->T$ z^;}^`(P<)~W^@%~yHoZ*s$TjASKZyxq971fVocu&TnIQ*RP~*99kG36Cvuz;rqki1 zY+Uk}iS_-E-;lbS!W^ zNTQ^4aoeZoHAx#jvapvK9SgX>d4kQf{IN80mY8fCdmEHIRO&pvoh3qjXI$mv7?^iU z&SCaV;%vT}^H_?X4aP3N`~&fg7GY`Db{uV<4Rc%I7D?uBTy!$mn;;#?@^C~9jBBBAz=@_!ZJfUGLja5Cj#1rjg`_`3&B@Y_%D$E{PAZISzd7BssLUt zawv8hb*J`b3{wAtKY6_PiIzVmhiF~hayU24X2&({%?;*>9#;OVPRLV_OE++(urY&` zORR!40}JUo0@xilspdM04+$QH2v~^dnxVD_+ALI@sWD zzP~_V8M(`8b0mpSL&ZafWl8&1>m@nyv<)Rmt4zA}aF6OVY?&x)9GHKDW-JqZ$a@K9 zyK&8^%@R@D>M>1UB9>S5JS1T_uli3IN8Kb0k5amr&&ZRIzBepsLM4}p78M_7%G?iD z{AccKt`-ayXnMYqqavXE*IX|eP@m=EomDLL{$BiR6+=CL5d9p2!@(1eUc#t@O61U_ z4e@Rc>GltEFo=UIV372sH$Mn3$0@fF!Xv&M+I*?<3Xy0Zew-Nswlh2JLT^f2A=;PO zd&`ne8{tEbR*2j(H?I`JO7o@*D@Bsw$^eRAB~}J~gBkV=o*O`H7Dzf;?!nuA#KLIb zRY0&7-IF|53&nr53=ZWPHqXQ%l}ZAHWrm%=Dc%010jouI!|#I#?*L`Gtf^-iKN6qm zH9Wp>o$#kwYeY@^5{E6wyJ!o)pyO-AY}d7QIk_BLpX%uk=;_yT`a{L(d(iQD5}%$z{Mnj(3A0Q3vtnb52y5rmYj>oxj^%r-XjOULMlj+?ZU~i$#X9y=lvO zF*#@gDDl}FH0!677;#TLSJtd6%D?>(#p-k%jqvmTKkpf>y*%TKQo`)ECyM{+psAqH500* zmeDoG@+i)ZBG-DjWcPjrr3gv2%X)y;l07Hjk+%v2pNAaJ=t?PDL=WSu2E|5F>xElI zd&k&gU^B>B9uD8++@xMx#dPNN<^ZJYSUY59?W5*c6{u+S4N;qguS zYn!MQ{!q@JS?mr9v@aHGvzTIVsI`r|8(Y*pwPSHaKZ`A%^+w9^ zmsiuf9nv#OumI zaTbQxxxuH)esvT|n&uV;qcq{;_HzQdNa#pG$)jC>D?Arnvb z2gKA1SRANr0i0R@R1>3hI<>WYTi}aX68PI99cB1cZI>R->$#eA=IOWRFO?qX60bC; z!X$SzYdCf8D_r8WjrexFzl(Op-|T!?^s%xThwWTeH)+BVky!exq6<83a6nCRIx2eG zAXGEnpyZ=snb+E8h48drDl*A<`<4?F89b1Ip+D*v8peLoeQ-5DoTkx}o95#uMVOV+ zIal8c7YnYCPZ%N^ruOrLKQ^`h-43fQy!3KfB-zcID?8}SVPSG}lHb9rFoTujj4*Ka z0H8txrxv#N2Hii6x&AN%Ih+w~J-aNma4jy3MMB>16C0uZUXQ*ygHFD3js(19s0DD% zr2y>tUx1sNZ_wp4P-A=>ll@uIq`Jc;j9~pwGF#~n;^?-#4oiy48^+~1X-DePS7*ge z|87l~OvQVOf=~?fv-fhAX+t3r#>YVWPOjyh?811$1}puI^BJ&F^~pkiE6%qoQ;oBCPc6zvNV*L zmCxJupIL{tW??$nwIQ9!62E!=+vsCND@sIjU1)W-_`%fR7c|W1qtyI7=B6DM7U2?M zsci^-bzb;Q9K!coO+IXkaRq(fvmVBy3w4>1UurEZ-)8cwX<_o4qdmo!Eh?Mw)vC(C zmyD{9bl%onE#K1kvXRAzug=n1jyt2wET}wt|Nivp)AOE3IaAdO;;f@>ox)V;Te)s# z<3$l?6|kkY4r8tU?ILmFtyo*O511Bjw`~W`m;G)Y5CS(5+p_+ z1=T{?Nqm|!6+E2@PXx})*Bl*9e_s)irU&0azBM^T;W?tZV_VKGH}3!aQhQj_JT?c* zdJ{Vf#-~7QZTU9GS1YM<;A@QC@bNNNh~-<|@~w=oq!7NA`HfSt(^@)Nq`U!&de!96 zqn)xxdL|c-%T9ChlBrUzxLCWva*MtRA$0pDzmjI!i&llvk`qU8VioHQDQl376laJuNT~e6p+)X`Wjn|71#43rl zQDz)n{-Ydr8xhT`TiOidxO79Dw!gW!5Xg=jH)-olu_?6IEX&TT#GkWqnM9m_wQo^j z>{`}0(nqFpGs;cKs2Y@pd=D+VDy82Nim}v?X!`AzXc6@^kSUv`y`}hJWNd1W77B&0+F8 zPDw;_vZl=20C7p3zevKrvi)V!}fA((fG0?}dyFkWuQ0$ci=8^w5o*q2&H6{3Jvi7LP1= z=xYqsr*LbO<`WGEfZQCpG1E!=siJw~ePLx~XyZ>m{w@v}wLZ}_^nsXcsxbx7rthN{ z4@8X5&6Efr345%57T}gPcrpui_jkRcsq;fI#j!CGXiG9=;6MaEdMN6T2TfmtS1C`F;+_HFX_dVUupX;~QlDahuLWF**|^F%z-qp9E~-#-@T) zRM;YzdG-v^|I(M+Pv3$k^$8qkOZR)-Gn%^PiRvvzRp92ostuCg0=C9}p*z`9(V^Jc zLOQdwW|nUlzB-@qV6K&Uf5m(uPyApo%GyuF@B5tff23#^a^xB@nZD z>-A!KpcvU-`*C?G;aOw37&$7g;9~SqF-%H+{XJBR%9ieDql5Gy@kDsW{NyPWC~dG8 zWNHBZAS(6#wG=UIshel{rpa%XmSXuP6%W>> z`z@FiP(r?8#gmW(mM5LG#m_EDf~i=JgAqA(3|F9()GqtX$*+KWonq65J85mG<}*<@ z@k<^tQx4aY3g+XnAb7w>CD{B&2{s>>@Xu&2!J^CR@H;zcnXYu>Z&9ns;69Uy*6Xmdd*KgDlN-q2*5ntiiGn9u#X7Rd3lCz__yJLjwLZ^M48W)88KvaP6r7sUFBT z%!QO^qR!`&I()j{^KZF2L=>0{mtBbk?u$&2^SEY&v}*Xn1h-2Q<9V zv5K|l$C*~V}Z5d5V z-U%OvzJnsLz@y8o+|_jGod`DWjgO`m@5Djl1vvJ-7v-Z@rZvKZB6pEw&Ny^%v>MA! zu+NcxOfxXF9}m-3wv3yXas!2q$&en=CA;; zYJLx?0m46gGGf~lrhPdQzDPOiL|pUr@YUJxfLg*={~>$<`<-;(M619O`QH2aq|fJw zY_lJcWeR~-0#NzXM?a`c;0CBb+NMsdKiIE^?UGI99K*I>p65YJI0WrE!xq3|)AhKb zNokvjblO_=YSdBBpYY%L-+cMO+>>D!=9ku^H(yg_8#SKkZNDty4^9dG82kPT9k)?W z7+YMsWu9+RJC=0F>M9!$>&^vQ@7Ly6rPaMwwd@i(5Sz-dQ;f~OOJ82$d8K~H&MB`c zG$=WT2*x809H0A^?%AvR?Y+8iJ{Z7lwQVnGn}dp@ES)(B``^kG#HC>;?k&yyf*v}k zqVhTzcx6und%w0gwQRU7ptY%QsJ^4Rv{?Yc^zH7DRX#-?%?VDBr+H0KE!}U)`6y`< z8jL{R7MZCPz?RD$TzhqevYxrR(`@U8*7Ptyb+p!&=0H?u{f1i!J3FaE9iDcSRKPsC zg7)omy6mKmi7MyA=3HXwaU zc#V!U*I8AKZ=PMDe;z5}WaXmzR~g#@3EQys16{R%c}s3zo!CL*fOlDJHMeKvIRDr8^)LOaE$w#9aOgys9EgxeH? z1&=I!N{3w3mZr4!z@X0@@^n>W?Hj@a9h>j^Z{3~-yQ<|p)%HMzC5uJg;%In;t(NgO zt#(!Y4epodgsXbdasNnc;#-ZWNOz`qxYB+%)zk5QTdoS!&BzOymh^-kxT&v7 z{o01*owjEtY3}O9^0!xENXVGU2p^Cequp}j)8#u8dsD*iwx(PUHOPgK$a0x@39zu% zH`QFWtlH4Zlvf3f&}$NP@l?Az-(S&8r+&taE7*7UtQDQ`R4bddBUnqDPES46MTX%8 zlTEqc|2BPIjK=xWil!&gl<4O<3iEv8Y3pW4CR6&^|3hgv`j zTIi=vHD0X}P36j|<=iz~7ne`mG>RTFx*c{-Uq)2xa%#hXzKF_u^;&MHPUK{~ ztNt4}@M*z*?6a-e6shlgf%nd{%c+5-RyB`c_D`Nd#`0==<1+tfN-VE>HHc}>O~IE? zzm$80a~?3oOEZf!Pd(K#wd>1*yr-|;TgJpLe-w7aggAbDgy7P%t@GhB)X{;_3 zyaLtbZqc`|6iyU;5F>3XRMFSbgC-3&lr-NDR6VUsC8|JoOim(Wb@ilas1JI?AA{&( zbv4OhXv5~DuBistD`A`hXVaXu`#H3vrdrQAuYn9=A;7gs z&LQOU+k-Rb;Q0zDs@Ev;7V2x$xAoA4dyXU@Rc-4SUypM+<4Vfo1=^iUG(lBwn||ns z0BKo-!z;q2CEJH$GEUmi94t@O&x#mWz*DA2O&!q)sZl86~n;-4etWi zs-omBwTCuwAbtdRw$jHjIId2dIc^710Q$Yl*8{En& z_xK|N>F3&NEyLzqdR$v=Xc`#;1X>OuHB=2P`iB_rYGPP!@k(n=>rFP9kMVf@r z_)yi$a4gGAq3RkdJF9BUQueQ{!|1Q`E!?R~UDe+1QdJpv7JAT!qfVLR8?LpPRDOPj}xqEr<@+Q@^zHs3Ng(ENLmG=~%4L zH|AnoZI}--THu8PHPBG7fM(TKyBQi@pvU#qCKHwZuve#c*T<+8pqHGsrtHMMo^81Z ztaZ*oC<|zoR#1qNE(Dcm^79Bp#-+P|wGp0-R`6(Rw(zVB>N_V-?Tl$cu)+<4=}K!) z?dU0%8aQ9VFUL0VWJQTvhqg3O70=r>k?@0;VQ>RPn+R>-DSFyKUF7xeMZKjzJavl^ zf5RB&!QoW5oT1QiIBQQE{ zY?)P2FUT@2K>zC6jF0qanyV$UG`>I)=0QFF&B;Q)Rsg3id$ivRL$7MrD$3yF+Ih?O zq@GMWX!-tfk|GeE!MY*(u)w~(#2`H*>DQ`KN)9O_wz7Bz!F{;pO46*L1ylHstA zRDFzJz)?L?^)p_DqXj$6wF1loBh@X2iT4l63ZYeWhjzj8J!SbGvV1cv-(8mPX3KZA z<-1gV3$%F_f12f+V)-WHD`!TXw1kx?6Xt_Xc~#96qXt7e*NHB*b0Y6H7E9D_--93x)bB9I#Ge6Pr z1l7YZ_$j3(sP{~Be2~0F42^89HZ+teOFLSt*d?`_PPK-N^ZA=fw^3W#t@dV9HHM^U z>e)t3Ec>s!1j}2Y4lr1p2@26tchRLb>Wqm;3UEu^v@B13buHkR*adMe4c=qX_`rOdAuJFCEnCUL;Jf#vj~oA&p7 z^P{%vaI0#6K*{oH$qgkJ{%3dsyOi))S0*Cwd$NUJySANXcTlU*=Jsm+fIQ@wAOC5N zOc&(9gBpcd+E}uLbWlU9aTcfl$r8?4igTRX#)X^?{bCo;)qL;IJg1bi6!^~g)S;b;>U?7zuK;S^Rh{VK>s?2` zLmsDR`J$Wqspe~4)xV7o7rUIJ6E(q|N;xr8Poz zG{X?8GpVMoqq99#FSmbPECkR_eS=YjP56hXd}kGBoO-E~3}39J<-JhzU3iQ1bT73_ z@WQoR>R5+w63-ml9yfX0Cpp(4(NFaX9`*b(>jGPH8eo)*)9?R}fbKE8JP-e}eGytX zN!Ql;(pUY|6#I_Ouw%+)o`p79RI0xkP-d5XVI?O|pz!{f7bPZA&;Dv7FCP|dJYHPY z5>^0fd26?==0A~s>8}nj<&0=hLcIBP6hMLzy4h+5((4S)e_sM|f@5XUo zfSxGTuiT}SG617T<|!O>P_I`O*n9M_E<>2FLy(UKxc$qSFc+_+ZCXOR2daU_n{UU_ z?SZPh19Gr}#gkesxwhFjNNr(dqX0}$9cnjNZRT2&_f8e9yqweA-(03mgH=D@XRiTO zAM1JMn(rISPoXipCNH9UgVpVZQpah*5H-|L>lmFLqP8{;wXH)HhN@=`|JYE$P&K-C zb(GUIR zhNpw{YVlEINvI3~#VFl+H;1P!lW7a9E#sGRJfyKCd%F8GYq~sE?N5or)mT$!>pB3u zjP8t4edx$=wL;}U;5{$+Q@juSBk_(+tEF|APqrgeU+0`dQLJ1IKg=J$lO^j==m@n| zU^|&|AY-jh`mve-?A`@1t=}+WjJWn^O`0=8t>zr1L%AtGesuxm_y{$^Fz683jZ}ZP zsRnFP1w9|BHZKFWWdc76c7suBIiI%AK5i!Ly0w_R=i)UB^=##;$X-qPv@-3U7B#{j zb9A05_jDYs7!97Oq7zs0OhynL8m%@r97Nn=&N29@=KBrz@o$QC@!VV|_1X6Cr!)^mCvYQ8d7ondA4 zxf@EozEax-M`9z06w|nlSr(hw6wOfb|j4!k5h9hS3s3b0eY1+G@yQry7uFuDxaJ|^OMp0-aQ&e z2a-WabQf;zN!;2?{pnt^df71VXUZ6_78rwXhSJsvYO8vF0GrIS0(9zPup9nhusEVw zi8X?-Z$BaCrW>I&d6F7pZ2QMJ8u+#9=jF>=5G8XR;NpI-DCv3AHM15^L8Y|>P>2b=h28t2bt+|u_xQHhr>*-MK?_cJk zV%4J&EsQDQzusq(QRFnWVwsNo`dB)jA&>W^;3?`J1Kyg;o1$KyXuk9x=vC?{(aUuy zMsMgIpm&l3{u4bN1NZ(<7~21V-jA}VLi8rwW%O!>aQ(6D&pKb4i&koqY+O0_OYf8b zx|DSpqad*m|u8y(lPO;yr7Yv!7lV7U(q|^{wX$hR} zNo8lKc$Vx(S}{ZIV47x%!1a5c^zRJSGho|hmY!u2KTC}~E3Kbw^E~@9B|QBGBMIAL zyR!va#bgRkQ#+X++92!Qva~EsZRa)<9*aE8ye^0PgPW-2Of}q)v5}h1R2!CScwMqC zzv6WMD@*NKV6efdU+ch4w0x$TWQY+|HeIb@_;~|GrK^n%NgHTdx?0cW-)o$gUweCr z>p8A#vyvz)T@CX5W;`n~81-LiFJQyc*-ks%g{x%9nM*dTw(26;Jx`pi=m7i|o5 z)}HvYG)2Akv~Hdn8*=6%r)Rr{t@h;z28#P<*sjr;SI-Mp0s~w@R35}>=ES<=kb9w2 zaXu!0y;o8F`D%4TQakE1UyZF`{{f&?!#@S2uB5Z`)r!7@?=qpgGc4z3POKNE9Jb}{ z0Pf9JQt1V1RnN_BS+w$Gr3qHoPD5En?e?sQqKeavWvRyk)yDW+p>I<65Nn#cKyBr? z;VnOsV%a{Lffd{Z>e@0b?^d&HM><)B<}XzHmsy&JkdkO1t$h_5xKyn{p`=bNZ>X7r zIRw8zK4qb7Y-^|2jWIbXkqukz{Vc+Js=+2B7lM`5>oHjHP;lYmuR{iFFlnixcmOVo0{=avG2lTgA@^y(M-!`{j7 zvViZXv($Wv8f<43Dd*d7tR>1m^urRhrlHePI=e&_Wo8**RImk9t$jrcA(pB^W$HO1 zSng(hT7iQ5{e-8ru%j+PRIa(DG;CnU5JCRW2 z1Z0y9$13N_w-LOi{EF^As25D}Wgrp0eL;0rs&(o*Jz-8fr3F|q9~bTbzF)U;;4cx_K{Jy;7ZKd^0bKYOGRw*BWRCkX8T5k|0>3fSDizYs+my_D7jPu#s%O ze7-o}8R|h#IM<15{$65Nf=nXRP3-@>QiBTB*SiZy(<&!tK6f)g@ zQ+;f?KC&lEh9ZNvOd#_*O6LKdI+m1Ru412OFEXxG+n4q?@og<&j>MHkxsr+Ap{sKMnl!iB5AV^d-$z zN%L!&Omn%tAOa8};G2I=&)2D8<(|!wBzK=}A-R4Ry`=ipSy9w-J*fT}=XRVjx`^u6 zy3>^PYE{3J$ZVmy4X62l>eQW%tyjm`HvR)tZ-6Oh)CRSS`;ELJs=FMJR3DihMY}hs zH7DkNQABkoICZLP)-sd{p7BBwd{ih1K6_^o!SDAd%63&cCBe_a$%H>DzxsMAoZ1)( z4wqKofV@o2PT91cS}p?g;iY)1ht{VtC2dqEw>KV&kliukPY@U?71YfLK4{B4u=)lo zjeMcjgt^e-7Fm*bA|P%a0;VGX-0#Nw5!3DOK%yXZO8C&LZ|`Nn?e`cd{@APr zmTj#EW@1?K>~_dvtJvL;f__vZ#FuA7*@|*)j0=y1kKki%p)jeF^=C4q(?N#*Js>Xr zQS~(u0=0uTsPz`rpKkxCS{q)3(Ze6r#>VbvLMd>ITG4dy43gB8Nvf8;bXuZS1Qx@K zt(Fi*v$kMC>`z281|uW}+Nn^wvPG?8ieLcA*FPv@djnFostt{mPFt$p2RXI8T)paZ z^)h7D{g6UdedB)>{H(rS_3uu7SoKJm^uwx;Lp&a*lU2VAv}Dz9Ay6~qet=fp`m}x< zT4eS9bJY5kn}^|KJ#yQwPB65nNAtF0DW?qH^7{$aoL}ma{|+_QFy}M&3v7hM1W#IZ zKn}U3JAd}P9nNmFHmybtE13wH>X83Vb*ACbKH9lc4Kw@|N`LKCyBQPqSxOrlN_}^! z{S0R^D0>$YWYs2z-D-Vf`wW@D-35ZQHjC||Lbl05rtXG;F8>z`6qnj`dbirl@HkrH z>aHc{c@H$+TD9oMJuv=l4<^N| z_BERJT3{=|=Iv(Hxuk9Gu5-LQeJ7pERLdK7@1j34)QX;S5t`Q@dJ*>^3?ZaK{mbxV2VQ}};>P(MmWWqD=HGu+`&k)UZKqcIRX>Beord6R zblz@BQ7_QEZogX5V7Rn}PGqW83|qJ0=#T1cIA7IV<{+#ahQpia+F`7|E#5@dN7RZQ zV>bN{PTH!<)bNPf(W*Z^*{%i~%2uXhN7OiDUT7Bm6%iC>NUKC`k7DT}e}ko1mr8W{ zs5;Qt8v$|lk-o<0!kEDoY4|a9zTrg(nU14Ve^Y_F9#^An8dSLQK0gP>Yfm;_+fekx zAjj4*&B9A$_(Q0`#*w@X0|CgSV%K*Yp5O*R@7lCGw1ndxH@k1!`B#h0yi*cEuJ+j7 zm{uF2eY_n=irsQgAb0+43MskhJykuSRtg&V1B+&u9PM3(CE>OAaH+fN%D46Vp|~Sf zZfeyAm8TIW)XEc&RR9{SMgfhCr8*iFq$X?sZ9eoVJ1O?8S0I`8=H0pXM@v|t$hq(` zYgd4bGu%Wnsfgtk#Si}={_fU7wJf73zI9>zL;yH=8VUF;pSH9pL2zLL#BVH$PcDjg z{vf{j?Lq_+i{hV@FGg_TLBvDZC>+uM(Fv?Y5pzQXZCe<$Ip(AQ@BG55GBKofd(Z&D4zIM5xCDPnx;N+>l zg?nr7_%H4)$JMC+mZqLos|GnSS`w*agMiek`X3^-8$lMNO8L^I)9M(5ePjCbygJ?M zHb#}AM;~ETE{ILXpSCuF9-mRW8(f=G{8{yD!x3CzbQTMJQ*mnSoLbJ%yD`-~htYVb z7Y#k9?la($WC?D?e}g*`jw4wB7lLfr>gR@%;WR57)`=rHs+A3JYa7zzY=GN_t?uX5 zUk!umOK_eOCAdi-7LNMx;-&yFha|1LxZHP(*m(3BThemVs`D&78f3l1vdQ1Aco_1ytc z9?#$2bKn6|6$Awol%@#WE~p@)AgG6e6?=&-b`%TtL=85A*mdl^_ZH8R7<(_+3u^2> zXsj_dG`^qR=RnOb-}j%pXWQ)T?Ck99?CdUZ@QlPplZ)uWY#drDzyV{r&Dt9ll0BJb zfiXdYvE<({j&=tOHw%oBg+SC&g&^{hL3In1cnwP1e?v+A8p;TttY z$*ZlTlihgG$$AMo$oe*T5Ax~it6QIGYK3NAIM~=ArUD(mVGIm7nFS7Y8arC6^pDj- zTQJwcRl)7Z0?*pbEE)<@MF>2U5dZ#=CaKM#_R#?WWLbCvP>YO0j{09IxTXBO<{9%ktXekLWBLf7O zyx?--&cw2cVko>Ssf{ZyRGv3~LEFmu)?-BBn6GYbsnI9qt$-oaY%V0BF~8+E;7Y{Q0+ zkWC!e=3m>R@1}n>a=vVjR$4}{?iefkeTS*jqa-2#2w$v8C`NJi^*R88j{kz7p z?7S8}*;=arM+vZA2bNn(fTf)*ENzlb;aF*_8B1y2U87G#GfBGKQ6Syrxqyfb;b(zZ zoAtntCKaUJ!@58)^aBN_Z*nO~*7uCno#z$AYYo;k-0$xhV~SNPNO`gidQ}N+Vmflq zI9VBQMJ?_dpDMHUROf;52ZvI63+yM;PFW=5!v|2#;>{HO5N0M|;fDks2JXr$(PJz5_!wdz~1n z6>>GFJWBgDyVBGCw*^GEqds z|7=AEU$i3VKU$&QnLvn!0@}J$`NscUd?@Gyn?G z&vI@xmZZ=Z#+scP$Y>l?m(kkb$aVWlFZoGi&+~@UuQo-By{OWHO|GfaO9^|$J~4%w z@ToDpNPlPP`Mk#P;FbLT;05@7&)aV~VmfmzVNQ5y{HS*vKEOiWMkdwSg&O>A^fojG z8tN%m>i@TKiB*ql=*iKm{Y#)H%RC68us25c;w3kLV*Qqip6uCQP^s0d+fknOV%ir+ zNMoLwD$vL`#_|qva-6>IJq+iV#?huX#*#(7(Yf2!m`}dJK9ECxZ9%NRM57w5r3UZd zf>pH_b$e&@b1|lUL$?DCH2=?~M<1`bIk|P=d$^kfq5#`!Xva^&zdc&6i0Hzb{WgfI|W{Y0NlA5 zy_pe{)m{|F2FNJUyXdm~e2TYY6-zdd3GkF0wGRmvcF4!`D6D~geohcwv}4gD*S8a; zOTuePl$Hj8{L4bUPL^u|84EFz*Anxz!+im zoLEh(9=~JI=!(`8;?M155JfsOpORM7tD(n=p|J9NgI`VcOS@$5Q-Ve4lws+#+?91<5s4sAwnIpe7#i{vsW!J)sfM{- zQy&pqFvqA5`cjk|3-kO~Ug{|u-k{-P4I$3j2FdAs17*0e8czAI1=(?x1pd`NuPMik zEm3-%HxDSumh0jkbf{e9Nm9o9&?nX7GTwDccfcpik=8Rsd<3HU7DnwBQND;8QW*8N zW93yXJ(!ha7vE|)ogzFctBt$-nPR+IDH`d;#w$Bkk&QPSR^#d?00#{vUiaE{~XBwHP;A zU7l^x|Amrm{SduH1L0=g=EsKV94EVL?a5QWhfYTu{FyJc4Pb3u^tD7g%3*>vi8nE3 z{z1nBSeSBX0euKyxrRq>XvxyybR&=r(Cw#2L9B78=Uvf~YvPHoDR;CXV8VZ)-1UT6 zUfaMt_Y`usZ$zcC=4V0dN1fe^aH)UTx>h5fVR5edZO?-!yCQQ}hP0-Y6sX zWm3ry3YA64(7Z~lC#o2UM+cHQm|gIkwoTlsJVxG92f5ulZ#Wi`kf3U-o3x@5tE?!$ z(v3=Nn*Z~W5SwMi@bts0U(g-Ai^<_xvI>T$OCvEN*6pV0A#AGBvM&XMvJ{t2b^f(f zrmRqQO7UM#t-@HC<7->V?G85~@FvWnSz)ZJA=VLX7(RgXMpoPK+CemE05vqSCgs~) z1Iw4Zj-RRcl8;-SQ;Q-jNApWH|Jr40tlD{6VP-LtOAl6Zx=*q-{bOV;l)9W+FxF4m z-iuB!cEGT?7yv&>Gf(H>QM-6MA)QcdU(!dg{-Jd*qmo+q5xu%-_LW(>lHZLoDznLkiZ-a>`&24bg>6uFbTuEV!tmVj&)?JQs%)0> zs*8DIB-^Gle9|LZWDlxSjSVx55CL;{I$DkWXn3n2z`IjYG)p%O7l9q!=vXuxYRK0i zP^BB0skKiUqj3Lj7b;ql^)GhlpD0cE=64nmVdkwh z*(N-_+?G1Wv6afUV^pjb8>Hm7HfPjge!7a~4xpn0MMpou{DO|Y|5~0ZyjgY_&dNqf zatI&mr$^{qJX@eRwxYBI)}-Z!!?G{bSMvX*`q=W{N&df3uUpd3YyZN_)u4T9yPyTp zIIV~sMcJ$G)fI=)tD~H}l$Fb5pOSp~BBeH3>$r?^YP04_^A;3Tht>10hf-SiXj9En z0FkZ)jUngh>~cHYEmDWgR(8#x+I3lgzTc9|bT%x&gT~cm)2zCT$5=|c9N64D^cxK|F|Ld_L>o-3z4F6Ra!6#=_0tzgP~Oxdkv+9KG83ToHYn;& zE$g!4)ZRP5$x2OJXvxy2RDd1*R*!Yj5BEDue)Rz^pb53C&zL^^_shhF*|;lF3$(`W zsm~@TQH{;Dlh_WOGP)ssN@lyukKJ?G;&7agFL4u{kC=vnlJEnoF=hJK*@cb8B~1j4w96&1H65D~bH-f=4&1$5%cyq#h4LG* ztNPgu0_k#NmaGq{9Y_I9Sfb0+YcSuI5G>Le+9k#gu_nx&s0jK+1*+3s!vRQr;H>0B-34P*AN5O}{Rpyp^*=yI+ z_Ev1L|I1Ctne=VWpp2NIjsh;0k@Y-O$Mw{xHH(am*en?5Ixc+?Qf?pGCc|(oLc~rq z22;j0wSgtIC{pnlY{BqSOHQI=tfp>bJ{d}~D zL<%NWlgbjrdNl=*$DU6=W6JVQvs6W6PnLC#EAa(<%p?nVb^5=ccP@lJ^k2}A$5XSm zEJLxHsExrFZQ1b1U(t9A$^ol2m>qDpSuKHx<>0co5k*{+6^XZAfo2D+aE8~SW$oA? zyNshKf^j*oCzWr{7TDc5qJ>}gpcCzxx%}|8q8Dxpp_(Q?kEz||zvcKto3({gn`h>i zsqNNxkbY`qs?ve|W~hJ$smoi^hYqZt|J2o@AKs~%@;^r%jekuvicLc(q^@d%@ie6) zTjF+dmCTCn)>dA75EiFGN>hhUY_zjyVKNR)AVo8f746Itl=GaDI%CRf!_5afvm~7l zi^amFh9FdmxR*hAy3ElF-os@Uc52uX3j3a=R2;e-hGCpD>xX|h393EtFO_ObxRoW` zcsb<^V{UZdd*-SynsJ$4UT`U4{_}g*P-k=JKy_>lwP`}}-Po?sFyX>8JX))`k?@!j z{u_yzNjV-FF-wa81Be=z#H@iiHfqE|s@R>?bE+$%2jUtHyw;@dSwI=xS;hK&_k)IZ zP0z{}v=p}rY5sqCBgGlHj6X-==twZ^wL66q8EpDOY4Ai?oUuQyx`?kFu@X06W|4CI z^hnWL!<0`eDZ2-26Yc7&xv8v=ETqz9spDgpGDQrWA;SF~Bk!cR_eMIu^}CfITGx`w z_hd7bgb3Q*ldUwk+GBIQ#c=A@i+Q_M{WKIy;xQMXFDGYtotKv^&!suNSg;ZqPLp~w zPcQ9JGPtnHorpg$yw>c}cyM$J`qYd0DY@93?#)cf)CH8pUNh9%wHs$DF=Gd*(iyDJ_M#3PRmkR zu#TJ0rZO)b73;_B?PnDx?=h0TFOrQE)|aK*wUjnaT*5k+Huh!V#XK$H5_2z8`^6q5 zt<-BnF4MVlNhQfEjcu~uawZCk7jZG^QAStNSVUZ#aW}-ZFpw0;;|9&i1 z7fN0Gu{nkxP79rhQPKV^TFGr>j_=PF>zsU}`r%Eo+F7RF2~iFnQRY_zfO4s4GX(Em z6@7hAe(n>WS7%(NezwUa4T3M`4FFb6T-~TuI%`whgj^Vq=vvS&8UbyH`3x=LLNC)< zl*9Sy1sT+%)2Zqp7NxAme)1qTIWT`3r0*O2h=u(#5y->OzlQUUeiSsAwNmDlF=q^B zJ#=lY^qvNp)=yy&lS{I8J>AjuTT#_3LWDM2Z~7aC1~aoP9MlFYBxIwpBG8<`b(B zahMMzc&YZBtTm>S<-axlH81r>_yS?ER#a=t#Fv6zmTckpS3@TYu~1U~CRLLN^l=#L z%6I39@giKcamki5rolvSu?(v96nNq>ObDQY5irnC+@>QBBCx?BUQ>aIg*P%a7EHq= zSRPXmuJ~w)Wq-=mcS4+}sSnFjGqE-+2FJq*#2CKB1SU5q~&*D%EO!)E9T6v zW=wN-A(~6p15Ie9`-BKWXT_>vJ_1|pR(q%kEia%v=3jM~4=o?bBAL%m0H5n2m!2t@ zLZ$1}2^F|%PrmFFU;u70{&BN><8kCLid6`xg9~}!e=dv76XW-Toi;VlRj-!lPA5mP`bt1I z@)*s2xAFf2O~>gxx}&RD(yDG(EY#20E3V}56Pv2P{5pb`{KUrDr7uP6F_S*6MJ$80 zc5xA5&E_})@4?-zN%J#UxZ(5?2y!)nE@!adQqgk&8F?a2nMX~Tx4>x7D!Qx7J5lK| ztec%D@(PgC<0xwktKgz8{s!dxcse|W1u198((^IQLw~6=_8NYxiTA9=vP9eMe_R5a zCEpuL{l+p^<;o};KbDn^c_ZcISqygpxqB?Ud2$C9&9cF*KJkJujZ9hCF19`^vH>$( zE;z!kgEs%>)}ni3Sy-uxq+#9RYph$U(>qY`IObEKF^a0EY6`&VYrX;*WdRu}KpNG0 zwP@ft7O2E^q6OnvbtU6>${oix6d(8#dPoScb7~KKs)zQ{-0^IDiQLhJ@j3WZgZG}L zl(i*lEBAh*;S<=n;`w3+Q7iZYpKATzs6-~~SA58q_*4;p>{ptV$=d5zKRBcLdYx@g zPCv7Qt`)^jqPX$Bmzvi`94b>^ul$ar2UY-rk+5V-_prQY-JwxBKpt zmBsovF6)T5Or&I0-~Aw`-ICfh0d2+9>rT}svO&(jb`%i3f0KWe_jaUx69Mtwqkltu zJdyP)7uP{RJSL{$S+Ey484gHXfN&SHXz0YR5^|m7{v%OPmS*7{mBo?YG zIu8D%T}n{tDXgVS;#DCWu##}K5_3atI%P~@1Nq_gVy=?2g$t;H8wzs7SOZ6-nWD}P zwuW=%lhX1)T;;jQsx~W56{a$#Ed7bvPGuAE&ZLhO~8v40fTW z)6n0kqs>#Nv451Jqk&DH1I?VtvR&q!7ub{pHn!r~lHfE7pT&9>ztRFk67S4+fnyHn z|9cDCG>eroyj}@_o9yZAEVi}iNWghpjK&jd#l5iC)IohnB{tRWM~iQ6 zz8z)EW{sTHvmzVbv8ZkoI&mu9o6VXP8?!vBNajgIw6Uf5IWR8rVRUK^RGfK3#eWcG z&1Gdumq-)b@=h%#|Am^RjgtJnbZ{;s+u@=vC}B3#c^*qHQS7v+%B^9RE3OO?ng}%R zgY#ID@-&rP<}*(hQ!tvOEbkpa9Nm&l83B}B30ftsf&_q`Q^_19X5Fb!irOq-TlJe3-X!ORtgqh?kn_Ej==&Ld$E0|!hZS4E3DFF(2=`F;bfaYp zSyRWu$7Nh{mVI$?lZn+Lw#siXN}tyMyYz=+GN-($d~#PhyNGpgoT$a2G*^AQQp{pD zJTUHZ00f`CpE&s?t}!k$A;HgCb-ehmL1F%5F?*=<8-TjD75R5vw-0~8G#zKQmIBj} zTAakxwX?b2GUlW6>yP4&pFzcM8XA4*OYxkJczl5kblG)K#NlORdmmwxt>2MKtYD@R zr4k1fnIhTqxH$Ka3*sU?)VbdYeZ_LAm#asd&SZqn(g7W!`IvR4dn;LbaNmMALOnnJy9U#KQ3FmR z*75*P=eDPeRjirIy?r9KM8hmEMU0U2_LR4Zt@rB#B=3FrHwb5$SzD*CXh*wNv!qTt zezzbFBEMq3*Nux zlraZ=os`{Pmz3pis7>A0urQl|86e`F_m^nl8rHc&KFFc&05EaGVjuZ`Regv^@VJy; z_>^Li&Rq>CMb8g3bSjoG0p9jviXUBr+O1{dY_3fM$Qkc0(UY|-xm5M|LDC4B6m`I9 zTn!;$J|9FUddE}abCA3NAOxL^mS6y38#z;&`GtS`dcm9vW}Ir$(xFt z%imt2+;yysF<=oE1iM#;1O)!ug|J&kd z%Lc45bJjBl!yi)sdF~s!zn-;pirO%*?~kROEAfLungW`7(E62f-)1 z>=?9M9MS>wRl;a0q5l>upqDe`O%^EsP1iR7a4i&&7#G#@0dQcf2DqKb=kYgn-N*vm z)S4D-=L@kQ;hnBYOEv=D`$@>R{WYD~$kJS^AzxPz>%gE^rtGHZQwN`#)L;|yGBgp{ z99~nuO)R2Pi`JKMbK(9(3tuFE;S0CzH3VOr8_-eK;`MU>Uxy^b`-CUTYuJ{r=_e<>LFR^33#18!u+ou&x*~}_fmB*@>!Zu;e zbbd4I;-J=)lcNyhZC+CR7PeQ}^8@L(vd&7CE!2H0`^)A*O|)J0d_kSJvCb}kZx@3F z^P0VVGHhGpo6wbQY;Do|(171Qqw(8WZO7-^3dWPOI;JsQ-wqADStc6V=oy9nf`#Ao z6zcU0G{{>M5P9t>t@wp~FDxDQJJ?R;>P|YcgEetnw#5RaQA;(lp*g_Jrs_OuHx?uT ziSP`%{Dj>Vdj^f^>`oX%AB92bFMNjh#Sb=iASDhCl?Hv^^6%YBiC4{(BDUOtxNTOXH}e{Wt>ZLR>DhFJzIw+|IXZs zzx)0xjk=L)YkQV<{LWI{ufbF)#Yn8M9hii6)ks|)WUjW4wbMEJt+IfxXQS>)pcVVs z3T0Y=z`G=MIArfcPv6EHXvhKPbq83`$i$^U9ML|S z3--?Y0h(_$ruaVCU{;S?7r0=5C-$4MHt@kZdBSI8D<vY zOTIz7#7WdAJg$NE?Iu7w->LxZa|jloz5WKW$&-D#G96b&Sa10%z0U=tOZ)mBnJ!NG zPAy0uiFRM#j||c=d!EbyA9?G31sRZ@Qdq(8!t};pr5k@id5BCfn@qPxdG=NM$U^wh zh3PJqbm=*M_-p}&o`o4+HvZDW4TXfy*9!`W3eJ6%KI{m}OV{+=!t^a)rT=rZAbn3^ z`cy4_r0n^h4i;pXSD2ySR{(xIRe<2|!t};prH?5r-=;8~eU;wicme$A!gLpz-a=!& zF8h!{c7dnNP&6aPW!YD(C4A%04Hyio;Jn!X!&*C$pm7xhV}7~IpYvvY5{~8`+C_a< zN0>pUG)*Ljqi{K?U6+!NV#%;59RlTgF8y|bdC|V3%-iwSV$0x*uu%uppeIM!cEf^! z$aVF)$W@y59b;u3Z!9Xv6{+@%p{K{NJ~r$KAe-aZEIPXHF10+)YTBDuTWBfg>ZtaqPA`tLBZhJP0e$~f0X@p`@B&K)FWg@gO;#sa2PHC?x}Ichtx9`C zLdN!w^Px#qW1Q*DNfvB3T)fen?J%%+GzFhxzBY}vT*7wrV^2ys#i}YzVk!F+i&GZH zn{!UF3ySi75q&(%eCY65>~AlXfj^Y}3+ZMK+o-ImLD}c9x0hH0uIJdEpPfKO&oiUa zb%8nZJnNx2&g(8027fwWVeou4ZMw*YNA;h3M!Y{Tb~v^gu_PFMXb5I^jO^VJ(4>A5 zKb!IM)lyO;$nX;8&X=&~s<_Re%*!lV?@|0Ry}06Cn(ka?$+msQ*T590b~|aVdWB`^ z5^Kmqy@^p*2G)F14~JKH^@Jh_rPsiB9VBA=B-`x=e2B;j_+}zfyn$k}M7rYJt40Fp zudxI}v$4=ajVGwVHTHO9rP@VmefG=8YxS*T5}*$}z_Wd5LtX%W5IGiANt{K>SQjnQ zh@5%vp`Reba+x7kmK^(1i*pv~*R=0L(E@-a{hSu}0%h{V3tmat3H}MyzRIvg%a9{7 z%+bEbd|km*EpD?&A1c3N{Hi5T{&fg^#7QLUYk7K#JmK2+KLu%FTDXBobJxDh0okro zwB~6sMv?j+vJB0;kMBbCUutpABK?~7?N^vS67)HzMZQ3r^LA<9W1_wSutkf@5$SXO z4FKh*YH^#9{$vDd4+L~zmM*^MiO6pFcm;xqNbx;RL^i?4Z&gQXu_Dk<#Kz#mgb$Hb ze76;mLHL+%i4@;;MPvzl)QHq_if@j{r0ke=h{~IW9grhML4qQARm5h9cD^?)1Oh0# zdfE{KRMaEdyP3531}mpj3!y_dSc?DhbgkL7KKnfe@BIQQ2>zXwcOzdw!ECKADQ1qj z$=r2*tA~Lf%OBSC46)y*SymhUJQRA3w5&c1q#?IhjZ)SkN;{7$^pPi}60;I)Y}Cnt zboLgTp#Py#0=52w1&+)geN*l!j`6brxG_ac)?!VUHQ!I@>kt^l7DCio;alxD>gH!) zGZ3o75V1y;YE^dS;+1f{N7SqIGQxuSFBqdlxjFx<29fH7D%LD0sKRL!Io)Ofb|+ja zpzfHLr7BR(+pM;v7BLsmf~ zop^}-^I3?neZ)NVv+)u52ta}pX#68KL;QQI*wU&xp1P?lRuRonS#4$GIC`P77W(XR z2~;l+hWelc`Z167(Et6dd?i|!nC*`#O)u} z&{e-6C6Gd&W0Jcvlj=Ulp6&%7%6`tuDBFB!!*dpIm()iBt(_c2AD**7KTj>}nyl?2 zMPlqoM|Sa_Z9PRCjqs$YXKK1C2WL>57g*H2y9MrM_qi7>f59p`Oxg;L&RZoo`tD%L zeZk7OmXDQ^RUN)bY`kh$xs&s$cz5!9$u8^fKEFwyUb0rjkCYc$;C#O!U_P-y)ci7a zf5j>|#g~G7x(7cLjGU^a5@<0Z^(C`T(i*DNvet{@d8LK@mNXaTP8?YHbK9$A{`=Zxwnn9?(1 zz8fHfkbD!QyV&?o!U9Gl~?+jiT-90<+fagd)9h+pRBegj>}|k^cN#pSofUO ze$Mn1`J1hiac)>QUBlBY7|hYmatBR#Hz#HyGQnv_t$_&>Vh3h5>5$o|1H3v!2~7kF zxg;JF#@p3`G;oo|^sK&jqVM0ZaURu63MEl)!me}#1+`7sJ*!Fomc<6Y?*y3}u^w%; z6gOr5>nfu?ZYFM_c8!jbyCWzmksWwbMlzIN&=M>4;Kb#FCYeareAnmAxx zlA1$}-!Ws`;liSg3+ED~vSj@jSA*D$#SOq9X#$+Wf0f6Rl zhL3?#D5o58#hG-1SpA%;yl3gPMwBR|(L?Fg2s=O2=M{n>XUI1Op42gAO%QYyPnKlF z{L#lkoGFsl{p{)Kd*-cMNyR>}zV1Ic73g|ui)VtgnC9|M|1+J%yV1%I*m?MvDvKv+ zAk|65DCYy4=y1Dz4Kx|AYhG5HrBaW4Hp69aZ<#aMvZ!xlM~)v^m2#0e;H&Ue0(J@x z4Q18?Uv-vQHNJXhOI<&*iX($XoYNQ+)KWZCo-0ifJK>}wAF&Xxd7sRyB)p(A4y6eR zZapGacGu|#=&qbmf`Hhm*{AwD2;0U15OJRTQq>Fihcyr{trav?TXp9?v9wpLNS(>) z6EnN~-BYxoq$z8FvoK7Ix1lSaSg11Co(%u6e#NZLSe(Q2ms7?+tfAf7)73D*kE(Zj z(2ai>E4iuIH+9JIu_uqpe}hR)d=*_Lo(Hke z`=?`KXtXFg)4*et!QE%p;bn?_h?9e&rRubJW?w!!_*4u;)OcYv_yXpg1hb`^1cM== z3NZ23-?G_tMQSKh=uS_2S6ckR)mEQ!`x2#f zba178A6%_zxedRlOk73{f_OQaZ_C{(zJ%ZZ(K%Y592003bnVOb-*j!pM_M1mJ?Jl6 z9v(bXrgaihWRxreCk{y81^%tVsHAe_FWES4tFL zRk8**AqIrOjuuU6?Hdbj0d3)wNW3VZjb6cA20iegri zL$~-VN^<2Rl^3v=x^jOPl!Rl7=*U=s=I|`iyYY+02SEikhk4oGfYo~QaFYV2k-gdC z1sO{6`2p7&pzAJ9)C%NCJnFT~h|!7MQ)Ks<)S1uecu79O<_g*hmx#uc?9R(7FP>2! zcOGwef<9G?E;sLV=Zkg468^NjF}`O#buPtk8rnWV^5BhBw>1CFFdOt$|5`=GJozfa z<2(ecH_$Fm-o`LN1eUEQPcL5Ae(uvtpVgV-XUbFR}8m={4Z^po`E4W|K2yH5uCFR~o*Ie|_MC~-7yy<>IJwX|4 z);1RVSe`1ym*L62>ubtNR+Q1E<_?lHWBj^{|7`1(7lLR@8Sd_z@_)eHNh}~8Zq84C zM0sU+C#A$oN-hiW_16nZEz1+CWz~?-$9VrIbl-Kr*S}-_sM6SHfNp z^Wk2K%L{7g!%cQ8VkEqUUQx8fhr4Bbb~EDe4_a6AkP~!?6PTbULF^~MgYqFv^Hao9TAPC14^p5%A8iCIgqzAw0($jEf&(zKt5L4 zIYx;0@Zj?p`)`K!1Nfxt55MH*#pI@eU z$vdvPAcwZzFpB#}#2bXCuhG;>JW}_NPE_K-`bT@Pfc@7lQwaawrCG-ST+=RZ?ZzUB z)eE4hA>7lYf)*_dAc$_>IDmc&;bruT`v=gi5bmK5+!#Rb5#wwP?vZCzu}O4JeM=M= z%70SY{7CCUxv|ozIH6w88>kWdwt!YJJ0FfJAh?v?Ev}FujK?YiqbMU(Z zQEmHCdKjM_yvY&0*K@!(z_i|*5m^9C_FlkciZt>rfwv>jd%69!0uyBILTcN{+>m7b zO#-`1bkNA_1x*%wy!PiamRom<+!S-LwE0-hKf`URrJ6}pneqOH^oz*-Vk~WB=;9a= zxSB~18ILnGvql$B=}MuT$Cb{$f)PCdKVL@D1mR=dYzJj>URVEmZ~$H4e1zfjd4MpD zq2}QjlCwo1d;(>K^Qwm3dcga;3mp&VUVeXoW#pYg7~I7!UxHV$YK6Zq(DCvq*+%dv z*8@Y+a5cnC$h52}ZE?*+l-u?p)I5SmyIVC2fD)YqT?g(R-GwCqTf^;#Xxj3TLTy>B z=P~d!lTv}U99}?Yt<%ntp|Vhy!>LYX=*x#ir@?7Wb?QZZD+`6$Mrci`-$1fxO}qe- z?6LS9@~p!9`o9WAk3H@E?;a~Ha|;Iule+0FZK}eXIOW2UudSb4V0Jt;-RSB`!Bx4t z>w)wyE$^bWJY8#fQj`B`dAio}gM}^c^$osPK|-t(j0N~=Ek9#vxlwERfx?z|x3t_^ zw7lmxkSr|^D}bc6{4{w+iIxY8miPESEtk11Ek8w@qIeU>+>KwioX(bOQI1$O-nim! z1(p8YU8G8z!q1B(?&U&Jqjvw$&r=YiZaqostMM9+=RyQ3Sh2(Rr|U_2SB=N$S8cGU z+ey)UVbu9E;NN8YV1lWmlM_tYZJ1!@#vw`*>(5Vr&3|I?4CCQ?Dqo%N^n9~k5WJG+ zNF)qc(o^7`YP;wry{XQJR6gS)Ksy}$9El|1?uf~%1L|51^Xnc5Q9$rh!MrY4M8oUS zvKT&IIlq7^)!>!g+nfT5mroWTq0Mw%*V2$0e5$^6)c~@u$)oN5E+Z>?_9>DY*W_h= zPif)9pG3tIrFldw280O*)$4KtX=+XGt_-YAYisfVpB8AOG?l;#B@MvRQM9=Rq#=O5 z08qOSEgXRG%i;kgs8TGq54X}HKYi3{65?Lev`_p4nvbYa$Qj&MB~iTiF_J!Sfg9}(+>7kGJVS3Rr_1b1k5B#{eOJ-Fi@m^i-QCSsvnrNJZjnVXw(WhEJE@l|${ zJSG0)KSWZ;DUPoC3$I~xuLUAjsYSTesM5$FErag|jS?QBrcxP)@Nu=ZC<6^pXEde81X7apoDa| z*mnu0mf*xp?5l;0bBmytwYf)0luC}e>NHktt-<2w=YvG^VJcgPR}Fvo2H<@KcyNv2 zA|Q7Dl&mIL*5-X*gz$crXf+BZAEwMYyo&EfUr{-%k@i*9e!pLWJ6kbR=61_P@^0fj zBItGaS3EQWZTSi`Wd4l1_-$1~yD3fA~l|;DlpTQ}&AH7ef;k zhDOleb-9ntN!gUqC(Yg_UQ}l&^%}rZT2sYD9^;Zy)DEt0}aiKJQ~}x#FvI|1at1CW9m85h7`VlmZND$$W}W;;nE_enApn zFj8?5=sDy+7h^}m2?jQ%J7w^gC(-w8EtFSLiK z3+YWwSvpe|F7n1@{Ay>(UfV=Cr&$UcCH5>3x_E*CKitH7t zr`o(GnHus$<@7$9-jL5$!uL@~BOYK?VI)>%#>Vm{on9lc_1B13_04vWxR3i&kZ6XV zGpHh@g@^dhwyu35h;kZn_fC}~gftl=pJo$MMT*pH>oO}KO?K54E4!`kg0133rXV4Y zvKpB*%lj{=00+N}h_u}BXW48UC9-8(e>i}(VC9CC*qHay2a#pd;B;d?PB~tcnl<6= zf`5Jtwm#fQ04lUZYP0lnH&Lsws>?Zg^ftQLgolT(6Vd7L9U6#tsB!tXtBo49O%zAC z5QzwJEb^xhG18b_o8p`D5ZwXlhd;yKp->-7)ut6qA)=nT3ShV)8jG1H+B-RIw$i<( zysom=OqEiw^qw|@l2UlR@<%E|AMs6qbOjlt5}0j0O$G7}A}-ruWyN^fmBK4KoGu~o z#&J^|`Q1YKDZHFv@OE@@>BZ#NjE6Qp5R4T@hqX4UuT1HTM8t z$Qe^M4Ecfs_sqaS70gcEMZI#W&9+{JdXbIgLS4^KqGio^#kyg>*iv|0OOyU`b(l4E zGn83VR_1E)C$DHcUR>a2qt@DN5qnq&!@0EZQl+(f$hA37R@z*n&dqsi!^lTMf+dk{ z3#=ILHRojw)kI9XjQP&+IvuoZ7)O0u@RF`oTm&s~xJC1B#Wb^GBh6{S%eZ-?`GpHR zIi}U(Q|VL-7^kjmr{tDA&rru3*pIGBF|Bx2o7KgH!6?p&MzrGo<@R99Mc%bC0LcDy zRXCYK;0K9+ywjcSmcNw_w&F2P^S6t$_ps1lq^M!T$f-4tR{C$Hq}F_ozT2Q6vTFnL z(}htK+=icbzib->;e_iUg-bWrgpc}oq)3dSGyRs&h){?4wh;fXHG6A zs94CEzH2C^9UtasC8KdWPxY$moYi!=9ab*3qFslo(T8?C+U8MF(XLT;6w{vj>GM}z zqFw>vUhX%tH0!2OHtkoxeHc7yU{9j`$m=LaH`3-l zJb-dLa%W|-4202q2RkRF;YJGS#D7!xhAm!q6@>qO}=^6G>F>&W4IzE^3nN)#xgtXoS@ zzvnfShHJGv^Pk5#>nz{DcHz!+synx#?Oi!`s#nm4PN-uwZRmy)lULJI@!xPYg>(lB zn^w{3?g;l?Wp?Pn+v^nbQp)az{5TWZ6Y-l?i2OBmD@681y5%BwP5eFW#UJ@JSS)%9 z=Ge?frtIy0Ex`p}9Sd8&j9&NVHFPH0)Q4B3cB$M^=On(3ByiL%r46ZkrO(-g|34u9 zOKCtKFx9CgqNUNwWcgn}_azk4m*4Q&`fdoAqdeqK4?pc?QfJYx*$zt`B5*FnNEOof zfzs9ITPlK0aE8XWg0t0Kp=8~UuM3`d63lm${Ri{Cd?Vl&GGE3F%I(KZ9 zA^?e77^>T-e^eQ3;kYJenvb}$=iBtbR zs0y#(?G;OLZC58c6+#e#B@#`8x<~s5Kpt%x%HtgDJKg+@gi1hv?0HHX#v{#@hw(=` z{m#kpRCWZfX&+t(v#0b=jVMk%NAO(z`3Zq!`hf>1liE|-4}7M6>V8~0@FOD5v?Jq> zh{*3ANXJBkV>@~wBHRli8nmU&BYB+?IsSl(#kBA(bi50XwsddWI||z=zN2`WK4N$v z%@~F9wc3ap{OQgp{5;S>W$@O<=Gs%MFB7$v)4Et zs#7M#o0G=#FrDxIO9Gn1?(G8FL|MaE&=U4op!N88oxGPqW7*im+$fVf=PQU9gJ&IVVSfl`Ar=f#-X{Q4onep zi$>$^Jws?&Hjh+pU#FYd+}9C>3$gBBTwqwu4F!9clJd9ovZX@XZbZmemjv)6LAiC2CYCMBi zQ!Wgr>>0d$bmQZ4aMWAxgoNJlUeC;7L4mH<$M}S}%{Zi0C~w-+bNbvNbW%GC+#ibvWm=6^uJ)Wk|=LxMJq*@sEoO&If@_Mw#YD0X2Urmc8 zzxpR#ABEER@w-CqTou`2$@kR?kQs@I>&rMG8^UBe^#r$)0>t7|?HJ$gLY&WDf7~Su`7+tw%VY|9fWM0a%f9um>T6SLY@Mvo2eME90)f5X7(SSoIMO)pq@ zN%CLLr+B#E3I|_|0uo;E#&6ed4L&3SPf@or3~eU17ixoNUUPCi^a@gIF}+ z-7nlnm~DOc8TdDAzMrOvVTmBR|MUmivVzZ5u5_j3l~~!NEr#5x|B42zU~$>Gs>;`Bc|hI=c`J5u*GyoQV0 z@849ksx6t<@DxAy&i`3aYY@Qn`J`!VuG7RwGOp$g=!dmDsMr{)fmZ=&J^k2c>4=9MS38p%&ANnfdl+tbi>yqppjLkrgNNs6u`g{Lhyz^j@82&+*ZDJ)Fsn| z13wO|YrJ{mCho2a9y}2>ZhiG1HQq3PQ)8cI^zu*cN>*EVHOC)h8ms^jc53lvl(dC= z8%i94bZqd5(zbxlafJT#7U+uK#hYIstW)l^GAD22={mb%Yvc$XFhMhLd(Y-yjae1M zD4Yt*v>iYdr;jdygTUE8JgcWKQ|jKP5-W|NHR;27cxNjKpS99YBpWD4cjhr31h*d)72 z^y+QYiD7v)NfSLHh=a-42S&HF!E6BINnQ_m<14mM)W%_yy^9a7e03!*aU8o(aAu0% zkUY5wn&sVdq?DM^MonUl0xT&p@vqjgJws8u;k?#lm z1DXLKxI0z|m+bmm(Nz%4+_jzZ_GdhiWwZJIx~R>DT(Rme)Uv&rJ}<+PUvIXtK%hzhn)hXebBy}Y4& zkNV&2P6-39hZ<4Qyml}5&;<|s0rmWHPpfA!x}ebT^2cgRJ=%=YuMR!^ork;46VczA z1S`~`%KLb^mfvT`Sd@!4SHVbVWg3QXf*iuw9ua5u4qT5Fnr^g6M_LD5;DWyt`I?!( zgp30f1>Gm?gr(F?wQ18n?%$yq>{^*7xSBQc5&q6Mfa?TPgj92_dxHg`F9-&c{-R#j zz|H0>|53@3RX|_fyz`}&A*iKdZHm~BVbd52-hSw+p@Fn{Ki}6hDGS1=?q#hxMsOV* zOYrNF*+?{J<5kpCL8Kxs=xeu#5-SCn;HQy<3to_DeBx=DZsO_S0bZ`5z}V6ptqolp zAtvKcY`ZDaQ|$^MZ@Z+m0FVWl{3MwctPqf~qhf(9{JUWejX21;zF~Y3+H%z3M*D_1 zSVLosASrC>T`^HRUWVua0f<; z1*Mo6)cZBHu`cvFG1jwNil@&)M~b%!EDw|GuG0@k_^~pBmWZOhNDes-M$Wt-atI9w zUF`|$=270(@8e>Tr!4YpgJXtJ5abpdGVVmLN%Q|zx_6XU3;k{j#M#^&t?Ag56;0PT zWQ>5J&2wU}6awk57^)BC4Ks7ll14eQC8e0mCK*W}|HREg`50Puj0cu^6$WGb)3b7Z z5pW^G$|i~4fCKfVMWi0%eo9&lIUeUHjR&rY%P1^XnKD3Bbt#SwlWgm?eQWaOwr=;ROu>j*_MHA+D9#RiAtR0UF|YzU@!}T=0zDNVHeEzr1(>Of^s;HPM_jE z0>{o1K+D0+Lr~gdx@HvHCzLf=dBBA;I4zJw=eos|R!YUu(9=9D@HL+4cG{8P=ZzsG zWQuT_f}s|DC-zLGm-tlNmPCDx#XRWIXT!vC8hUnt9=+l$UCZHI$-+}Z=dhQ7{JP8B-JE(3rsR-1Js@94 zpZyP<*Ub>fVN*rQS0NN})!juN?buEx!0Q5sTwgKjeUVo)TwV-BU2whYMIKPPRiuTj zfN5GGrVdT2$J5h`ystxSSzy}cpujX`x`ye_?||uFCn)O@_feiyqYamM69xH!>E4hZ zx&p_Yr~U)SyHkPV*UlUL!|2b;yn4`dkzk>$4Yt#u{)1MFHWpGgyaOuigWIXEV17kK z{jTt%HBM)LW#bh40Lhto>L$G$P^J!YK*eQ=*R`To02#O!HRagBI|Iw?6g8*}4Z6y! zDq+sF=_;S#{sQ}>mh&U6D`{iPLrpt^Q==GLEhY=}3ddGnrT;y)Jk+csH2oUJmfon1 zt!PKmU*|L2r=W664Ie5Nj9%x%+UR|o{Y?#-!T-AkA2s+eh2P`dY(upQa_!BXbNMNq zA>?OFE)(`pm79E*;&zr^-sIsGy`WU29M(GHoyO#v+2F^YWt9a=g>w)!xCJ-U3V6K! z7R&}HC&cb36jAr=r-Qfnyx{iVp=V1S`UaS$MZ{+o;4ig^O97Pm2VbV-SEA6{{5NGm z7(KlWO?X%sIp2W^r)?O8-hsX8uP(s2k6Ex*xA6jk^s8?q(ZsY>=vUvX3tCb1cN%gB z_NJSmwBZi-P>k_(^bSVIBv*32i#c{iQL1;BXL~fNSV-vI))eMuQu02YHQLiW$F4u44>e5^T&t0na&U_F3jn=nOdqa z^w$|B^24uhhF==UAq)maQO-*}?M+iv-d4dR{aodV4r5viH3{=o^zMtF>6i-hPUk#s zEFLscwA8(RR?@u}Fl(s0yl6!pzv@%tM-h)rj@becNUdjUw5~QGsNVU-yx=i*T$S^K zajuVl2p-f3eZFOf*5`5&Ua%U=9WDSBuEtVJiM3H=&@>qhg#x>~2FP7G*}E;A?Js6N zv7+boFqTu-QRAn)jPKKpz}&PBvvanCZ-AUOp|BmpV3yiR$Z(qS6n(wjgVsKUKII=z ze?Em*s%Ll5s`*;#{)~HkubxrrS=WKR<9wn68X9KSGs~T2$DE@{|mrN09^4Vw0bQM z2M@BX``3|@u2;Vy;GQh7K$*ALv9I>lpH{!(WhzzCa-9|Luw;856K^{n{29H8eKyhI zU+uH4^rly@_++I_JZ1dF^OSua)aNzt=G`q8{k3$XDC0WMwEr$N)#|u$W8~(Hn3DtO z)oWgtCrQX2RG=<8@|VDXy>n*<^H8vYU}$q z%q!mVI=Y1F(oCKzcypz_7{G9e61=%w7dTk?fwAsaQ;)e_W`~T?(ybc`4}(uy}t|BR_*Gr&b0g^HyP48KuTn-q`yA$ zE&3}R18LPKUQQo=>js_r#8)akAJf2pu)RIjKA!kzUf-}tyodc^8IAeOJKIybzXjaM z4)oV&Uc(UF4&dr6n;9A2szR~OL$LRk7h)q+-Pj_dKh!b5&T|^OQ_v&ZEyNzpj=JD9 zcC|v)KI6PbSzACJwp4>$A-w?6`rm1g*R=uUBTHzfF1$^6W=DX2lQ$lqx=tDWq5te( zUOSClj(!5*R2K_i=}MAq9WwxfWymb51KWSFqoj2j%C$Q<`a`I1`X{Hca*2-18k}Ug z^bxq7@Y<|_Maah?oRhCUoGT8vhgu&VX_#CTC_Y|fo}mwq(TUg#R^hc3$9O7j9bVZ! zu3rJpo!d|w>u@GgCRvC3EB5i`U#!DN>q^y00)V*r;L=_fB9pSMl;rH#V;M1hI#NSJ zc%|YxB;&+_;HAwNMC!}glx+xSHhU|9x!+GYL)QjHc)DHhAS8+OgIJARSP>-tbCKQ{ z!WStv@kBP^Gn9q~3b74OP@Wd00k+}gm19L|wrzN#A-V|apEbv<+J^VmDOYvWyjb|} zr3{B+i>RGQV%5@u)#{9x$!#grK0K)Sk%O_{U{!Jkb+-?%=W!ofctTgmyDRPw$hIC< z7r_6{Izz@^5RzRFhu%zl-u>)t=%P`vij5Ms4txoSnkUI-LFheOvPrS$d7CJB2TCS#&AB$Y;M3 zfH||P5UvyGnNxUGo3|;#W-_HEg*b}r?jELK^+&&++v;>+)! zx=p$ zRSjYu$`Rax6~~Gx({JhcLSvZ|RWHg?Oh4_05WU9IvZAb>&+(=Ll^mEQr!d&q3Y0!t zqvvE_jMX++@u)WioKld8j`Tayu z>_3DEr9e}=f~8vg85-)&0$qF>foQRO-q2HI*j)RV*1NMI#*qm)ZtuaEG3&@x>gd64 z`Lx+8q6Mu1JGFtbPR3d3vdlYx5}s_7vh@$Wb#`8Ckm4mDO4C{|R$MuMReUK=Z@pM= zCBpi!usCaKvh@ZV4-BKX#hI_`QZPaG+hu!SAcml)gh)hU|$TC zA~5M9IG^}AhU)iq40~Sc7{0qAFho*kA68Gvtwo!BSTAL8Ei(JEPC?Tjz=%E?gPx8N zY6P?vXCgz=W4-GM9*LNDPi?(MYkk>O(~tLXtoh-OG|i7CIaCo3EoVy~#D{wNF&~qg zc$Ef+qy(#Ny6X$!1dOKEC0Nq%>3EPaX4(0kh`y(kpx2uw>eah2^xrJ>Khvg)26Wq} z>)y#3*(Y@GMDHKs)Xk0rYuk|$L@2X|=+d>UOOfJ@OdDB`Li|~%;VCusXC?7(fIstB zd~<1zKMb+o1KR7)Mk*0Kc6bzf2gNRT}nRzF{NocrV+{8*Ou{2s_s|Uf8+f zCTA>YXfLkQcfrip=fVMDWA$1^FB1Z>uG=r6rNOLS*^2Ive!rm~NjJ~?UKl58&iB5{ zU#GBAta9;2; ze|V^~@aQp#m0p!){f!fD2GchY%(tM{bKO-7u-Y1ooBd1C{4nNcj9+^d2eeq2vhj!x z;#iI?HWoTyrGu}zO2^BwAB`{IQMC^TWn))gr9t7WiE{do4)8Rbr5g8Lmv#6Xhv2eb z0C>@Y2sSUgpuO1ihCQ$J{TGf{D5qrQM1#3&{oEh%ElB%HGO-1p*cVCPnr{P zj>>VC=oBYj%agun&xNy;!O@;Gf`}p=X%mNHT+@ZNcApq$8!9RLM7@#JPi1`!f6zS@ z-TyijiDJK3OeuwWkua~2z876h8otqHvDJ>2ZNG^Sh|+Sn!LeMt%iq^B)+g_1Hm6j= z&*Jp-XqgrmJ;6tsEcM46vC_CxsxbV{138ov%_@Y5w=rk>nRcL5fn25hIb>tKE3w<0 zdJhjNqrJ2ag>>uCEdtH_q+4G)Nu4XOa#&}U=H8O zlw^-ADM@NliB(f?XwUEQ z82x{?2C>hORA>_{dM!~^*+h>P-r{JL)jyDPLY%)0o==ymvWUW0TgtXP%qEv=aL)#A z)k#mT#%#^Y)V$euN(+d-fZ=}xH{`h9D#xufwHg~^y88lpvZOir#KH8BDg_SfrXK<9 zg164vx_(MUWCnN8(shhwIOQcy2SPfCY60931?) z0^U2ITg6UibPUd$^~PA@;prUTBw5lytW+L2d|q5QrB%Xz>-moL_-Q@g5rm)6SHCyW z5RUJwRmj`(eMM1luLxN=ETWP`3S(HgAtsj_wOn# zAx}ZZu-+$x(hhy5)xdjU50Fgf87R3FASl7jsx_WH(R%EqXEhlⓈ&**i2J__du7` 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

G0y0WfRz`5}SFq_iDox-#9&P|exG&xi( zz?;OA*DeujNE$)icZtWgodGuFKDFH~Vx9apG9t+KI1Co*7C{?!i?(jR?{+8_`SE_e zy&S#T%l5~;=H!tr${3O>P|a-7&op|~Va!dJvF{`0dvDs9jj0EjMzX~y+av(5g567d z0KEKq30yaok#hs4vIp(n1Ls1@5Q_grd>7;l2QQ}=#JxgCq~r3p!(j1}Wz6EkoaFPV zAg5nN6GNXA%J>b7=E1*;$JT=~y(#%O1SBdA=C4hxUoY{_y7ZfHva)T9=I7kzd9MO_ zH^qm zkvEOqCqhkan=z{B_Z$toMz`)0wG6ra>G3}C!nQTQEWW`so2kSBp3henBD`#4o$%HN z;KOKFfrcCq4aSKk3~et6pRi97{tm}$wDSvLg|RRAtyTdAWX205-))FZzq0&I{>527 zqR)%~DYX=P3TeJR&;IZS}BKsN-w{ho=Ga#*dw9=aar;z5lMiH-sO z@&{M~iTA+rKeP-uB;^i`hnQ{8Z}g@;hs2cPR~H@rNV!)NJ)AbPOJ?*!z(;PHyJhIh z!@|2m%?0xP*$922SuUH!#(Msn?!I`K{+X-db=_9@HlRx7u2-D?KIr)Aw#^I_DY$L3 z(ViT-epqx4X>MkRRNX5@iR$wm6IC!~>rwY3qQ0v)e|4Iig_x~A>94Ct+m48su=xBN z?MGiO3Tf@P5>jj$GOi=ugL^lQipsuy)kVOD|N02wO_Ex0kL({sWfj&$QARg?O!_3yo4yj0obt3LiT=e#Iue@cHpjQ3y8 zi@JMW&LoqQASvv#aE<&f_MQLD<~8HHIfN`iCWdhtJ5 z5p?VmD<*Etp=B3D1^eOC7(@4gz5FTnf+*`4r@uGuB?mR-oEHIgee`c``ZxW?*H7H& znDhT}WB-O6>U2@G2>7bHMZDnA@AWYd={cXWd=Ov%A}7ZUO|i*KSRczg+32OSWx`_28ThJ#XLGtwid& zoR9Z!LaEV~Yoc_if=a)Y7SE`}PL_D9!*}Etihwt;r$tA0o>B>Ui1Kxvn~QX#5|--u`F( z<4^d=L*DlN_j-LW#;)TUFlOzCkK}ZsvM=4dj;(di{t%_?>*{r?p-#!`=w2uN-45?H z`TfsvvY~5T{K>gZBX_scmTnlS?bd(UieKimZ{+6Z=?y_};-4{`NAhsSo)_@(U#;8f z9Qx(DsA{k3Rhpp6yX(+VLHfHd-eqI2zmbhS>#R3MwQfKVj_Dr{;3K!wz=u^42h{$j zouR8BZ4(agz22SobC=+*E0)5%3ZJxmiL8@1L~X0iYxi1u4$`WHjOBLS13T$cFrSp* z{@=@g5x}el!tw){{M)Ah<_a{3f+Kl%4+5AGXc+;_ML2JymZ6EaIDV zK+m1sLZ6}6coLu##1aDv9Bg{HW_KWBiFdIF?&C!I^)7bvT#qe;@0{Iy>j1n+Oe~V- zq40;hBFTTMjNP$`vIot9YZ)?bIWj#E;|-A&X!ZkyH%A83<_E&7#JmY+4muyt$~yBv zL|d6xk70<-3PD^j{&R>;wo&azBFeBih(W2;UE>$H7?WmGw-6I{F_)>7;NaP!$j-Jgrt zvRlhoCR;?X8NAgR=}z`;%tIaSk-wZ%W-lT&%T$yDxxxy%deD zrs_?Ud+R`(>{Lr1axAvtG8{bA+HWe_(3D|PNO*UZkBjU*>yOB zD`Ah$$sbVjP(wTZie6Vy%DV)=MUlvdSo`#MAhGl*0#au)QInB z)?3jgn9DBs(ZVLF%vnkA8;Dx^L4dMaTL-dxhuG}b{E-*c94vcWlGlM@NJLb-p@}-Z z6M2RlH|mfl&KRGM1x$4fRe3Llxw!Y|O1QJPM+G~+oMd$g+WB4_vySWRO;bOJ9`>!0 z(RjK^H1MZaA298f)8GB^9`LVl^F94LCcS(cb`j4(m}<~Z|7s_vQo_GNE9t>uz|*W= zS5ovxF~jjmA4zjuny*2dWJ^~+is8-&9rA^Gk9jThGfnsy%ga&fhoWVUp_hj(d%{6RKqP3!729Ox$-b+4^6V3?LMjCkh{ zUvPCqA2{GR=VLaVv{gIG5(!JGl2L8w9WP6m^oV25zuA_EW3$%YG~KB7HLS9umqsROP_1R2dY#;4L2lrrOqYP0H+41kZL=$=5DNVl zd^Xg74>DzyEvbHCRjF1dz|ljEy4KS}jT0y9p~eWwFpFM2F^{%5sNdj_hMdP1z$^eA z;WXZ)Mg%+X$*Du^ANkA-dDT%8!-0w!h%!9?Jp^8ZW6{orJsru)5uC~lD1>J7xfJ23 zrnqFn70+tD7?T3;z{7d8)lscuaB4+Q9o40Vl2(-Nq;@le7Nh4*YDa@8M)A(7Z%C{5 zXw7Ld?~&(u+0xy=z-3;zyC2V{InJuLM@t(_Kn~O8q_E0|Tf(G}*N*l%s~rrt{wBXt z>UP5eKRQ=ReQ#SFvbi>cF1V<%PRrUbQI^P96(0`@AYHj)v*A>%5HB z!JaL^%fJ=$Rpr8`49$~nmR76y{@7AtEIs%D=kqk%;)WCx5R>pw+Z&2kpy?iJlh_t< zhYQ){R?UEKx_h04mZcHT(VuMc+kx`J3Xcqo@!&K3oZC7YYYTq`aPysp6bw`4>&wo>VE*#mqjJt&OIuiv^cHyQltDX zHD@@cxU^0eHBE&B9ox~cZ3Q#Lj{&BI-f9yGv?@DBSkwy`m@Ml_p#MDNj`gAm-fC0t zSMd@awtS#>`@nO~>Fv|q5Brg`>3mf@__0|b})PfHBaT*66%}>bizj+ zgxkkN80PJ7N?T_YDJgHaSYF`d0MB_(C=3@ z_j?rQuU4^cS=XDs@mDJuoSkW-zv^dgg%2nF)dRNw0N7s>3xHKo{%FP^5TR1{YFf*? zObBn1x>(zr&rI&sKH^#yu=jq_xsM-r@nTSWq-9GFHFUx)Ji-^vKEMkag#@ZG)|(wF z(4auo?EBnQq1eN(E%(LXw9J*G|DGLgM&!n>WChw3sCv5p!X=vEr)kHA-5OpUKmBB? zK-U66zz95)Dyt?MU&mpfxJ;n_W!2t|wI+g5>b$kw^HlcJ($*3R2^0ZUzv}PnG&y3ubuwAs27`5$<~DeF1ET9q9%~`pTLd zr`U_*+IPv?td=(nX+RatD(A%=DuoiM9YZBalA{)RdPt0Cq((aZ;At=%IJ`NASR^06S9tej0RkD_{Est@fA zR!bT-L1u$huL`A`ftR^McoxFtp-}5GYus;*0Zh+c!nP!i)KiG3oXhrn|!_~6JP5y;aXT< zfEmLuF-{_^spTUPY{=3mrMz0f@WpLfR$e`8*l~}Bgs5K|;_lJo5Y@j@#(UoIj0DTr z3y1Ab0KytE2e&NpridG0$Jmju^LWpNHaU>$gsKaT6{A7>y@7NwRIO#dzCL4Urv+al zuL^1v!^PVaUqPK=%ZZM^A4z{yQ0tmkL>1+675rRy3Tr%^d0g4xbe9H%sb$6uy~V>_ z2JV|a0>=UeNRHjMws6duA?hdOogtz3Z{~f(&ic`oNCSVudg}gBe1#a?4|&7$=V{I7 zdN$7R<3Bzw<|zLjhP0WprL_H$1Zi7T84abn$*|4iKe7RI+EHA`JmJ6_BL#MGaWkyj zlU1#vTGPs~;WiBjSH}k3hZdMMT-Q#;*gYq=P-fR*lI5beGSAcg2(`Y`?wb4wQxEUGXnvlYBh^VkcTxLpO3~UbvM30(*Vdk+9g%9N_q7^a z8{54)Am{yvmlQ;jgh zU82V|RS(0P5VEbMMg|?sWwE@8(U&csAR@Q4&3MevlwYL;)}lt)4c)D^{l=> zWpJoTFBu%N&e@Pn-<}fPO?eFpqC*KA=t&*5tKsSTtQK|EJywlUB4H}8Phvf!UxI|J ze~CzhFVo7;3q!lZWikaj9v#q4?1|;PXgBjA+KC zo!*ST0nPngR|neDNcHi(Q;q?^`GmCZ783g~AYbjv1N5?y8WXwdJa78NB#C`1vhm3e zEu{66b>-GbZv6gE*e=?I{nV$i+R#vKHRWDYOVi%Q>T&DQN3!*U-@Pk^U`y`ZW?8$U z)hbqop~vWPj5@!38!)bBYd}YEV;Zhexuy=!3eF3PfJ?ud9nyNdk_Z*aXxY6Ot zA+FXMLYO0)so&K&SSf#td$!Qe(CkGmUeArk_$io8{$0r-a_srUK+$r?QhcoXwQ1Z)^4S=hkIyfoEjdqbj2r- z+y}BA3^)_*v8 z(+fpiW_t|U=YBgHt*T`yOQ^9fdwdxXd?)?yu`57}-%X`dwTJCd6ttEFyLjIAL784S z_-!jQS0?KF_24pouBv_PQBtDj)0V+v^FzE^F~Wtb@a`PG4SVWNw#Qr%%y%$(16O>5 z`S^yr5f|6G{~ur10bf({{pG&Ym)?7%ybvKxPqZM2xbuXtO0?Bh3$dcFwuut)2#bU0 zt9Pq}#1fsgRyT8BBN8X)w=FFKhXU?2CGxNsAs{)-%l<@$r zUiLIUiJFt!3s~kzonhleP4#k^Un?&T61RH`rS=vCLoOG`{H5_dt!!zgUT&|w_KXw! zl(IdEp6cbv()1%_lZd9yZ!M=ue;($6gj#((I3Nt;bWT>~%`OfG&ku4N-48tK(Kqk; zB>NVUmfN*6-zqioC@WE(8G6jv*5tN4eunO<;EN3LrWEh5RNfcB*$Ozfk;9x@xqpfC zPD*bh57rb~V)58UuB;2N0VEvVDdLFF&`lFd7Fh53ufc3cnAl^A+Em-c^knseCFH+3 zz7maVE7vhU0x}&*q}J`^04i)N>)iIaqAvT4?dT)S%jeOX*OZn!$TdlBt{H0KMctC* zux7i1xc4d;w$#a0<*M$7)U_e6UNLAnO0H8LscXY8P}0`0p|eS{yJ@Yca`@O$#ddP2 z`C%Xxf$K}!$<0D5y9j)yl*ec1c1~-!Ew!?Il!64%%F*15_P3LJX}n(^CtZ8FOVB|8 zdCPzUpsqT#58g&E+RIHu>E{0`JxpX3rLDG6 z`>*6k=h{5VJ|hHZByjHvWzAMv@Rh6&DnR{nkZvL9XvLLPQzYNRQ#9 zr>>DKQf;Yw2YFV|0RWob>PtYm4rPGY7IN%}G1E;%0T4&y{N~cp(oyoFksYDz><6G# z310#_XD*AQ^rj=!l^hXeR9EZ)NL5#M_}frSC%L_K0~4uN6m=L}Q}6$0&mRpgWk#behKqnToq^sypy$!@OZ1xAm9?{QBc*qi8#=$Y zMU;KUIKdKJADh0BE_RmnnhhnM6r3yvYyNzEoLI8l)z-q>rUJi~xq_lN@1)#h`K!bO zA3e()zeAAx86PV{JCx^PjU-y~&z=8lNz3|Zi3RatC2b6$VO`LOJTzim^Di55$-1l& z1J~1EUF3#N(?t}X&OrmX{^7lzns$|&>2_A&RoZU8{huSbXJ=HYt{bhs-j z-HS>)Hv6*D$=b3?z1LCGZeaBo5oOe3e_Ko0-DLk7HkmG7|XDdq}rar~S_4Di^T+xQJFPBzRW)FFbO`Z$9=|!IvSEi<4%iDaT zia&MP&3B$y$-FIf)Suag9D2%qyjrZ|IOAoQ_mJpoh2qFBZBAXAPpM5^D^g;%hdoq( z(0NKeIrjJVq8H;VU335HDIdnB?MB+uTkaI<{Pt5l2mb!7o>YD5sxYcRIXs2x^^s>q ze#@Ot48DiI!wWUX+&Ka`)O=3yUd8K&%idkZq4e{hVzw%u&RweFI{$nFEj2n6Wlk0Q z%4V89-{;dd|Jr_(eJb3H68g$3q{eILX=P~jg*X&jFOx9^(C|Za&xKGT1xE?qf?0bThR>E5DUjiNA94LyB>z=Kyh2a zQ7lmGR?xQo*h+Xlo}TxI*>%NAG7ON{YaSjtlp8%z4mYuw=LA*Op$-imB)1JJF7Ae& zbHJP+XP)84kZeFK^4Dk8uY@>g>SGtu{XudUi=Q1)s%~v+o+5{N#EVkczr}>a^W!u? zO$X(|0?JB}t62bI4BgJhTq$NQ1>*ssrQ(fXzQdS(|`cy#i zclI3d-}pX%NUevAJ4UfihC;ZjNwUWQ3^bvBr#dZ(Kf+qoVeuO+k zlY<9jx935Z>NZmT1}9XHjg$vS;R~qxD7l_j-dyAOF_`HLT;SnCD=?B$r!q|)CD$~m zO#4R3%;K+XSW=#4lf!5^+HP1xXoV&vI&M)8$*DpeM$5h0EUE$_i6@S+bAjlc2tI18 zexJzUNf{sqfBO1~eMTYRBTqKZoIb7FP>+)(1F4%`1f4( zI|u0*W90Y=3lY~)ja!XxF>oG*sS$H|Vu1QR4TVwpa2r&-m;=fOHuz5Ec|KqbhVR}2 z0FZd9hTHKpu@7Mgi|5~$)Oa5wEJxWeAuJLJ!n7+^a)45i=iH>`bmrg7)o%;_Jy-oM zUV!gu>i2X0{hj)KAK#pcDQfT{Px@N@R*aQ;po$v+g`ZsusstG8ZlGpbCCZ}(VPycQ zXsldk0tckbD*L&QZT5eB%jB zgBp58NSUO5EBt%7`hBA@5A;_9XZd$m_4^3E`G9-G)G!=~z&8AwyKCQ7bOwwZL)a3k zLifItNy6{gadM^Tu)ud0J$I*_i9!*sni z3(UMSi@J=LPns`)1WnS>%WT=18cvXXJimSfv6!7^9gk=KE>Gby(HgSv1Qx5%YU69y9HSDig3>ajK2^yGu{Om4@FNz1SX7}K+;TDy@xjfzUDN@Bhxq5EXNpeFI%lsS1OO)M5j#B3Lax?AVLU<|~Y`@9#qpRP` zfiX?gaJ@WLnTqE~0GUJ;nI;-2Q}`5Px-LG-_Uj*;P|b8X!lW1VPM6dCR=qYZ*m5dz za_e$%0qh-I0DBd8T>RdR{!W)GJ9S4MW%T^)C-~mlVuAE zpDagsb-T}J7Hseg`Uk2y-1$@og%8+n8#!5iU@<$0n`L}?F&7#+MQ-o){H`d0qZ{uP zr5AkiaBc&KHnu&priWAHikd6ykCNq7d4*=!)#J2js@%l4_N7nS%)JYrX){0ICDv)O zzw|hR!lua;>%7>1RP++ZoErnO`LDrt`b+DwbB%ofp|MaCOI0uE?dj9xhMHtlcx0M9 z$lQRY!fsnTQ|{;*b{pv0XZ!_wbL*^XmAU4HYfpd7l#@iZ?>$wDRGco?@acbxH_aX! zFK>l&`q)x(yu0X0gQv^in$G~_1s-KYw5KIAWJ~hLEa^4!rl1QJJ=kF?8Y31xSbQv; zZ$sU(PgG-uc4tk3tT-^$d6#`r3{HRh~mz_b^8RR|YnJC-RwG3Bl>NQiY;T3#c zlv14?7Gg?Qk9jG>Nr~-qnUFWxAV-FzmjT8TV7CblSD8*@JAM&IROCTNIEtWleH=N=va7f6KFR05xn5`jS zL8*RMttos7{6gJOpv@AwyZLB9IblY-mjKFug91uy`|-a3fPKbfFik?1jk99kkGD^? zm82pPLiol~v1|#8!?GpvHkX)YC)Fq~L_sKfBT_xdGjt#(fRh|C#IK^kpKJ=~>=v%s)*_!G zM+Aja*A;SC30Ft#TY*+xL66>EA-iiT-7lbbE97a~{CpwIcP{dytd(*_?Ho0ng>cl^ z#xDK--U9LM1~%d?o+GTE2NM*oW#nM z+73l*=zvU>M!PpYz7_S3%JBS`a%{HV=p*-d*%4gZGlP=ssk zQo~z_&wHYA8M=w0IVuMvZDmIf!Z%F zz(U5KlLzDFoKn3fA1Y!uu`)iD@0afUx0e1imR_!v7dk~1@X_ECpJj6kw{9F$q;9l$ zog7&$^6N4n!T3}M+1Mrj0qJ2Qdb>{kTGA|`~;5_Bv^CNH|&&%Z` z$LiYl?vyTY!)(tfECf}2rrB?ZQi-hWsFPn(w4H{eNUjvO9W%}j-ZE^3iwQC31dbbH z_b{^y?b-5Jp>D3Ooq3MR2`6YCAzqtz~?380WEn4?U3v0giGcD}R$AcxpI9Yb^#^77? zptT@!aTH(s;(P!fsX}lW%+}(ug{Z>45VGimr#M+G8yp86*iq8VzC%eLIjd%HBvNS7 zE_sN}s9&us?B%MhvT`r|vrBGgQ|lsP__$Y^?4>Td5mR`fH0ItO+Q(zMo+>T%{T}kk zh2qr_0{?Ll&CQkTI~Q%^{l%YCxQtzat1$NH>3*)f%&G&Q01hjEJ*KQZuuPbVe0T!# zyBCVGkkQdSa+ToU+JFUH;t$3QY-ECu5GuDmS58Hc^IrLu=3HCj`oSVk_BJ_3L3voO zpZgvL#A*tCnyn!+1uhnTWlD1{JjiB0Hy7d116pHrUrGk99lHZf)&mc}-0?bCasnDKpP@&am186hv zl|l2T2K(howhK!@!gkjMw0kNv^Ut9zTMTG(TvcdRMre#5!(Df`3|au`4xpX8KLXm& zYs3zKUO{y~!)jj+;B0kK;Z$0$Vl|*O;2gbE4vs|u;9S6U1j@{-6j=Z`v2{L!b8Qje z{OYX2!O;Oh_o+BTtK7R?4$fo1v3>Cm;B34iTK7P0UDw*5LHm0lpgnR@q4iixT@T9M z)~m!(+E^I9Z>bQs9h95eT5(`UE(>4}RbV4(eFn^)1CxxvMz2v(`}Ij+E$U0XK>DL{U1@|9O*<+#wAwuyk=t+Pm5}59s;>0=QB3>K z9LeFBoMhq2(_C)SfMar1>G&F=WAZ+qmXYOAly!rYD>f>E`V}gIbGY}|)2kf8#0kms zg?iI&xVmhQg@EO8mh!YPNhIc@3*FrzsLhkyy^Zg@;vJ!L;X~lReXig zPswpkuNGq(!1YdIf#GAKOpc*zr{o&-B9T!Ucm+L|d0jZqeOnTL@S$n^@wgiNI!=gR z1236ogWEA`C{m2jr-133eb&_CS2@79<{N$vHAAQH7QhNViucV#1eELRkJIE|U7 z8i4)=vzSz|fYJD10W))3UdbNOXxxx+w|<$zdQiE@147BhO71uUC|N-*xz`&d+o5DO ztyt&gLT3`In9+e7GVa%##!rF|^yY3Rxca-XgE=icEr09l)2OWHoBITmE_k>JTbX~3 zLVlA&F;gY|CU@|xKClavD5q)dbV;c2_o@L#k^hDc|0c(H93LRw!tp>nUw5Qpn#6Hg zt2g9&My^-$$xOld4^sZExX(WZFR&O?7;k_^U&ix`cG2cati2RuLxpGL4w?-f!j|ny z+nhU^QGtuEHFZ8KkCkHU)0MOG66tY68gUK|-FEJD_ME(3Q+((MWt^8Qcbc6gs-8YT ztvZpfNILTVn8@qI@DPn1sOIWz%+-VE>W6lI$FB>hW5h18)R2aya{t+J%f z7v#oLV^>~pRXTA&USyw_&DjM8Idqe<8FwFEl(#wNFZ)uZseVcBtueRy&d*=)jHb9*^wDEAi7zRR#-7))#^ z`ih+Bn6%`}Di&PAWpo&B@cysFVUpTsLD5D9Ub3$BMr|snz7u<}Fj-mzEC3uZ=d$J%MxDatpWV2HplAmgNIy%ia#64Rxwgi$XbB6Y#;BRu{@~F2n3lA1*vR z^<+oMu?i-Sj>1Qj4)$siNntnSu0GYnp}}nq!!Q5=f)P;HyWaTvViY+@wl;kH6xg)V z3XoAJm4j1h$xS&ts!K%KI5OvnXs${vIIZxmI(KkqNs%r0ycNN~L-fy0`S653<3DN9 zj^jSlq7Pj>2;wP)8xDYY-{HcA=;Acfr~+L72q#{Mk$(2V1e24E<)}! zW1TC_g{uTKP4D7Elye6@ImH%VjCU<9wQ{p2=ezRv6TX2LffAT2W$$@bg{Eaq#mUr!}kX?(#zP$9%W-=#!8HhinU{+$gWll&ZnGhs@1r@ zJ4BD~$vrjMX8+Y%EseV`kD74YCZIw-E;EB8gOWUn3kWWoG7m?cjN-C?9g>wFf9K4t zMQ|a4fY5M4L=?@6$ywOUpvh+^n(%-wGbCj^(2mA`+VBj||qYvs}>A$@|1;o-6jd&^~LQwHEik?zDP zP%ixgdRHxzgcV>_NjH%k@mkBCv5cU3ellY*7@OSE5vE z%uzF|hy=83+8dnn7{(`EgPDyQH5^f@giJQ8}a&_zNJJC%Ux}|6%r7m=Jp@YxlDHg98kc`|( z`sZ>>H{EE=Oq{y*8TYUe4bKp3WxE?~elCZY9=`zBz#&ayz2{GiHKTXW;TxXgLryQ` zP}dwZ0Tev}*@UJz{RW6B>!{5O*)^osk6Z$AVP=$Xt~;jkm_#ApECt@V3%tGTp87$x4P z%{$G!EtaB?vT)P9=PZI;USYA7IF|IU!~3 zcftZGx|+kt)L%~L*8tf~9oI1(E8E#>?zdzq}oF>tvyJ^5R<*ERk|U>wt2 z#rTUFvwy}2^A|N*Ju>hb7wb}K%Ud~kLSbJ~@M5$7Y^oo`u+caUy{mjv(*+n@H)BMc zyR(Bf@+=^3u|h@MI0fFB&e=^&up&mCS-FZ^A)fBMkps-~Qo%a3{BPM+YK*7a-oa4N z@U0x7JJUxXcOvdTTLnWYRBX{IY2*w}d3W0XR(9>%UoFT1 zljDs4?2PLMv}xY5&pM-dy66laYX465Gm9TmhCg;afqxgNzB4_2Cr|ctb2CbX%qwx3 zmmBZ(M5~q8k08iyzQlrR<9j&q`#aIo_wq!GSrK4)?K(;;mZNocDSSAIQ)j|k*I?EF z$;NXcJ@^RPyo$~h!#k**3%w}D;k{ASP<+^8YW0uorMdE#aahItst&8DL1I{4;+f9= zh+!2*h5yLSW4yl>G3-?p|CF4^QTm*pfS$$G@WrAB{nOW`q5{S96GY`SMCSQ33<#BFMs13($LD zfwPAK2cVV?EEBg}Ph3D2HpzVJ`D5F;P)B)H<&}YfyRq^G_N0666Kvc5K?l z<5ziiT&3`fZv=(shJeDemVv_8G&w(8(U zgpYmbfW*A5R#p=B*qkMzn;bOE!>S#ka2HF;GK$i$fWS*uWs}YAC!aub>DmKrR1y|b znuh637Smx38{p77n6pml4V{gbQ3F#JC9&R=YRX)k-s*U&xGzC4mXbsBO<4_dTdbI# z|3GI;~JBrpA*p?Mw5+cn2aN|B;V*G}eN7Yt|?#LusuJ zs-&*)HT{eP>s0`x?wc$Cv71qdC3Dq0SZ__SmS|kd%AYlEIpQZ#ebGG()$F9Lfbk(h}|--<

fMIk($>Y5uG=tsI$_1? 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

@P3)7tEgZgU} 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

H8!*lD>6 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