@roomle/web-sdk 2.61.0 → 2.62.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{TextGeometry-8e948315.js → TextGeometry-d25f1fa4.js} +2 -2
- package/lib/{TextGeometry-8e948315.js.map → TextGeometry-d25f1fa4.js.map} +1 -1
- package/lib/{TextGeometry-38a655fa.nomodule.js → TextGeometry-f2fc57a2.nomodule.js} +2 -2
- package/lib/{TextGeometry-38a655fa.nomodule.js.map → TextGeometry-f2fc57a2.nomodule.js.map} +1 -1
- package/lib/{banana-for-scale-158bf377.js → banana-for-scale-78324f69.js} +2 -2
- package/lib/{banana-for-scale-158bf377.js.map → banana-for-scale-78324f69.js.map} +1 -1
- package/lib/{banana-for-scale-1b93209d.nomodule.js → banana-for-scale-fbad8dbd.nomodule.js} +2 -2
- package/lib/{banana-for-scale-1b93209d.nomodule.js.map → banana-for-scale-fbad8dbd.nomodule.js.map} +1 -1
- package/lib/{budgeteer-measure-05337a81.js → budgeteer-measure-f229f761.js} +2 -2
- package/lib/{budgeteer-measure-05337a81.js.map → budgeteer-measure-f229f761.js.map} +1 -1
- package/lib/budgeteer-measure.nomodule.js +1 -1
- package/lib/{component-dimensioning-0ec0b7b2.nomodule.js → component-dimensioning-e5453bff.nomodule.js} +2 -2
- package/lib/component-dimensioning-e5453bff.nomodule.js.map +1 -0
- package/lib/{component-dimensioning-c1f91180.js → component-dimensioning-f0cf518d.js} +2 -2
- package/lib/component-dimensioning-f0cf518d.js.map +1 -0
- package/lib/{component-raycast-helper-833f8a52.nomodule.js → component-raycast-helper-73f1aca9.nomodule.js} +2 -2
- package/lib/component-raycast-helper-73f1aca9.nomodule.js.map +1 -0
- package/lib/{component-raycast-helper-1cb2afdd.js → component-raycast-helper-9255805e.js} +2 -2
- package/lib/component-raycast-helper-9255805e.js.map +1 -0
- package/lib/{configurator-be50c3fe.js → configurator-a44cea77.js} +2 -2
- package/lib/configurator-a44cea77.js.map +1 -0
- package/lib/{configurator-05086741.nomodule.js → configurator-b475fb50.nomodule.js} +2 -2
- package/lib/configurator-b475fb50.nomodule.js.map +1 -0
- package/lib/configurator-main-dc2a5801.js +2 -0
- package/lib/configurator-main-dc2a5801.js.map +1 -0
- package/lib/configurator-main.nomodule.js +1 -1
- package/lib/{continuous-drawing-helper-ab2aa242.nomodule.js → continuous-drawing-helper-335923cb.nomodule.js} +2 -2
- package/lib/continuous-drawing-helper-335923cb.nomodule.js.map +1 -0
- package/lib/{continuous-drawing-helper-771ee2d1.js → continuous-drawing-helper-ee575a14.js} +2 -2
- package/lib/continuous-drawing-helper-ee575a14.js.map +1 -0
- package/lib/{default-light-setting-97e2aec6.js → default-light-setting-5c69a7cc.js} +2 -2
- package/lib/default-light-setting-5c69a7cc.js.map +1 -0
- package/lib/{default-light-setting-99a7eab4.nomodule.js → default-light-setting-e93b3006.nomodule.js} +2 -2
- package/lib/default-light-setting-e93b3006.nomodule.js.map +1 -0
- package/lib/definitions/common-core/__tests__/image-renderer.d.ts +0 -1
- package/lib/definitions/common-core/src/environment/dynamic-environment-setting-loader.d.ts +2 -2
- package/lib/definitions/common-core/src/main.d.ts +19 -0
- package/lib/definitions/common-core/src/utils/common-utils.d.ts +16 -5
- package/lib/definitions/common-core/src/utils/init-data.d.ts +4 -1
- package/lib/definitions/common-core/src/utils/material-creator.d.ts +0 -3
- package/lib/definitions/common-core/src/utils/shims.d.ts +14 -0
- package/lib/definitions/common-core/src/utils/threejs-utils.d.ts +2 -2
- package/lib/definitions/common-core/src/view-model/plan-element-view-model.d.ts +0 -2
- package/lib/definitions/common-core/src/webgl/image-renderer.d.ts +1 -2
- package/lib/definitions/common-core/src/webgl/renderer/baked-ground-contact-shadow.d.ts +17 -18
- package/lib/definitions/common-core/src/webgl/renderer/effect-pass.d.ts +20 -20
- package/lib/definitions/common-core/src/webgl/renderer/environment-definition.d.ts +23 -0
- package/lib/definitions/common-core/src/webgl/renderer/gbuffer-render-target.d.ts +13 -11
- package/lib/definitions/common-core/src/webgl/renderer/ground-reflection-pass.d.ts +10 -10
- package/lib/definitions/common-core/src/webgl/renderer/light-source-detection-debug.d.ts +15 -0
- package/lib/definitions/common-core/src/webgl/renderer/light-source-detection.d.ts +21 -20
- package/lib/definitions/common-core/src/webgl/renderer/outline-pass.d.ts +8 -8
- package/lib/definitions/common-core/src/webgl/renderer/outline-renderer.d.ts +5 -5
- package/lib/definitions/common-core/src/webgl/renderer/pmrem-environment.d.ts +8 -0
- package/lib/definitions/common-core/src/webgl/renderer/render-cache.d.ts +44 -0
- package/lib/definitions/common-core/src/webgl/renderer/render-utility.d.ts +17 -27
- package/lib/definitions/common-core/src/webgl/renderer/scene-renderer-debug.d.ts +12 -11
- package/lib/definitions/common-core/src/webgl/renderer/scene-renderer-gui.d.ts +10 -10
- package/lib/definitions/common-core/src/webgl/renderer/scene-renderer.d.ts +29 -31
- package/lib/definitions/common-core/src/webgl/renderer/screen-space-shadow-map.d.ts +62 -50
- package/lib/definitions/common-core/src/webgl/renderer/shader-utility.d.ts +2 -2
- package/lib/definitions/common-core/src/webgl/renderer/shadow-and-ao-pass.d.ts +26 -28
- package/lib/definitions/common-core/src/webgl/roomle-webgl-renderer.d.ts +3 -2
- package/lib/definitions/common-core/src/webgl/scene-manager.d.ts +1 -0
- package/lib/definitions/configurator-core/src/roomle-configurator.d.ts +6 -0
- package/lib/definitions/configurator-core/src/webgl/environment/floor-environment.d.ts +1 -1
- package/lib/definitions/glb-viewer-core/src/roomle-glb-viewer.d.ts +6 -0
- package/lib/definitions/material-viewer/src/roomle-material-viewer.d.ts +6 -0
- package/lib/definitions/planner-core/mock/planner-kernel-access-mock.d.ts +3 -0
- package/lib/definitions/planner-core/src/roomle-planner.d.ts +6 -0
- package/lib/definitions/planner-core/src/utils/planner-selection-handler.d.ts +2 -0
- package/lib/definitions/planner-core/src/webgl/planner-scene-event-handler.d.ts +2 -0
- package/lib/{dimensioning-helper-249f0945.nomodule.js → dimensioning-helper-58e953a0.nomodule.js} +2 -2
- package/lib/{dimensioning-helper-249f0945.nomodule.js.map → dimensioning-helper-58e953a0.nomodule.js.map} +1 -1
- package/lib/{dimensioning-helper-89cf729a.js → dimensioning-helper-710f5fb6.js} +2 -2
- package/lib/{dimensioning-helper-89cf729a.js.map → dimensioning-helper-710f5fb6.js.map} +1 -1
- package/lib/{glb-viewer-939988d6.js → glb-viewer-91906330.js} +2 -2
- package/lib/{glb-viewer-939988d6.js.map → glb-viewer-91906330.js.map} +1 -1
- package/lib/{glb-viewer-62af884c.nomodule.js → glb-viewer-c2e837a9.nomodule.js} +2 -2
- package/lib/{glb-viewer-62af884c.nomodule.js.map → glb-viewer-c2e837a9.nomodule.js.map} +1 -1
- package/lib/glb-viewer-main-6cf5004f.js +2 -0
- package/lib/glb-viewer-main-6cf5004f.js.map +1 -0
- package/lib/glb-viewer-main.nomodule.js +1 -1
- package/lib/legacy/{TextGeometry-914afed8.legacy.js → TextGeometry-6ea1a7a3.legacy.js} +2 -2
- package/lib/legacy/{TextGeometry-914afed8.legacy.js.map → TextGeometry-6ea1a7a3.legacy.js.map} +1 -1
- package/lib/legacy/{banana-for-scale-d0a87001.legacy.js → banana-for-scale-5e151d54.legacy.js} +2 -2
- package/lib/legacy/{banana-for-scale-d0a87001.legacy.js.map → banana-for-scale-5e151d54.legacy.js.map} +1 -1
- package/lib/legacy/budgeteer-measure.legacy.js +1 -1
- package/lib/legacy/{component-dimensioning-e372e127.legacy.js → component-dimensioning-173dd8a0.legacy.js} +2 -2
- package/lib/legacy/component-dimensioning-173dd8a0.legacy.js.map +1 -0
- package/lib/legacy/{component-raycast-helper-9901f95f.legacy.js → component-raycast-helper-5b50a9b4.legacy.js} +2 -2
- package/lib/legacy/component-raycast-helper-5b50a9b4.legacy.js.map +1 -0
- package/lib/legacy/configurator-fc24d471.legacy.js +2 -0
- package/lib/legacy/configurator-fc24d471.legacy.js.map +1 -0
- package/lib/legacy/configurator-main.legacy.js +1 -1
- package/lib/legacy/{continuous-drawing-helper-7e590380.legacy.js → continuous-drawing-helper-f5750894.legacy.js} +2 -2
- package/lib/legacy/continuous-drawing-helper-f5750894.legacy.js.map +1 -0
- package/lib/legacy/{default-light-setting-299c6142.legacy.js → default-light-setting-bfd7814b.legacy.js} +2 -2
- package/lib/legacy/default-light-setting-bfd7814b.legacy.js.map +1 -0
- package/lib/legacy/{dimensioning-helper-af3b9dcc.legacy.js → dimensioning-helper-bda99c57.legacy.js} +2 -2
- package/lib/legacy/{dimensioning-helper-af3b9dcc.legacy.js.map → dimensioning-helper-bda99c57.legacy.js.map} +1 -1
- package/lib/legacy/{glb-viewer-be08b4ee.legacy.js → glb-viewer-12050ab5.legacy.js} +2 -2
- package/lib/legacy/{glb-viewer-be08b4ee.legacy.js.map → glb-viewer-12050ab5.legacy.js.map} +1 -1
- package/lib/legacy/glb-viewer-main.legacy.js +1 -1
- package/lib/legacy/{main-thread-to-worker-f173c2ef.legacy.js → main-thread-to-worker-334452db.legacy.js} +2 -2
- package/lib/legacy/{main-thread-to-worker-f173c2ef.legacy.js.map → main-thread-to-worker-334452db.legacy.js.map} +1 -1
- package/lib/legacy/material-viewer-c8829438.legacy.js +2 -0
- package/lib/legacy/material-viewer-c8829438.legacy.js.map +1 -0
- package/lib/legacy/material-viewer-main.legacy.js +1 -1
- package/lib/legacy/planner-6ecda671.legacy.js +2 -0
- package/lib/legacy/{planner-ebe2a0cc.legacy.js.map → planner-6ecda671.legacy.js.map} +1 -1
- package/lib/legacy/planner-main.legacy.js +1 -1
- package/lib/legacy/roomle-configurator-0e86fc25.legacy.js +2 -0
- package/lib/legacy/roomle-configurator-0e86fc25.legacy.js.map +1 -0
- package/lib/legacy/roomle-dependency-injection-254f79f2.legacy.js +9 -0
- package/lib/legacy/roomle-dependency-injection-254f79f2.legacy.js.map +1 -0
- package/lib/legacy/roomle-sdk.legacy.js +1 -1
- package/lib/legacy/scene-manager-550c1ba0.legacy.js +2 -0
- package/lib/legacy/{scene-manager-ff3489f0.legacy.js.map → scene-manager-550c1ba0.legacy.js.map} +1 -1
- package/lib/legacy/{script-loader-7bcc41ff.legacy.js → script-loader-f188b128.legacy.js} +2 -2
- package/lib/legacy/script-loader-f188b128.legacy.js.map +1 -0
- package/lib/legacy/{stats-helper-99b952ba.legacy.js → stats-helper-8168262d.legacy.js} +2 -2
- package/lib/legacy/stats-helper-8168262d.legacy.js.map +1 -0
- package/lib/legacy/{tools-core-8b1d185f.legacy.js → tools-core-5cc26e7b.legacy.js} +2 -2
- package/lib/legacy/tools-core-5cc26e7b.legacy.js.map +1 -0
- package/lib/{main-thread-to-worker-592260bb.nomodule.js → main-thread-to-worker-cce716d1.nomodule.js} +3 -3
- package/lib/{main-thread-to-worker-592260bb.nomodule.js.map → main-thread-to-worker-cce716d1.nomodule.js.map} +1 -1
- package/lib/{main-thread-to-worker-c12b58a4.js → main-thread-to-worker-d5d5841d.js} +2 -2
- package/lib/{main-thread-to-worker-c12b58a4.js.map → main-thread-to-worker-d5d5841d.js.map} +1 -1
- package/lib/material-viewer-27dc7698.nomodule.js +2 -0
- package/lib/material-viewer-27dc7698.nomodule.js.map +1 -0
- package/lib/material-viewer-2bea3262.js +2 -0
- package/lib/material-viewer-2bea3262.js.map +1 -0
- package/lib/material-viewer-main-e6e07e56.js +2 -0
- package/lib/material-viewer-main-e6e07e56.js.map +1 -0
- package/lib/material-viewer-main.nomodule.js +1 -1
- package/lib/planner-4836800f.nomodule.js +2 -0
- package/lib/{planner-3bbd672b.nomodule.js.map → planner-4836800f.nomodule.js.map} +1 -1
- package/lib/planner-4abc4c6d.js +2 -0
- package/lib/{planner-27de1711.js.map → planner-4abc4c6d.js.map} +1 -1
- package/lib/planner-main-b67a85b4.js +2 -0
- package/lib/planner-main-b67a85b4.js.map +1 -0
- package/lib/planner-main.nomodule.js +1 -1
- package/lib/roomle-configurator-0690376c.nomodule.js +2 -0
- package/lib/roomle-configurator-0690376c.nomodule.js.map +1 -0
- package/lib/roomle-configurator-9672e0b8.js +2 -0
- package/lib/roomle-configurator-9672e0b8.js.map +1 -0
- package/lib/roomle-dependency-injection-6d996d97.js +9 -0
- package/lib/roomle-dependency-injection-6d996d97.js.map +1 -0
- package/lib/roomle-dependency-injection-99c0d447.nomodule.js +9 -0
- package/lib/roomle-dependency-injection-99c0d447.nomodule.js.map +1 -0
- package/lib/{roomle-sdk-7975530c.js → roomle-sdk-33d57c6e.js} +2 -2
- package/lib/roomle-sdk-33d57c6e.js.map +1 -0
- package/lib/roomle-sdk.nomodule.js +1 -1
- package/lib/scene-manager-1405da14.nomodule.js +2 -0
- package/lib/{scene-manager-cbd97bf8.nomodule.js.map → scene-manager-1405da14.nomodule.js.map} +1 -1
- package/lib/scene-manager-7cb2a238.js +2 -0
- package/lib/{scene-manager-acf89a5e.js.map → scene-manager-7cb2a238.js.map} +1 -1
- package/lib/{script-loader-105b310a.js → script-loader-f32ee31e.js} +2 -2
- package/lib/script-loader-f32ee31e.js.map +1 -0
- package/lib/{script-loader-8bd544f0.nomodule.js → script-loader-f6b83084.nomodule.js} +2 -2
- package/lib/script-loader-f6b83084.nomodule.js.map +1 -0
- package/lib/{stats-helper-936d1d26.nomodule.js → stats-helper-915dfaf3.nomodule.js} +2 -2
- package/lib/stats-helper-915dfaf3.nomodule.js.map +1 -0
- package/lib/{stats-helper-d0c86df7.js → stats-helper-f1fc0dc2.js} +2 -2
- package/lib/stats-helper-f1fc0dc2.js.map +1 -0
- package/lib/{tools-core-f2576a59.nomodule.js → tools-core-90145b40.nomodule.js} +2 -2
- package/lib/tools-core-90145b40.nomodule.js.map +1 -0
- package/lib/{tools-core-1ba03b95.js → tools-core-b7d0ae84.js} +2 -2
- package/lib/tools-core-b7d0ae84.js.map +1 -0
- package/package.json +2 -2
- package/lib/component-dimensioning-0ec0b7b2.nomodule.js.map +0 -1
- package/lib/component-dimensioning-c1f91180.js.map +0 -1
- package/lib/component-raycast-helper-1cb2afdd.js.map +0 -1
- package/lib/component-raycast-helper-833f8a52.nomodule.js.map +0 -1
- package/lib/configurator-05086741.nomodule.js.map +0 -1
- package/lib/configurator-be50c3fe.js.map +0 -1
- package/lib/configurator-main-5ada31c9.js +0 -2
- package/lib/configurator-main-5ada31c9.js.map +0 -1
- package/lib/continuous-drawing-helper-771ee2d1.js.map +0 -1
- package/lib/continuous-drawing-helper-ab2aa242.nomodule.js.map +0 -1
- package/lib/default-light-setting-97e2aec6.js.map +0 -1
- package/lib/default-light-setting-99a7eab4.nomodule.js.map +0 -1
- package/lib/glb-viewer-main-b0c2a521.js +0 -2
- package/lib/glb-viewer-main-b0c2a521.js.map +0 -1
- package/lib/legacy/component-dimensioning-e372e127.legacy.js.map +0 -1
- package/lib/legacy/component-raycast-helper-9901f95f.legacy.js.map +0 -1
- package/lib/legacy/configurator-a7843e4a.legacy.js +0 -2
- package/lib/legacy/configurator-a7843e4a.legacy.js.map +0 -1
- package/lib/legacy/continuous-drawing-helper-7e590380.legacy.js.map +0 -1
- package/lib/legacy/default-light-setting-299c6142.legacy.js.map +0 -1
- package/lib/legacy/material-viewer-ef91000c.legacy.js +0 -2
- package/lib/legacy/material-viewer-ef91000c.legacy.js.map +0 -1
- package/lib/legacy/planner-ebe2a0cc.legacy.js +0 -2
- package/lib/legacy/roomle-configurator-5580a37f.legacy.js +0 -2
- package/lib/legacy/roomle-configurator-5580a37f.legacy.js.map +0 -1
- package/lib/legacy/roomle-dependency-injection-8ef06e29.legacy.js +0 -9
- package/lib/legacy/roomle-dependency-injection-8ef06e29.legacy.js.map +0 -1
- package/lib/legacy/scene-manager-ff3489f0.legacy.js +0 -2
- package/lib/legacy/script-loader-7bcc41ff.legacy.js.map +0 -1
- package/lib/legacy/stats-helper-99b952ba.legacy.js.map +0 -1
- package/lib/legacy/tools-core-8b1d185f.legacy.js.map +0 -1
- package/lib/material-viewer-6b24eb46.js +0 -2
- package/lib/material-viewer-6b24eb46.js.map +0 -1
- package/lib/material-viewer-c45b6fa9.nomodule.js +0 -2
- package/lib/material-viewer-c45b6fa9.nomodule.js.map +0 -1
- package/lib/material-viewer-main-d62e009a.js +0 -2
- package/lib/material-viewer-main-d62e009a.js.map +0 -1
- package/lib/planner-27de1711.js +0 -2
- package/lib/planner-3bbd672b.nomodule.js +0 -2
- package/lib/planner-main-d4d7b1b6.js +0 -2
- package/lib/planner-main-d4d7b1b6.js.map +0 -1
- package/lib/roomle-configurator-a5c7cf01.nomodule.js +0 -2
- package/lib/roomle-configurator-a5c7cf01.nomodule.js.map +0 -1
- package/lib/roomle-configurator-f5998035.js +0 -2
- package/lib/roomle-configurator-f5998035.js.map +0 -1
- package/lib/roomle-dependency-injection-6e666b06.js +0 -16
- package/lib/roomle-dependency-injection-6e666b06.js.map +0 -1
- package/lib/roomle-dependency-injection-ab12a554.nomodule.js +0 -16
- package/lib/roomle-dependency-injection-ab12a554.nomodule.js.map +0 -1
- package/lib/roomle-sdk-7975530c.js.map +0 -1
- package/lib/scene-manager-acf89a5e.js +0 -2
- package/lib/scene-manager-cbd97bf8.nomodule.js +0 -2
- package/lib/script-loader-105b310a.js.map +0 -1
- package/lib/script-loader-8bd544f0.nomodule.js.map +0 -1
- package/lib/stats-helper-936d1d26.nomodule.js.map +0 -1
- package/lib/stats-helper-d0c86df7.js.map +0 -1
- package/lib/tools-core-1ba03b95.js.map +0 -1
- package/lib/tools-core-f2576a59.nomodule.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"roomle-dependency-injection-ab12a554.nomodule.js","sources":["../../packages/common-core/public/predefined_lightsettings/shelf.json","../../packages/common-core/public/predefined_lightsettings/shelf_front.json","../../packages/common-core/public/predefined_lightsettings/sofa.json","../../packages/common-core/public/predefined_lightsettings/baked.json","../../packages/common-core/public/predefined_lightsettings/camera.json","../../packages/common-core/public/predefined_lightsettings/equal.json","../../packages/workers/generated/asset-loader.worker.js","../../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../../node_modules/three/examples/jsm/loaders/DRACOLoader.js","../../node_modules/three/examples/jsm/libs/draco/draco_wasm_wrapper.js","../../node_modules/three/examples/jsm/libs/draco/draco_decoder.wasm","../../node_modules/three/examples/jsm/libs/draco/draco_decoder.js","../../node_modules/dat.gui/build/dat.gui.module.js","../../packages/common-core/public/textures/env/default_256.exr","../../node_modules/three/examples/jsm/loaders/FontLoader.js","../../packages/configurator-core/public/fonts/rubik_regular.json","../../node_modules/roomle-core-hsc/wasm/ConfiguratorKernel.wasm","../../node_modules/roomle-core-hsc/wasm/ConfiguratorKernel.js","../../node_modules/roomle-core-hsc/wasm/RoomleCore.wasm","../../node_modules/roomle-core-hsc/wasm/RoomleCore.js","../../node_modules/roomle-core-hsc/ConfiguratorKernelJs.mem","../../node_modules/roomle-core-hsc/ConfiguratorKernelJs.js","../../node_modules/roomle-core-hsc/RoomleCoreJs.mem","../../node_modules/roomle-core-hsc/RoomleCoreJs.js","../../node_modules/roomle-core-hsc/wasm/RoomleToolsCore.wasm","../../node_modules/roomle-core-hsc/wasm/RoomleToolsCore.js","../../node_modules/three/examples/jsm/libs/fflate.module.js","../../node_modules/three/examples/jsm/loaders/EXRLoader.js","../../node_modules/three/examples/jsm/loaders/RGBELoader.js","../../node_modules/three/examples/jsm/postprocessing/Pass.js","../../node_modules/three/examples/jsm/shaders/CopyShader.js","../../node_modules/three/examples/jsm/shaders/FXAAShader.js","../../node_modules/three/examples/jsm/helpers/RectAreaLightHelper.js","../../node_modules/postprocessing/build/index.js","../../node_modules/realism-effects/src/utils/LDR_RGBA_0.png","../../node_modules/realism-effects/src/ao/AOPass.js","../../node_modules/realism-effects/src/ssao/SSAOPass.js","../../node_modules/realism-effects/src/hbao/HBAOPass.js","../../node_modules/realism-effects/src/poissionDenoise/PoissionDenoisePass.js","../../node_modules/realism-effects/src/poissionDenoise/utils/PoissonUtils.js","../../node_modules/realism-effects/src/ssao/utils/ssaoUtils.js"],"sourcesContent":["export default \"static/shelf-2975dd3f2fa9c763.json\"","export default \"static/shelf_front-8c9566a4512f0de8.json\"","export default \"static/sofa-997b116bc5f2e92e.json\"","export default \"static/baked-6485a2b1daeb69e8.json\"","export default \"static/camera-05824b47cdb951e4.json\"","export default \"static/equal-319f6b83c827913f.json\"","export default \"static/asset-loader.worker-1735a5fb1e401244.js\"","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. InterleavedBufferAttributes are not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tarray.set( attributes[ i ].array, offset );\n\n\t\toffset += attributes[ i ].array.length;\n\n\t}\n\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute}\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new BufferAttribute(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttr = geometry.morphAttributes[ name ];\n\t\tif ( morphAttr ) {\n\n\t\t\ttmpMorphAttributes[ name ] = new BufferAttribute(\n\t\t\t\tnew morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize ),\n\t\t\t\tmorphAttr.itemSize,\n\t\t\t\tmorphAttr.normalized\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst decimalShift = Math.log10( 1 / tolerance );\n\tconst shiftMultiplier = Math.pow( 10, decimalShift );\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * shiftMultiplier ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttr = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newarray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewarray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttr ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttr.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttr[ m ][ getterFunc ]( index ) );\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\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new BufferAttribute(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new BufferAttribute(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\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\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\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\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nfunction mergeBufferGeometries( geometries, useGroups = false ) {\n\n\tconsole.warn( 'THREE.BufferGeometryUtils: mergeBufferGeometries() has been renamed to mergeGeometries().' ); // @deprecated, r151\n\treturn mergeGeometries( geometries, useGroups );\n\n}\n\nfunction mergeBufferAttributes( attributes ) {\n\n\tconsole.warn( 'THREE.BufferGeometryUtils: mergeBufferAttributes() has been renamed to mergeAttributes().' ); // @deprecated, r151\n\treturn mergeAttributes( attributes );\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeBufferGeometries,\n\tmergeAttributes,\n\tmergeBufferAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\tresourcePath = this.path;\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( 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\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetDDSLoader() {\n\n\t\tthrow new Error(\n\n\t\t\t'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".'\n\n\t\t);\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenColor.fromArray( extension.sheenColorFactor );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\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\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( navigator.userAgent ) === true;\n\t\t\tisFirefox = navigator.userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? navigator.userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || isSafari || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\tPromise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tmaterialParams.emissive = new Color().fromArray( materialDef.emissiveFactor );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( buffer, onLoad, onError ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i ).convertSRGBToLinear();\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n","export default \"static/draco_wasm_wrapper-6263f3a4b71cdf3b.js\"","export default \"static/draco_decoder-b048235474cbf09e.wasm\"","export default \"static/draco_decoder-dc7f397e2a2ebac4.js\"","/**\n * dat-gui JavaScript Controller Library\n * https://github.com/dataarts/dat.gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"<div id=\\\"dg-save\\\" class=\\\"dg dialogue\\\">\\n\\n Here's the new load parameter for your <code>GUI</code>'s constructor:\\n\\n <textarea id=\\\"dg-new-constructor\\\"></textarea>\\n\\n <div id=\\\"dg-save-locally\\\">\\n\\n <input id=\\\"dg-local-storage\\\" type=\\\"checkbox\\\"/> Automatically save\\n values to <code>localStorage</code> on exit.\\n\\n <div id=\\\"dg-local-explain\\\">The values saved to <code>localStorage</code> will\\n override those passed to <code>dat.GUI</code>'s constructor. This makes it\\n easier to work incrementally, but <code>localStorage</code> is fragile,\\n and your friends may not see the same values you do.\\n\\n </div>\\n\\n </div>\\n\\n</div>\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n//# sourceMappingURL=dat.gui.module.js.map\n","export default \"static/default_256-f1c66a2764f88cc0.exr\"","import {\n\tFileLoader,\n\tLoader,\n\tShapePath\n} from 'three';\n\nclass FontLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\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\tconst font = scope.parse( JSON.parse( text ) );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n}\n\n//\n\nclass Font {\n\n\tconstructor( data ) {\n\n\t\tthis.isFont = true;\n\n\t\tthis.type = 'Font';\n\n\t\tthis.data = data;\n\n\t}\n\n\tgenerateShapes( text, size = 100 ) {\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tshapes.push( ...paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nfunction createPaths( text, size, data ) {\n\n\tconst chars = Array.from( text );\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nexport { FontLoader, Font };\n","export default \"static/rubik_regular-bc008a7de2daee79.json\"","export default \"static/ConfiguratorKernel-9b2200beecbb4aba.wasm\"","export default \"static/ConfiguratorKernel-4cae014a679bd075.js\"","export default \"static/RoomleCore-9b7222821c5db652.wasm\"","export default \"static/RoomleCore-c8f6b8cd39eb2b33.js\"","export default \"static/ConfiguratorKernelJs-4e91e1188ec82ef2.mem\"","export default \"static/ConfiguratorKernelJs-fa03f3def114414e.js\"","export default \"static/RoomleCoreJs-e5d0b6bd9f92c11f.mem\"","export default \"static/RoomleCoreJs-daa1a46b93487327.js\"","export default \"static/RoomleToolsCore-651d18a098ca7627.wasm\"","export default \"static/RoomleToolsCore-72c429dba6452fa8.js\"","/*!\nfflate - fast JavaScript compression/decompression\n<https://101arrowz.github.io/fflate>\nLicensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE\nversion 0.6.9\n*/\n\n// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar durl = function (c) { return URL.createObjectURL(new Blob([c], { type: 'text/javascript' })); };\nvar cwk = function (u) { return new Worker(u); };\ntry {\n URL.revokeObjectURL(durl(''));\n}\ncatch (e) {\n // We're in Deno or a very old browser\n durl = function (c) { return 'data:application/javascript;charset=UTF-8,' + encodeURI(c); };\n // If Deno, this is necessary; if not, this changes nothing\n cwk = function (u) { return new Worker(u, { type: 'module' }); };\n}\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = cwk(ch2[id] || (ch2[id] = durl(c)));\n w.onerror = function (e) { return cb(e.error, null); };\n w.onmessage = function (e) { return cb(null, e.data); };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p / 8) | 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n if (!sl || (st && !st.l && sl < 5))\n return buf || new u8(0);\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n st.f = final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n throw 'invalid block type';\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n if (!c)\n throw 'invalid length/literal';\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n throw 'invalid distance';\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = lpos, st.b = bt;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [et, 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e < s) {\n // write full block\n pos = wfblk(w, pos, dat.subarray(i, e));\n }\n else {\n // write final block\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n // deopt when i > s - 3 - at end, deopt acceptable\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst && pos & 7)\n pos = wfblk(w, pos + 1, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new u32(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (t)\n throw 'stream finished';\n if (!strm.ondata)\n throw 'no stream handler';\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n throw 'invalid gzip data';\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return ((d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) | (d[l - 1] << 24)) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n throw 'invalid zlib data';\n if (d[1] & 32)\n throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = this.p.length > 3 ? gzs(this.p) : 4;\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n throw 'invalid gzip stream';\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n throw 'invalid zlib stream';\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no stream handler';\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k;\n if (val instanceof u8)\n t[n] = [val, o];\n else if (Array.isArray(val))\n t[n] = [val[0], mrg(o, val[1])];\n else\n fltn(val, n + '/', t, o);\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return [r, slc(d, i - 1)];\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback';\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n throw 'invalid utf-8 data';\n this.t = null;\n }\n return;\n }\n if (!this.p)\n throw 'stream finished';\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), ch = _a[0], np = _a[1];\n if (final) {\n if (np.length)\n throw 'invalid utf-8 data';\n this.p = null;\n }\n else\n this.p = np;\n this.ondata(ch, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback';\n if (this.d)\n throw 'stream finished';\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td)\n return td.decode(dat);\n else {\n var _a = dutf8(dat), out = _a[0], ext = _a[1];\n if (ext.length)\n throw 'invalid utf-8 data';\n return out;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n throw 'extra field too long';\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c == null && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n throw 'date not in range 1980-2099';\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1)), b += 4;\n if (c != null) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no callback - add to ZIP archive before pushing';\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this_1 = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this_1 = this;\n if (this.d & 2)\n throw 'stream finished';\n var f = strToU8(file.filename), fl = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl != file.filename.length || (o && (com.length != o.length));\n var hl = fl + exfl(file.extra) + 30;\n if (fl > 65535)\n throw 'filename too long';\n var header = new u8(hl);\n wzh(header, 0, file, f, u);\n var chks = [header];\n var pAll = function () {\n for (var _i = 0, chks_1 = chks; _i < chks_1.length; _i++) {\n var chk = chks_1[_i];\n _this_1.ondata(null, chk, false);\n }\n chks = [];\n };\n var tr = this.d;\n this.d = 0;\n var ind = this.u.length;\n var uf = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll();\n if (tr) {\n var nxt = _this_1.u[ind + 1];\n if (nxt)\n nxt.r();\n else\n _this_1.d = 1;\n }\n tr = 1;\n }\n });\n var cl = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this_1.ondata(err, dat, final);\n _this_1.terminate();\n }\n else {\n cl += dat.length;\n chks.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl);\n wbytes(dd, 12, file.size);\n chks.push(dd);\n uf.c = cl, uf.b = hl + cl + 16, uf.crc = file.crc, uf.size = file.size;\n if (tr)\n uf.r();\n tr = 1;\n }\n else if (tr)\n pAll();\n }\n };\n this.u.push(uf);\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this_1 = this;\n if (this.d & 2) {\n if (this.d & 1)\n throw 'stream finishing';\n throw 'stream finished';\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this_1.d & 1))\n return;\n _this_1.u.splice(-1, 1);\n _this_1.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, f.c, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cb(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cb(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl('filename too long', null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n throw 'filename too long';\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this_1 = this;\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, data, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this_1 = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this_1.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this_1.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this_1 = this;\n if (!this.onfile)\n throw 'no callback';\n if (!this.p)\n throw 'stream finished';\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_2 = [];\n this_1.k.unshift(chks_2);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n throw 'no callback';\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this_1.o[cmp_1];\n if (!ctr)\n throw 'unknown compression type ' + cmp_1;\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_3 = chks_2; _i < chks_3.length; _i++) {\n var dat = chks_3[_i];\n d_1.push(dat, false);\n }\n if (_this_1.k[0] == chks_2 && _this_1.c)\n _this_1.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n throw 'invalid zip file';\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n if (typeof cb != 'function')\n throw 'no callback';\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cb('invalid zip file', null);\n return;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (!lft)\n cb(null, {});\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50) {\n cb('invalid zip file', null);\n return;\n }\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n files[fn] = d;\n if (!--lft)\n cb(null, files);\n }\n };\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl('unknown compression type ' + c_1, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n throw 'invalid zip file';\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n throw 'unknown compression type ' + c_2;\n }\n return files;\n}\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearSRGBColorSpace,\n\tRedFormat,\n\tRGBAFormat\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * OpenEXR loader currently supports uncompressed, ZIP(S), RLE, PIZ and DWA/B compression.\n * Supports reading as UnsignedByte, HalfFloat and Float type data texture.\n *\n * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita\n * implementation, so I have preserved their copyright notices.\n */\n\n// /*\n// Copyright (c) 2014 - 2017, Syoyo Fujita\n// All rights reserved.\n\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n// * Neither the name of the Syoyo Fujita nor the\n// names of its contributors may be used to endorse or promote products\n// derived from this software without specific prior written permission.\n\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// */\n\n// // TinyEXR contains some OpenEXR code, which is licensed under ------------\n\n// ///////////////////////////////////////////////////////////////////////////\n// //\n// // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// // Digital Ltd. LLC\n// //\n// // All rights reserved.\n// //\n// // Redistribution and use in source and binary forms, with or without\n// // modification, are permitted provided that the following conditions are\n// // met:\n// // * Redistributions of source code must retain the above copyright\n// // notice, this list of conditions and the following disclaimer.\n// // * Redistributions in binary form must reproduce the above\n// // copyright notice, this list of conditions and the following disclaimer\n// // in the documentation and/or other materials provided with the\n// // distribution.\n// // * Neither the name of Industrial Light & Magic nor the names of\n// // its contributors may be used to endorse or promote products derived\n// // from this software without specific prior written permission.\n// //\n// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// // \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// //\n// ///////////////////////////////////////////////////////////////////////////\n\n// // End of OpenEXR license -------------------------------------------------\n\nclass EXRLoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst USHORT_RANGE = ( 1 << 16 );\n\t\tconst BITMAP_SIZE = ( USHORT_RANGE >> 3 );\n\n\t\tconst HUF_ENCBITS = 16; // literal (value) bit length\n\t\tconst HUF_DECBITS = 14; // decoding bit size (>= 8)\n\n\t\tconst HUF_ENCSIZE = ( 1 << HUF_ENCBITS ) + 1; // encoding table size\n\t\tconst HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size\n\t\tconst HUF_DECMASK = HUF_DECSIZE - 1;\n\n\t\tconst NBITS = 16;\n\t\tconst A_OFFSET = 1 << ( NBITS - 1 );\n\t\tconst MOD_MASK = ( 1 << NBITS ) - 1;\n\n\t\tconst SHORT_ZEROCODE_RUN = 59;\n\t\tconst LONG_ZEROCODE_RUN = 63;\n\t\tconst SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;\n\n\t\tconst ULONG_SIZE = 8;\n\t\tconst FLOAT32_SIZE = 4;\n\t\tconst INT32_SIZE = 4;\n\t\tconst INT16_SIZE = 2;\n\t\tconst INT8_SIZE = 1;\n\n\t\tconst STATIC_HUFFMAN = 0;\n\t\tconst DEFLATE = 1;\n\n\t\tconst UNKNOWN = 0;\n\t\tconst LOSSY_DCT = 1;\n\t\tconst RLE = 2;\n\n\t\tconst logBase = Math.pow( 2.7182818, 2.2 );\n\n\t\tfunction reverseLutFromBitmap( bitmap, lut ) {\n\n\t\t\tlet k = 0;\n\n\t\t\tfor ( let i = 0; i < USHORT_RANGE; ++ i ) {\n\n\t\t\t\tif ( ( i == 0 ) || ( bitmap[ i >> 3 ] & ( 1 << ( i & 7 ) ) ) ) {\n\n\t\t\t\t\tlut[ k ++ ] = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst n = k - 1;\n\n\t\t\twhile ( k < USHORT_RANGE ) lut[ k ++ ] = 0;\n\n\t\t\treturn n;\n\n\t\t}\n\n\t\tfunction hufClearDecTable( hdec ) {\n\n\t\t\tfor ( let i = 0; i < HUF_DECSIZE; i ++ ) {\n\n\t\t\t\thdec[ i ] = {};\n\t\t\t\thdec[ i ].len = 0;\n\t\t\t\thdec[ i ].lit = 0;\n\t\t\t\thdec[ i ].p = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst getBitsReturn = { l: 0, c: 0, lc: 0 };\n\n\t\tfunction getBits( nBits, c, lc, uInt8Array, inOffset ) {\n\n\t\t\twhile ( lc < nBits ) {\n\n\t\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\t\tlc += 8;\n\n\t\t\t}\n\n\t\t\tlc -= nBits;\n\n\t\t\tgetBitsReturn.l = ( c >> lc ) & ( ( 1 << nBits ) - 1 );\n\t\t\tgetBitsReturn.c = c;\n\t\t\tgetBitsReturn.lc = lc;\n\n\t\t}\n\n\t\tconst hufTableBuffer = new Array( 59 );\n\n\t\tfunction hufCanonicalCodeTable( hcode ) {\n\n\t\t\tfor ( let i = 0; i <= 58; ++ i ) hufTableBuffer[ i ] = 0;\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) hufTableBuffer[ hcode[ i ] ] += 1;\n\n\t\t\tlet c = 0;\n\n\t\t\tfor ( let i = 58; i > 0; -- i ) {\n\n\t\t\t\tconst nc = ( ( c + hufTableBuffer[ i ] ) >> 1 );\n\t\t\t\thufTableBuffer[ i ] = c;\n\t\t\t\tc = nc;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) {\n\n\t\t\t\tconst l = hcode[ i ];\n\t\t\t\tif ( l > 0 ) hcode[ i ] = l | ( hufTableBuffer[ l ] ++ << 6 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction hufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, hcode ) {\n\n\t\t\tconst p = inOffset;\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tif ( p.value - inOffset.value > ni ) return false;\n\n\t\t\t\tgetBits( 6, c, lc, uInt8Array, p );\n\n\t\t\t\tconst l = getBitsReturn.l;\n\t\t\t\tc = getBitsReturn.c;\n\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\thcode[ im ] = l;\n\n\t\t\t\tif ( l == LONG_ZEROCODE_RUN ) {\n\n\t\t\t\t\tif ( p.value - inOffset.value > ni ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgetBits( 8, c, lc, uInt8Array, p );\n\n\t\t\t\t\tlet zerun = getBitsReturn.l + SHORTEST_LONG_RUN;\n\t\t\t\t\tc = getBitsReturn.c;\n\t\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t} else if ( l >= SHORT_ZEROCODE_RUN ) {\n\n\t\t\t\t\tlet zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thufCanonicalCodeTable( hcode );\n\n\t\t}\n\n\t\tfunction hufLength( code ) {\n\n\t\t\treturn code & 63;\n\n\t\t}\n\n\t\tfunction hufCode( code ) {\n\n\t\t\treturn code >> 6;\n\n\t\t}\n\n\t\tfunction hufBuildDecTable( hcode, im, iM, hdecod ) {\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tconst c = hufCode( hcode[ im ] );\n\t\t\t\tconst l = hufLength( hcode[ im ] );\n\n\t\t\t\tif ( c >> l ) {\n\n\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( l > HUF_DECBITS ) {\n\n\t\t\t\t\tconst pl = hdecod[ ( c >> ( l - HUF_DECBITS ) ) ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.lit ++;\n\n\t\t\t\t\tif ( pl.p ) {\n\n\t\t\t\t\t\tconst p = pl.p;\n\t\t\t\t\t\tpl.p = new Array( pl.lit );\n\n\t\t\t\t\t\tfor ( let i = 0; i < pl.lit - 1; ++ i ) {\n\n\t\t\t\t\t\t\tpl.p[ i ] = p[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpl.p = new Array( 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.p[ pl.lit - 1 ] = im;\n\n\t\t\t\t} else if ( l ) {\n\n\t\t\t\t\tlet plOffset = 0;\n\n\t\t\t\t\tfor ( let i = 1 << ( HUF_DECBITS - l ); i > 0; i -- ) {\n\n\t\t\t\t\t\tconst pl = hdecod[ ( c << ( HUF_DECBITS - l ) ) + plOffset ];\n\n\t\t\t\t\t\tif ( pl.len || pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpl.len = l;\n\t\t\t\t\t\tpl.lit = im;\n\n\t\t\t\t\t\tplOffset ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst getCharReturn = { c: 0, lc: 0 };\n\n\t\tfunction getChar( c, lc, uInt8Array, inOffset ) {\n\n\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\tlc += 8;\n\n\t\t\tgetCharReturn.c = c;\n\t\t\tgetCharReturn.lc = lc;\n\n\t\t}\n\n\t\tconst getCodeReturn = { c: 0, lc: 0 };\n\n\t\tfunction getCode( po, rlc, c, lc, uInt8Array, inOffset, outBuffer, outBufferOffset, outBufferEndOffset ) {\n\n\t\t\tif ( po == rlc ) {\n\n\t\t\t\tif ( lc < 8 ) {\n\n\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t}\n\n\t\t\t\tlc -= 8;\n\n\t\t\t\tlet cs = ( c >> lc );\n\t\t\t\tcs = new Uint8Array( [ cs ] )[ 0 ];\n\n\t\t\t\tif ( outBufferOffset.value + cs > outBufferEndOffset ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst s = outBuffer[ outBufferOffset.value - 1 ];\n\n\t\t\t\twhile ( cs -- > 0 ) {\n\n\t\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = s;\n\n\t\t\t\t}\n\n\t\t\t} else if ( outBufferOffset.value < outBufferEndOffset ) {\n\n\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = po;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tgetCodeReturn.c = c;\n\t\t\tgetCodeReturn.lc = lc;\n\n\t\t}\n\n\t\tfunction UInt16( value ) {\n\n\t\t\treturn ( value & 0xFFFF );\n\n\t\t}\n\n\t\tfunction Int16( value ) {\n\n\t\t\tconst ref = UInt16( value );\n\t\t\treturn ( ref > 0x7FFF ) ? ref - 0x10000 : ref;\n\n\t\t}\n\n\t\tconst wdec14Return = { a: 0, b: 0 };\n\n\t\tfunction wdec14( l, h ) {\n\n\t\t\tconst ls = Int16( l );\n\t\t\tconst hs = Int16( h );\n\n\t\t\tconst hi = hs;\n\t\t\tconst ai = ls + ( hi & 1 ) + ( hi >> 1 );\n\n\t\t\tconst as = ai;\n\t\t\tconst bs = ai - hi;\n\n\t\t\twdec14Return.a = as;\n\t\t\twdec14Return.b = bs;\n\n\t\t}\n\n\t\tfunction wdec16( l, h ) {\n\n\t\t\tconst m = UInt16( l );\n\t\t\tconst d = UInt16( h );\n\n\t\t\tconst bb = ( m - ( d >> 1 ) ) & MOD_MASK;\n\t\t\tconst aa = ( d + bb - A_OFFSET ) & MOD_MASK;\n\n\t\t\twdec14Return.a = aa;\n\t\t\twdec14Return.b = bb;\n\n\t\t}\n\n\t\tfunction wav2Decode( buffer, j, nx, ox, ny, oy, mx ) {\n\n\t\t\tconst w14 = mx < ( 1 << 14 );\n\t\t\tconst n = ( nx > ny ) ? ny : nx;\n\t\t\tlet p = 1;\n\t\t\tlet p2;\n\t\t\tlet py;\n\n\t\t\twhile ( p <= n ) p <<= 1;\n\n\t\t\tp >>= 1;\n\t\t\tp2 = p;\n\t\t\tp >>= 1;\n\n\t\t\twhile ( p >= 1 ) {\n\n\t\t\t\tpy = 0;\n\t\t\t\tconst ey = py + oy * ( ny - p2 );\n\t\t\t\tconst oy1 = oy * p;\n\t\t\t\tconst oy2 = oy * p2;\n\t\t\t\tconst ox1 = ox * p;\n\t\t\t\tconst ox2 = ox * p2;\n\t\t\t\tlet i00, i01, i10, i11;\n\n\t\t\t\tfor ( ; py <= ey; py += oy2 ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\t\t\t\t\t\tconst p10 = px + oy1;\n\t\t\t\t\t\tconst p11 = p10 + ox1;\n\n\t\t\t\t\t\tif ( w14 ) {\n\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nx & p ) {\n\n\t\t\t\t\t\tconst p10 = px + oy1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ny & p ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p01 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p01 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tp2 = p;\n\t\t\t\tp >>= 1;\n\n\t\t\t}\n\n\t\t\treturn py;\n\n\t\t}\n\n\t\tfunction hufDecode( encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset ) {\n\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\t\t\tconst outBufferEndOffset = no;\n\t\t\tconst inOffsetEnd = Math.trunc( inOffset.value + ( ni + 7 ) / 8 );\n\n\t\t\twhile ( inOffset.value < inOffsetEnd ) {\n\n\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\tc = getCharReturn.c;\n\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\twhile ( lc >= HUF_DECBITS ) {\n\n\t\t\t\t\tconst index = ( c >> ( lc - HUF_DECBITS ) ) & HUF_DECMASK;\n\t\t\t\t\tconst pl = decodingTable[ index ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet j;\n\n\t\t\t\t\t\tfor ( j = 0; j < pl.lit; j ++ ) {\n\n\t\t\t\t\t\t\tconst l = hufLength( encodingTable[ pl.p[ j ] ] );\n\n\t\t\t\t\t\t\twhile ( lc < l && inOffset.value < inOffsetEnd ) {\n\n\t\t\t\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( lc >= l ) {\n\n\t\t\t\t\t\t\t\tif ( hufCode( encodingTable[ pl.p[ j ] ] ) == ( ( c >> ( lc - l ) ) & ( ( 1 << l ) - 1 ) ) ) {\n\n\t\t\t\t\t\t\t\t\tlc -= l;\n\n\t\t\t\t\t\t\t\t\tgetCode( pl.p[ j ], rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t\t\t\t\tbreak;\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\tif ( j == pl.lit ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\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 i = ( 8 - ni ) & 7;\n\n\t\t\tc >>= i;\n\t\t\tlc -= i;\n\n\t\t\twhile ( lc > 0 ) {\n\n\t\t\t\tconst pl = decodingTable[ ( c << ( HUF_DECBITS - lc ) ) & HUF_DECMASK ];\n\n\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction hufUncompress( uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw ) {\n\n\t\t\tconst outOffset = { value: 0 };\n\t\t\tconst initialInOffset = inOffset.value;\n\n\t\t\tconst im = parseUint32( inDataView, inOffset );\n\t\t\tconst iM = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tconst nBits = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tif ( im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with HUF_ENCSIZE' );\n\n\t\t\t}\n\n\t\t\tconst freq = new Array( HUF_ENCSIZE );\n\t\t\tconst hdec = new Array( HUF_DECSIZE );\n\n\t\t\thufClearDecTable( hdec );\n\n\t\t\tconst ni = nCompressed - ( inOffset.value - initialInOffset );\n\n\t\t\thufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, freq );\n\n\t\t\tif ( nBits > 8 * ( nCompressed - ( inOffset.value - initialInOffset ) ) ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with hufUncompress' );\n\n\t\t\t}\n\n\t\t\thufBuildDecTable( freq, im, iM, hdec );\n\n\t\t\thufDecode( freq, hdec, uInt8Array, inOffset, nBits, iM, nRaw, outBuffer, outOffset );\n\n\t\t}\n\n\t\tfunction applyLut( lut, data, nData ) {\n\n\t\t\tfor ( let i = 0; i < nData; ++ i ) {\n\n\t\t\t\tdata[ i ] = lut[ data[ i ] ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction predictor( source ) {\n\n\t\t\tfor ( let t = 1; t < source.length; t ++ ) {\n\n\t\t\t\tconst d = source[ t - 1 ] + source[ t ] - 128;\n\t\t\t\tsource[ t ] = d;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction interleaveScalar( source, out ) {\n\n\t\t\tlet t1 = 0;\n\t\t\tlet t2 = Math.floor( ( source.length + 1 ) / 2 );\n\t\t\tlet s = 0;\n\t\t\tconst stop = source.length - 1;\n\n\t\t\twhile ( true ) {\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t1 ++ ];\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t2 ++ ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction decodeRunLength( source ) {\n\n\t\t\tlet size = source.byteLength;\n\t\t\tconst out = new Array();\n\t\t\tlet p = 0;\n\n\t\t\tconst reader = new DataView( source );\n\n\t\t\twhile ( size > 0 ) {\n\n\t\t\t\tconst l = reader.getInt8( p ++ );\n\n\t\t\t\tif ( l < 0 ) {\n\n\t\t\t\t\tconst count = - l;\n\t\t\t\t\tsize -= count + 1;\n\n\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\tout.push( reader.getUint8( p ++ ) );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst count = l;\n\t\t\t\t\tsize -= 2;\n\n\t\t\t\t\tconst value = reader.getUint8( p ++ );\n\n\t\t\t\t\tfor ( let i = 0; i < count + 1; i ++ ) {\n\n\t\t\t\t\t\tout.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn out;\n\n\t\t}\n\n\t\tfunction lossyDctDecode( cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer ) {\n\n\t\t\tlet dataView = new DataView( outBuffer.buffer );\n\n\t\t\tconst width = channelData[ cscSet.idx[ 0 ] ].width;\n\t\t\tconst height = channelData[ cscSet.idx[ 0 ] ].height;\n\n\t\t\tconst numComp = 3;\n\n\t\t\tconst numFullBlocksX = Math.floor( width / 8.0 );\n\t\t\tconst numBlocksX = Math.ceil( width / 8.0 );\n\t\t\tconst numBlocksY = Math.ceil( height / 8.0 );\n\t\t\tconst leftoverX = width - ( numBlocksX - 1 ) * 8;\n\t\t\tconst leftoverY = height - ( numBlocksY - 1 ) * 8;\n\n\t\t\tconst currAcComp = { value: 0 };\n\t\t\tconst currDcComp = new Array( numComp );\n\t\t\tconst dctData = new Array( numComp );\n\t\t\tconst halfZigBlock = new Array( numComp );\n\t\t\tconst rowBlock = new Array( numComp );\n\t\t\tconst rowOffsets = new Array( numComp );\n\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\trowOffsets[ comp ] = rowPtrs[ cscSet.idx[ comp ] ];\n\t\t\t\tcurrDcComp[ comp ] = ( comp < 1 ) ? 0 : currDcComp[ comp - 1 ] + numBlocksX * numBlocksY;\n\t\t\t\tdctData[ comp ] = new Float32Array( 64 );\n\t\t\t\thalfZigBlock[ comp ] = new Uint16Array( 64 );\n\t\t\t\trowBlock[ comp ] = new Uint16Array( numBlocksX * 64 );\n\n\t\t\t}\n\n\t\t\tfor ( let blocky = 0; blocky < numBlocksY; ++ blocky ) {\n\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif ( blocky == numBlocksY - 1 )\n\t\t\t\t\tmaxY = leftoverY;\n\n\t\t\t\tlet maxX = 8;\n\n\t\t\t\tfor ( let blockx = 0; blockx < numBlocksX; ++ blockx ) {\n\n\t\t\t\t\tif ( blockx == numBlocksX - 1 )\n\t\t\t\t\t\tmaxX = leftoverX;\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\thalfZigBlock[ comp ].fill( 0 );\n\n\t\t\t\t\t\t// set block DC component\n\t\t\t\t\t\thalfZigBlock[ comp ][ 0 ] = dcBuffer[ currDcComp[ comp ] ++ ];\n\t\t\t\t\t\t// set block AC components\n\t\t\t\t\t\tunRleAC( currAcComp, acBuffer, halfZigBlock[ comp ] );\n\n\t\t\t\t\t\t// UnZigZag block to float\n\t\t\t\t\t\tunZigZag( halfZigBlock[ comp ], dctData[ comp ] );\n\t\t\t\t\t\t// decode float dct\n\t\t\t\t\t\tdctInverse( dctData[ comp ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( numComp == 3 ) {\n\n\t\t\t\t\t\tcsc709Inverse( dctData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\tconvertToHalf( dctData[ comp ], rowBlock[ comp ], blockx * 64 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // blockx\n\n\t\t\t\tlet offset = 0;\n\n\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\toffset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\t\tfor ( let blockx = 0; blockx < numFullBlocksX; ++ blockx ) {\n\n\t\t\t\t\t\t\tconst src = blockx * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 0 * INT16_SIZE * type, rowBlock[ comp ][ src + 0 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 1 * INT16_SIZE * type, rowBlock[ comp ][ src + 1 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 2 * INT16_SIZE * type, rowBlock[ comp ][ src + 2 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 3 * INT16_SIZE * type, rowBlock[ comp ][ src + 3 ], true );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 4 * INT16_SIZE * type, rowBlock[ comp ][ src + 4 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 5 * INT16_SIZE * type, rowBlock[ comp ][ src + 5 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 6 * INT16_SIZE * type, rowBlock[ comp ][ src + 6 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 7 * INT16_SIZE * type, rowBlock[ comp ][ src + 7 ], true );\n\n\t\t\t\t\t\t\toffset += 8 * INT16_SIZE * type;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle partial X blocks\n\t\t\t\t\tif ( numFullBlocksX != numBlocksX ) {\n\n\t\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ] + 8 * numFullBlocksX * INT16_SIZE * type;\n\t\t\t\t\t\t\tconst src = numFullBlocksX * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < maxX; ++ x ) {\n\n\t\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * type, rowBlock[ comp ][ src + x ], 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} // comp\n\n\t\t\t} // blocky\n\n\t\t\tconst halfRow = new Uint16Array( width );\n\t\t\tdataView = new DataView( outBuffer.buffer );\n\n\t\t\t// convert channels back to float, if needed\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\tchannelData[ cscSet.idx[ comp ] ].decoded = true;\n\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\tif ( channelData[ comp ].type != 2 ) continue;\n\n\t\t\t\tfor ( let y = 0; y < height; ++ y ) {\n\n\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\thalfRow[ x ] = dataView.getUint16( offset + x * INT16_SIZE * type, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\tdataView.setFloat32( offset + x * INT16_SIZE * type, decodeFloat16( halfRow[ x ] ), 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\tfunction unRleAC( currAcComp, acBuffer, halfZigBlock ) {\n\n\t\t\tlet acValue;\n\t\t\tlet dctComp = 1;\n\n\t\t\twhile ( dctComp < 64 ) {\n\n\t\t\t\tacValue = acBuffer[ currAcComp.value ];\n\n\t\t\t\tif ( acValue == 0xff00 ) {\n\n\t\t\t\t\tdctComp = 64;\n\n\t\t\t\t} else if ( acValue >> 8 == 0xff ) {\n\n\t\t\t\t\tdctComp += acValue & 0xff;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thalfZigBlock[ dctComp ] = acValue;\n\t\t\t\t\tdctComp ++;\n\n\t\t\t\t}\n\n\t\t\t\tcurrAcComp.value ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unZigZag( src, dst ) {\n\n\t\t\tdst[ 0 ] = decodeFloat16( src[ 0 ] );\n\t\t\tdst[ 1 ] = decodeFloat16( src[ 1 ] );\n\t\t\tdst[ 2 ] = decodeFloat16( src[ 5 ] );\n\t\t\tdst[ 3 ] = decodeFloat16( src[ 6 ] );\n\t\t\tdst[ 4 ] = decodeFloat16( src[ 14 ] );\n\t\t\tdst[ 5 ] = decodeFloat16( src[ 15 ] );\n\t\t\tdst[ 6 ] = decodeFloat16( src[ 27 ] );\n\t\t\tdst[ 7 ] = decodeFloat16( src[ 28 ] );\n\t\t\tdst[ 8 ] = decodeFloat16( src[ 2 ] );\n\t\t\tdst[ 9 ] = decodeFloat16( src[ 4 ] );\n\n\t\t\tdst[ 10 ] = decodeFloat16( src[ 7 ] );\n\t\t\tdst[ 11 ] = decodeFloat16( src[ 13 ] );\n\t\t\tdst[ 12 ] = decodeFloat16( src[ 16 ] );\n\t\t\tdst[ 13 ] = decodeFloat16( src[ 26 ] );\n\t\t\tdst[ 14 ] = decodeFloat16( src[ 29 ] );\n\t\t\tdst[ 15 ] = decodeFloat16( src[ 42 ] );\n\t\t\tdst[ 16 ] = decodeFloat16( src[ 3 ] );\n\t\t\tdst[ 17 ] = decodeFloat16( src[ 8 ] );\n\t\t\tdst[ 18 ] = decodeFloat16( src[ 12 ] );\n\t\t\tdst[ 19 ] = decodeFloat16( src[ 17 ] );\n\n\t\t\tdst[ 20 ] = decodeFloat16( src[ 25 ] );\n\t\t\tdst[ 21 ] = decodeFloat16( src[ 30 ] );\n\t\t\tdst[ 22 ] = decodeFloat16( src[ 41 ] );\n\t\t\tdst[ 23 ] = decodeFloat16( src[ 43 ] );\n\t\t\tdst[ 24 ] = decodeFloat16( src[ 9 ] );\n\t\t\tdst[ 25 ] = decodeFloat16( src[ 11 ] );\n\t\t\tdst[ 26 ] = decodeFloat16( src[ 18 ] );\n\t\t\tdst[ 27 ] = decodeFloat16( src[ 24 ] );\n\t\t\tdst[ 28 ] = decodeFloat16( src[ 31 ] );\n\t\t\tdst[ 29 ] = decodeFloat16( src[ 40 ] );\n\n\t\t\tdst[ 30 ] = decodeFloat16( src[ 44 ] );\n\t\t\tdst[ 31 ] = decodeFloat16( src[ 53 ] );\n\t\t\tdst[ 32 ] = decodeFloat16( src[ 10 ] );\n\t\t\tdst[ 33 ] = decodeFloat16( src[ 19 ] );\n\t\t\tdst[ 34 ] = decodeFloat16( src[ 23 ] );\n\t\t\tdst[ 35 ] = decodeFloat16( src[ 32 ] );\n\t\t\tdst[ 36 ] = decodeFloat16( src[ 39 ] );\n\t\t\tdst[ 37 ] = decodeFloat16( src[ 45 ] );\n\t\t\tdst[ 38 ] = decodeFloat16( src[ 52 ] );\n\t\t\tdst[ 39 ] = decodeFloat16( src[ 54 ] );\n\n\t\t\tdst[ 40 ] = decodeFloat16( src[ 20 ] );\n\t\t\tdst[ 41 ] = decodeFloat16( src[ 22 ] );\n\t\t\tdst[ 42 ] = decodeFloat16( src[ 33 ] );\n\t\t\tdst[ 43 ] = decodeFloat16( src[ 38 ] );\n\t\t\tdst[ 44 ] = decodeFloat16( src[ 46 ] );\n\t\t\tdst[ 45 ] = decodeFloat16( src[ 51 ] );\n\t\t\tdst[ 46 ] = decodeFloat16( src[ 55 ] );\n\t\t\tdst[ 47 ] = decodeFloat16( src[ 60 ] );\n\t\t\tdst[ 48 ] = decodeFloat16( src[ 21 ] );\n\t\t\tdst[ 49 ] = decodeFloat16( src[ 34 ] );\n\n\t\t\tdst[ 50 ] = decodeFloat16( src[ 37 ] );\n\t\t\tdst[ 51 ] = decodeFloat16( src[ 47 ] );\n\t\t\tdst[ 52 ] = decodeFloat16( src[ 50 ] );\n\t\t\tdst[ 53 ] = decodeFloat16( src[ 56 ] );\n\t\t\tdst[ 54 ] = decodeFloat16( src[ 59 ] );\n\t\t\tdst[ 55 ] = decodeFloat16( src[ 61 ] );\n\t\t\tdst[ 56 ] = decodeFloat16( src[ 35 ] );\n\t\t\tdst[ 57 ] = decodeFloat16( src[ 36 ] );\n\t\t\tdst[ 58 ] = decodeFloat16( src[ 48 ] );\n\t\t\tdst[ 59 ] = decodeFloat16( src[ 49 ] );\n\n\t\t\tdst[ 60 ] = decodeFloat16( src[ 57 ] );\n\t\t\tdst[ 61 ] = decodeFloat16( src[ 58 ] );\n\t\t\tdst[ 62 ] = decodeFloat16( src[ 62 ] );\n\t\t\tdst[ 63 ] = decodeFloat16( src[ 63 ] );\n\n\t\t}\n\n\t\tfunction dctInverse( data ) {\n\n\t\t\tconst a = 0.5 * Math.cos( 3.14159 / 4.0 );\n\t\t\tconst b = 0.5 * Math.cos( 3.14159 / 16.0 );\n\t\t\tconst c = 0.5 * Math.cos( 3.14159 / 8.0 );\n\t\t\tconst d = 0.5 * Math.cos( 3.0 * 3.14159 / 16.0 );\n\t\t\tconst e = 0.5 * Math.cos( 5.0 * 3.14159 / 16.0 );\n\t\t\tconst f = 0.5 * Math.cos( 3.0 * 3.14159 / 8.0 );\n\t\t\tconst g = 0.5 * Math.cos( 7.0 * 3.14159 / 16.0 );\n\n\t\t\tconst alpha = new Array( 4 );\n\t\t\tconst beta = new Array( 4 );\n\t\t\tconst theta = new Array( 4 );\n\t\t\tconst gamma = new Array( 4 );\n\n\t\t\tfor ( let row = 0; row < 8; ++ row ) {\n\n\t\t\t\tconst rowPtr = row * 8;\n\n\t\t\t\talpha[ 0 ] = c * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 1 ] = f * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 2 ] = c * data[ rowPtr + 6 ];\n\t\t\t\talpha[ 3 ] = f * data[ rowPtr + 6 ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ rowPtr + 1 ] + d * data[ rowPtr + 3 ] + e * data[ rowPtr + 5 ] + g * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 1 ] = d * data[ rowPtr + 1 ] - g * data[ rowPtr + 3 ] - b * data[ rowPtr + 5 ] - e * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 2 ] = e * data[ rowPtr + 1 ] - b * data[ rowPtr + 3 ] + g * data[ rowPtr + 5 ] + d * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 3 ] = g * data[ rowPtr + 1 ] - e * data[ rowPtr + 3 ] + d * data[ rowPtr + 5 ] - b * data[ rowPtr + 7 ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ rowPtr + 0 ] + data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ rowPtr + 0 ] - data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ rowPtr + 0 ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ rowPtr + 1 ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 2 ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 3 ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ rowPtr + 4 ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ rowPtr + 5 ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 6 ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 7 ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t\tfor ( let column = 0; column < 8; ++ column ) {\n\n\t\t\t\talpha[ 0 ] = c * data[ 16 + column ];\n\t\t\t\talpha[ 1 ] = f * data[ 16 + column ];\n\t\t\t\talpha[ 2 ] = c * data[ 48 + column ];\n\t\t\t\talpha[ 3 ] = f * data[ 48 + column ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ 8 + column ] + d * data[ 24 + column ] + e * data[ 40 + column ] + g * data[ 56 + column ];\n\t\t\t\tbeta[ 1 ] = d * data[ 8 + column ] - g * data[ 24 + column ] - b * data[ 40 + column ] - e * data[ 56 + column ];\n\t\t\t\tbeta[ 2 ] = e * data[ 8 + column ] - b * data[ 24 + column ] + g * data[ 40 + column ] + d * data[ 56 + column ];\n\t\t\t\tbeta[ 3 ] = g * data[ 8 + column ] - e * data[ 24 + column ] + d * data[ 40 + column ] - b * data[ 56 + column ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ column ] + data[ 32 + column ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ column ] - data[ 32 + column ] );\n\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ 0 + column ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ 8 + column ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ 16 + column ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ 24 + column ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ 32 + column ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ 40 + column ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ 48 + column ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ 56 + column ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction csc709Inverse( data ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tconst y = data[ 0 ][ i ];\n\t\t\t\tconst cb = data[ 1 ][ i ];\n\t\t\t\tconst cr = data[ 2 ][ i ];\n\n\t\t\t\tdata[ 0 ][ i ] = y + 1.5747 * cr;\n\t\t\t\tdata[ 1 ][ i ] = y - 0.1873 * cb - 0.4682 * cr;\n\t\t\t\tdata[ 2 ][ i ] = y + 1.8556 * cb;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction convertToHalf( src, dst, idx ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tdst[ idx + i ] = DataUtils.toHalfFloat( toLinear( src[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction toLinear( float ) {\n\n\t\t\tif ( float <= 1 ) {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( Math.abs( float ), 2.2 );\n\n\t\t\t} else {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( logBase, Math.abs( float ) - 1.0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uncompressRAW( info ) {\n\n\t\t\treturn new DataView( info.array.buffer, info.offset.value, info.size );\n\n\t\t}\n\n\t\tfunction uncompressRLE( info ) {\n\n\t\t\tconst compressed = info.viewer.buffer.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = new Uint8Array( decodeRunLength( compressed ) );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressZIP( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPIZ( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\n\t\t\tconst outBuffer = new Uint16Array( info.width * info.scanlineBlockSize * ( info.channels * info.type ) );\n\t\t\tconst bitmap = new Uint8Array( BITMAP_SIZE );\n\n\t\t\t// Setup channel info\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst pizChannelData = new Array( info.channels );\n\t\t\tfor ( let i = 0; i < info.channels; i ++ ) {\n\n\t\t\t\tpizChannelData[ i ] = {};\n\t\t\t\tpizChannelData[ i ][ 'start' ] = outBufferEnd;\n\t\t\t\tpizChannelData[ i ][ 'end' ] = pizChannelData[ i ][ 'start' ];\n\t\t\t\tpizChannelData[ i ][ 'nx' ] = info.width;\n\t\t\t\tpizChannelData[ i ][ 'ny' ] = info.lines;\n\t\t\t\tpizChannelData[ i ][ 'size' ] = info.type;\n\n\t\t\t\toutBufferEnd += pizChannelData[ i ].nx * pizChannelData[ i ].ny * pizChannelData[ i ].size;\n\n\t\t\t}\n\n\t\t\t// Read range compression data\n\n\t\t\tconst minNonZero = parseUint16( inDataView, inOffset );\n\t\t\tconst maxNonZero = parseUint16( inDataView, inOffset );\n\n\t\t\tif ( maxNonZero >= BITMAP_SIZE ) {\n\n\t\t\t\tthrow new Error( 'Something is wrong with PIZ_COMPRESSION BITMAP_SIZE' );\n\n\t\t\t}\n\n\t\t\tif ( minNonZero <= maxNonZero ) {\n\n\t\t\t\tfor ( let i = 0; i < maxNonZero - minNonZero + 1; i ++ ) {\n\n\t\t\t\t\tbitmap[ i + minNonZero ] = parseUint8( inDataView, inOffset );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Reverse LUT\n\t\t\tconst lut = new Uint16Array( USHORT_RANGE );\n\t\t\tconst maxValue = reverseLutFromBitmap( bitmap, lut );\n\n\t\t\tconst length = parseUint32( inDataView, inOffset );\n\n\t\t\t// Huffman decoding\n\t\t\thufUncompress( info.array, inDataView, inOffset, length, outBuffer, outBufferEnd );\n\n\t\t\t// Wavelet decoding\n\t\t\tfor ( let i = 0; i < info.channels; ++ i ) {\n\n\t\t\t\tconst cd = pizChannelData[ i ];\n\n\t\t\t\tfor ( let j = 0; j < pizChannelData[ i ].size; ++ j ) {\n\n\t\t\t\t\twav2Decode(\n\t\t\t\t\t\toutBuffer,\n\t\t\t\t\t\tcd.start + j,\n\t\t\t\t\t\tcd.nx,\n\t\t\t\t\t\tcd.size,\n\t\t\t\t\t\tcd.ny,\n\t\t\t\t\t\tcd.nx * cd.size,\n\t\t\t\t\t\tmaxValue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Expand the pixel data to their original range\n\t\t\tapplyLut( lut, outBuffer, outBufferEnd );\n\n\t\t\t// Rearrange the pixel data into the format expected by the caller.\n\t\t\tlet tmpOffset = 0;\n\t\t\tconst tmpBuffer = new Uint8Array( outBuffer.buffer.byteLength );\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.channels; c ++ ) {\n\n\t\t\t\t\tconst cd = pizChannelData[ c ];\n\n\t\t\t\t\tconst n = cd.nx * cd.size;\n\t\t\t\t\tconst cp = new Uint8Array( outBuffer.buffer, cd.end * INT16_SIZE, n * INT16_SIZE );\n\n\t\t\t\t\ttmpBuffer.set( cp, tmpOffset );\n\t\t\t\t\ttmpOffset += n * INT16_SIZE;\n\t\t\t\t\tcd.end += n;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPXR( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\n\t\t\tconst sz = info.lines * info.channels * info.width;\n\t\t\tconst tmpBuffer = ( info.type == 1 ) ? new Uint16Array( sz ) : new Uint32Array( sz );\n\n\t\t\tlet tmpBufferEnd = 0;\n\t\t\tlet writePtr = 0;\n\t\t\tconst ptr = new Array( 4 );\n\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.channels; c ++ ) {\n\n\t\t\t\t\tlet pixel = 0;\n\n\t\t\t\t\tswitch ( info.type ) {\n\n\t\t\t\t\t\tcase 1:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 1 ] + info.width;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.width; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 8 ) | rawBuffer[ ptr[ 1 ] ++ ];\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\ttmpBuffer[ writePtr ] = pixel;\n\t\t\t\t\t\t\t\twritePtr ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.width;\n\t\t\t\t\t\t\tptr[ 2 ] = ptr[ 1 ] + info.width;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 2 ] + info.width;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.width; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 24 ) | ( rawBuffer[ ptr[ 1 ] ++ ] << 16 ) | ( rawBuffer[ ptr[ 2 ] ++ ] << 8 );\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\ttmpBuffer[ writePtr ] = pixel;\n\t\t\t\t\t\t\t\twritePtr ++;\n\n\t\t\t\t\t\t\t}\n\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}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressDWA( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\t\t\tconst outBuffer = new Uint8Array( info.width * info.lines * ( info.channels * info.type * INT16_SIZE ) );\n\n\t\t\t// Read compression header information\n\t\t\tconst dwaHeader = {\n\n\t\t\t\tversion: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tdcCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleRawSize: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalAcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalDcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompression: parseInt64( inDataView, inOffset )\n\n\t\t\t};\n\n\t\t\tif ( dwaHeader.version < 2 )\n\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported' );\n\n\t\t\t// Read channel ruleset information\n\t\t\tconst channelRules = new Array();\n\t\t\tlet ruleSize = parseUint16( inDataView, inOffset ) - INT16_SIZE;\n\n\t\t\twhile ( ruleSize > 0 ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( inDataView.buffer, inOffset );\n\t\t\t\tconst value = parseUint8( inDataView, inOffset );\n\t\t\t\tconst compression = ( value >> 2 ) & 3;\n\t\t\t\tconst csc = ( value >> 4 ) - 1;\n\t\t\t\tconst index = new Int8Array( [ csc ] )[ 0 ];\n\t\t\t\tconst type = parseUint8( inDataView, inOffset );\n\n\t\t\t\tchannelRules.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tcompression: compression,\n\t\t\t\t} );\n\n\t\t\t\truleSize -= name.length + 3;\n\n\t\t\t}\n\n\t\t\t// Classify channels\n\t\t\tconst channels = EXRHeader.channels;\n\t\t\tconst channelData = new Array( info.channels );\n\n\t\t\tfor ( let i = 0; i < info.channels; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ] = {};\n\t\t\t\tconst channel = channels[ i ];\n\n\t\t\t\tcd.name = channel.name;\n\t\t\t\tcd.compression = UNKNOWN;\n\t\t\t\tcd.decoded = false;\n\t\t\t\tcd.type = channel.pixelType;\n\t\t\t\tcd.pLinear = channel.pLinear;\n\t\t\t\tcd.width = info.width;\n\t\t\t\tcd.height = info.lines;\n\n\t\t\t}\n\n\t\t\tconst cscSet = {\n\t\t\t\tidx: new Array( 3 )\n\t\t\t};\n\n\t\t\tfor ( let offset = 0; offset < info.channels; ++ offset ) {\n\n\t\t\t\tconst cd = channelData[ offset ];\n\n\t\t\t\tfor ( let i = 0; i < channelRules.length; ++ i ) {\n\n\t\t\t\t\tconst rule = channelRules[ i ];\n\n\t\t\t\t\tif ( cd.name == rule.name ) {\n\n\t\t\t\t\t\tcd.compression = rule.compression;\n\n\t\t\t\t\t\tif ( rule.index >= 0 ) {\n\n\t\t\t\t\t\t\tcscSet.idx[ rule.index ] = offset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcd.offset = offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet acBuffer, dcBuffer, rleBuffer;\n\n\t\t\t// Read DCT - AC component data\n\t\t\tif ( dwaHeader.acCompressedSize > 0 ) {\n\n\t\t\t\tswitch ( dwaHeader.acCompression ) {\n\n\t\t\t\t\tcase STATIC_HUFFMAN:\n\n\t\t\t\t\t\tacBuffer = new Uint16Array( dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\thufUncompress( info.array, inDataView, inOffset, dwaHeader.acCompressedSize, acBuffer, dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase DEFLATE:\n\n\t\t\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\t\t\tacBuffer = new Uint16Array( data.buffer );\n\t\t\t\t\t\tinOffset.value += dwaHeader.totalAcUncompressedCount;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Read DCT - DC component data\n\t\t\tif ( dwaHeader.dcCompressedSize > 0 ) {\n\n\t\t\t\tconst zlibInfo = {\n\t\t\t\t\tarray: info.array,\n\t\t\t\t\toffset: inOffset,\n\t\t\t\t\tsize: dwaHeader.dcCompressedSize\n\t\t\t\t};\n\t\t\t\tdcBuffer = new Uint16Array( uncompressZIP( zlibInfo ).buffer );\n\t\t\t\tinOffset.value += dwaHeader.dcCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Read RLE compressed data\n\t\t\tif ( dwaHeader.rleRawSize > 0 ) {\n\n\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.rleCompressedSize );\n\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\trleBuffer = decodeRunLength( data.buffer );\n\n\t\t\t\tinOffset.value += dwaHeader.rleCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Prepare outbuffer data offset\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst rowOffsets = new Array( channelData.length );\n\t\t\tfor ( let i = 0; i < rowOffsets.length; ++ i ) {\n\n\t\t\t\trowOffsets[ i ] = new Array();\n\n\t\t\t}\n\n\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\tfor ( let chan = 0; chan < channelData.length; ++ chan ) {\n\n\t\t\t\t\trowOffsets[ chan ].push( outBufferEnd );\n\t\t\t\t\toutBufferEnd += channelData[ chan ].width * info.type * INT16_SIZE;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Lossy DCT decode RGB channels\n\t\t\tlossyDctDecode( cscSet, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer );\n\n\t\t\t// Decode other channels\n\t\t\tfor ( let i = 0; i < channelData.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ];\n\n\t\t\t\tif ( cd.decoded ) continue;\n\n\t\t\t\tswitch ( cd.compression ) {\n\n\t\t\t\t\tcase RLE:\n\n\t\t\t\t\t\tlet row = 0;\n\t\t\t\t\t\tlet rleOffset = 0;\n\n\t\t\t\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\t\t\t\tlet rowOffsetBytes = rowOffsets[ i ][ row ];\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < cd.width; ++ x ) {\n\n\t\t\t\t\t\t\t\tfor ( let byte = 0; byte < INT16_SIZE * cd.type; ++ byte ) {\n\n\t\t\t\t\t\t\t\t\toutBuffer[ rowOffsetBytes ++ ] = rleBuffer[ rleOffset + byte * cd.width * cd.height ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trleOffset ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trow ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase LOSSY_DCT: // skip\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported channel compression' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( outBuffer.buffer );\n\n\t\t}\n\n\t\tfunction parseNullTerminatedString( buffer, offset ) {\n\n\t\t\tconst uintBuffer = new Uint8Array( buffer );\n\t\t\tlet endOffset = 0;\n\n\t\t\twhile ( uintBuffer[ offset.value + endOffset ] != 0 ) {\n\n\t\t\t\tendOffset += 1;\n\n\t\t\t}\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tuintBuffer.slice( offset.value, offset.value + endOffset )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + endOffset + 1;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseFixedLengthString( buffer, offset, size ) {\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tnew Uint8Array( buffer ).slice( offset.value, offset.value + size )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + size;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseRational( dataView, offset ) {\n\n\t\t\tconst x = parseInt32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseTimecode( dataView, offset ) {\n\n\t\t\tconst x = parseUint32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseInt32( dataView, offset ) {\n\n\t\t\tconst Int32 = dataView.getInt32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Int32;\n\n\t\t}\n\n\t\tfunction parseUint32( dataView, offset ) {\n\n\t\t\tconst Uint32 = dataView.getUint32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Uint32;\n\n\t\t}\n\n\t\tfunction parseUint8Array( uInt8Array, offset ) {\n\n\t\t\tconst Uint8 = uInt8Array[ offset.value ];\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tfunction parseUint8( dataView, offset ) {\n\n\t\t\tconst Uint8 = dataView.getUint8( offset.value );\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tconst parseInt64 = function ( dataView, offset ) {\n\n\t\t\tlet int;\n\n\t\t\tif ( 'getBigInt64' in DataView.prototype ) {\n\n\t\t\t\tint = Number( dataView.getBigInt64( offset.value, true ) );\n\n\t\t\t} else {\n\n\t\t\t\tint = dataView.getUint32( offset.value + 4, true ) + Number( dataView.getUint32( offset.value, true ) << 32 );\n\n\t\t\t}\n\n\t\t\toffset.value += ULONG_SIZE;\n\n\t\t\treturn int;\n\n\t\t};\n\n\t\tfunction parseFloat32( dataView, offset ) {\n\n\t\t\tconst float = dataView.getFloat32( offset.value, true );\n\n\t\t\toffset.value += FLOAT32_SIZE;\n\n\t\t\treturn float;\n\n\t\t}\n\n\t\tfunction decodeFloat32( dataView, offset ) {\n\n\t\t\treturn DataUtils.toHalfFloat( parseFloat32( dataView, offset ) );\n\n\t\t}\n\n\t\t// https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript\n\t\tfunction decodeFloat16( binary ) {\n\n\t\t\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\t\t\tfraction = binary & 0x03FF;\n\n\t\t\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\t\t\texponent ?\n\t\t\t\t\t(\n\t\t\t\t\t\texponent === 0x1F ?\n\t\t\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t\t\t) :\n\t\t\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t\t\t);\n\n\t\t}\n\n\t\tfunction parseUint16( dataView, offset ) {\n\n\t\t\tconst Uint16 = dataView.getUint16( offset.value, true );\n\n\t\t\toffset.value += INT16_SIZE;\n\n\t\t\treturn Uint16;\n\n\t\t}\n\n\t\tfunction parseFloat16( buffer, offset ) {\n\n\t\t\treturn decodeFloat16( parseUint16( buffer, offset ) );\n\n\t\t}\n\n\t\tfunction parseChlist( dataView, buffer, offset, size ) {\n\n\t\t\tconst startOffset = offset.value;\n\t\t\tconst channels = [];\n\n\t\t\twhile ( offset.value < ( startOffset + size - 1 ) ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( buffer, offset );\n\t\t\t\tconst pixelType = parseInt32( dataView, offset );\n\t\t\t\tconst pLinear = parseUint8( dataView, offset );\n\t\t\t\toffset.value += 3; // reserved, three chars\n\t\t\t\tconst xSampling = parseInt32( dataView, offset );\n\t\t\t\tconst ySampling = parseInt32( dataView, offset );\n\n\t\t\t\tchannels.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tpixelType: pixelType,\n\t\t\t\t\tpLinear: pLinear,\n\t\t\t\t\txSampling: xSampling,\n\t\t\t\t\tySampling: ySampling\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\toffset.value += 1;\n\n\t\t\treturn channels;\n\n\t\t}\n\n\t\tfunction parseChromaticities( dataView, offset ) {\n\n\t\t\tconst redX = parseFloat32( dataView, offset );\n\t\t\tconst redY = parseFloat32( dataView, offset );\n\t\t\tconst greenX = parseFloat32( dataView, offset );\n\t\t\tconst greenY = parseFloat32( dataView, offset );\n\t\t\tconst blueX = parseFloat32( dataView, offset );\n\t\t\tconst blueY = parseFloat32( dataView, offset );\n\t\t\tconst whiteX = parseFloat32( dataView, offset );\n\t\t\tconst whiteY = parseFloat32( dataView, offset );\n\n\t\t\treturn { redX: redX, redY: redY, greenX: greenX, greenY: greenY, blueX: blueX, blueY: blueY, whiteX: whiteX, whiteY: whiteY };\n\n\t\t}\n\n\t\tfunction parseCompression( dataView, offset ) {\n\n\t\t\tconst compressionCodes = [\n\t\t\t\t'NO_COMPRESSION',\n\t\t\t\t'RLE_COMPRESSION',\n\t\t\t\t'ZIPS_COMPRESSION',\n\t\t\t\t'ZIP_COMPRESSION',\n\t\t\t\t'PIZ_COMPRESSION',\n\t\t\t\t'PXR24_COMPRESSION',\n\t\t\t\t'B44_COMPRESSION',\n\t\t\t\t'B44A_COMPRESSION',\n\t\t\t\t'DWAA_COMPRESSION',\n\t\t\t\t'DWAB_COMPRESSION'\n\t\t\t];\n\n\t\t\tconst compression = parseUint8( dataView, offset );\n\n\t\t\treturn compressionCodes[ compression ];\n\n\t\t}\n\n\t\tfunction parseBox2i( dataView, offset ) {\n\n\t\t\tconst xMin = parseUint32( dataView, offset );\n\t\t\tconst yMin = parseUint32( dataView, offset );\n\t\t\tconst xMax = parseUint32( dataView, offset );\n\t\t\tconst yMax = parseUint32( dataView, offset );\n\n\t\t\treturn { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };\n\n\t\t}\n\n\t\tfunction parseLineOrder( dataView, offset ) {\n\n\t\t\tconst lineOrders = [\n\t\t\t\t'INCREASING_Y'\n\t\t\t];\n\n\t\t\tconst lineOrder = parseUint8( dataView, offset );\n\n\t\t\treturn lineOrders[ lineOrder ];\n\n\t\t}\n\n\t\tfunction parseV2f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseV3f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\t\t\tconst z = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y, z ];\n\n\t\t}\n\n\t\tfunction parseValue( dataView, buffer, offset, type, size ) {\n\n\t\t\tif ( type === 'string' || type === 'stringvector' || type === 'iccProfile' ) {\n\n\t\t\t\treturn parseFixedLengthString( buffer, offset, size );\n\n\t\t\t} else if ( type === 'chlist' ) {\n\n\t\t\t\treturn parseChlist( dataView, buffer, offset, size );\n\n\t\t\t} else if ( type === 'chromaticities' ) {\n\n\t\t\t\treturn parseChromaticities( dataView, offset );\n\n\t\t\t} else if ( type === 'compression' ) {\n\n\t\t\t\treturn parseCompression( dataView, offset );\n\n\t\t\t} else if ( type === 'box2i' ) {\n\n\t\t\t\treturn parseBox2i( dataView, offset );\n\n\t\t\t} else if ( type === 'lineOrder' ) {\n\n\t\t\t\treturn parseLineOrder( dataView, offset );\n\n\t\t\t} else if ( type === 'float' ) {\n\n\t\t\t\treturn parseFloat32( dataView, offset );\n\n\t\t\t} else if ( type === 'v2f' ) {\n\n\t\t\t\treturn parseV2f( dataView, offset );\n\n\t\t\t} else if ( type === 'v3f' ) {\n\n\t\t\t\treturn parseV3f( dataView, offset );\n\n\t\t\t} else if ( type === 'int' ) {\n\n\t\t\t\treturn parseInt32( dataView, offset );\n\n\t\t\t} else if ( type === 'rational' ) {\n\n\t\t\t\treturn parseRational( dataView, offset );\n\n\t\t\t} else if ( type === 'timecode' ) {\n\n\t\t\t\treturn parseTimecode( dataView, offset );\n\n\t\t\t} else if ( type === 'preview' ) {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn 'skipped';\n\n\t\t\t} else {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseHeader( dataView, buffer, offset ) {\n\n\t\t\tconst EXRHeader = {};\n\n\t\t\tif ( dataView.getUint32( 0, true ) != 20000630 ) { // magic\n\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: provided file doesn\\'t appear to be in OpenEXR format.' );\n\n\t\t\t}\n\n\t\t\tEXRHeader.version = dataView.getUint8( 4 );\n\n\t\t\tconst spec = dataView.getUint8( 5 ); // fullMask\n\n\t\t\tEXRHeader.spec = {\n\t\t\t\tsingleTile: !! ( spec & 2 ),\n\t\t\t\tlongName: !! ( spec & 4 ),\n\t\t\t\tdeepFormat: !! ( spec & 8 ),\n\t\t\t\tmultiPart: !! ( spec & 16 ),\n\t\t\t};\n\n\t\t\t// start of header\n\n\t\t\toffset.value = 8; // start at 8 - after pre-amble\n\n\t\t\tlet keepReading = true;\n\n\t\t\twhile ( keepReading ) {\n\n\t\t\t\tconst attributeName = parseNullTerminatedString( buffer, offset );\n\n\t\t\t\tif ( attributeName == 0 ) {\n\n\t\t\t\t\tkeepReading = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst attributeType = parseNullTerminatedString( buffer, offset );\n\t\t\t\t\tconst attributeSize = parseUint32( dataView, offset );\n\t\t\t\t\tconst attributeValue = parseValue( dataView, buffer, offset, attributeType, attributeSize );\n\n\t\t\t\t\tif ( attributeValue === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( `EXRLoader.parse: skipped unknown header attribute type \\'${attributeType}\\'.` );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tEXRHeader[ attributeName ] = attributeValue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( spec & ~ 0x04 ) != 0 ) { // unsupported tiled, deep-image, multi-part\n\n\t\t\t\tconsole.error( 'EXRHeader:', EXRHeader );\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: provided file is currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn EXRHeader;\n\n\t\t}\n\n\t\tfunction setupDecoder( EXRHeader, dataView, uInt8Array, offset, outputType ) {\n\n\t\t\tconst EXRDecoder = {\n\t\t\t\tsize: 0,\n\t\t\t\tviewer: dataView,\n\t\t\t\tarray: uInt8Array,\n\t\t\t\toffset: offset,\n\t\t\t\twidth: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,\n\t\t\t\theight: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,\n\t\t\t\tchannels: EXRHeader.channels.length,\n\t\t\t\tbytesPerLine: null,\n\t\t\t\tlines: null,\n\t\t\t\tinputSize: null,\n\t\t\t\ttype: EXRHeader.channels[ 0 ].pixelType,\n\t\t\t\tuncompress: null,\n\t\t\t\tgetter: null,\n\t\t\t\tformat: null,\n\t\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\t};\n\n\t\t\tswitch ( EXRHeader.compression ) {\n\n\t\t\t\tcase 'NO_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRAW;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RLE_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIPS_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIP_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PIZ_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPIZ;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PXR24_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPXR;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAA_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAB_COMPRESSION':\n\t\t\t\t\tEXRDecoder.lines = 256;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.scanlineBlockSize = EXRDecoder.lines;\n\n\t\t\tif ( EXRDecoder.type == 1 ) {\n\n\t\t\t\t// half\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseUint16;\n\t\t\t\t\t\tEXRDecoder.inputSize = INT16_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( EXRDecoder.type == 2 ) {\n\n\t\t\t\t// float\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = decodeFloat32;\n\t\t\t\t\t\tEXRDecoder.inputSize = FLOAT32_SIZE;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.blockCount = ( EXRHeader.dataWindow.yMax + 1 ) / EXRDecoder.scanlineBlockSize;\n\n\t\t\tfor ( let i = 0; i < EXRDecoder.blockCount; i ++ )\n\t\t\t\tparseInt64( dataView, offset ); // scanlineOffset\n\n\t\t\t// we should be passed the scanline offset table, ready to start reading pixel data.\n\n\t\t\t// RGB images will be converted to RGBA format, preventing software emulation in select devices.\n\t\t\tEXRDecoder.outputChannels = ( ( EXRDecoder.channels == 3 ) ? 4 : EXRDecoder.channels );\n\t\t\tconst size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;\n\n\t\t\tswitch ( outputType ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Float32Array( size );\n\n\t\t\t\t\t// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten\n\t\t\t\t\tif ( EXRDecoder.channels < EXRDecoder.outputChannels )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 1, 0, size );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Uint16Array( size );\n\n\t\t\t\t\tif ( EXRDecoder.channels < EXRDecoder.outputChannels )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'THREE.EXRLoader: unsupported type: ', outputType );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tEXRDecoder.bytesPerLine = EXRDecoder.width * EXRDecoder.inputSize * EXRDecoder.channels;\n\n\t\t\tif ( EXRDecoder.outputChannels == 4 ) {\n\n\t\t\t\tEXRDecoder.format = RGBAFormat;\n\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.format = RedFormat;\n\t\t\t\tEXRDecoder.colorSpace = NoColorSpace;\n\n\t\t\t}\n\n\t\t\treturn EXRDecoder;\n\n\t\t}\n\n\t\t// start parsing file [START]\n\n\t\tconst bufferDataView = new DataView( buffer );\n\t\tconst uInt8Array = new Uint8Array( buffer );\n\t\tconst offset = { value: 0 };\n\n\t\t// get header information and validate format.\n\t\tconst EXRHeader = parseHeader( bufferDataView, buffer, offset );\n\n\t\t// get input compression information and prepare decoding.\n\t\tconst EXRDecoder = setupDecoder( EXRHeader, bufferDataView, uInt8Array, offset, this.type );\n\n\t\tconst tmpOffset = { value: 0 };\n\t\tconst channelOffsets = { R: 0, G: 1, B: 2, A: 3, Y: 0 };\n\n\t\tfor ( let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.scanlineBlockSize; scanlineBlockIdx ++ ) {\n\n\t\t\tconst line = parseUint32( bufferDataView, offset ); // line_no\n\t\t\tEXRDecoder.size = parseUint32( bufferDataView, offset ); // data_len\n\t\t\tEXRDecoder.lines = ( ( line + EXRDecoder.scanlineBlockSize > EXRDecoder.height ) ? ( EXRDecoder.height - line ) : EXRDecoder.scanlineBlockSize );\n\n\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * EXRDecoder.bytesPerLine;\n\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\tfor ( let line_y = 0; line_y < EXRDecoder.scanlineBlockSize; line_y ++ ) {\n\n\t\t\t\tconst true_y = line_y + scanlineBlockIdx * EXRDecoder.scanlineBlockSize;\n\t\t\t\tif ( true_y >= EXRDecoder.height ) break;\n\n\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.channels; channelID ++ ) {\n\n\t\t\t\t\tconst cOff = channelOffsets[ EXRHeader.channels[ channelID ].name ];\n\n\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.width; x ++ ) {\n\n\t\t\t\t\t\ttmpOffset.value = ( line_y * ( EXRDecoder.channels * EXRDecoder.width ) + channelID * EXRDecoder.width + x ) * EXRDecoder.inputSize;\n\t\t\t\t\t\tconst outIndex = ( EXRDecoder.height - 1 - true_y ) * ( EXRDecoder.width * EXRDecoder.outputChannels ) + x * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\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 {\n\t\t\theader: EXRHeader,\n\t\t\twidth: EXRDecoder.width,\n\t\t\theight: EXRDecoder.height,\n\t\t\tdata: EXRDecoder.byteArray,\n\t\t\tformat: EXRDecoder.format,\n\t\t\tcolorSpace: EXRDecoder.colorSpace,\n\t\t\ttype: this.type,\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\ttexture.colorSpace = texData.colorSpace;\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { EXRLoader };\n","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* return codes for rgbe routines */\n\t\t\t//RGBE_RETURN_SUCCESS = 0,\n\t\t\tRGBE_RETURN_FAILURE = - 1,\n\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: console.error( 'THREE.RGBELoader Read Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_write_error: console.error( 'THREE.RGBELoader Write Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_format_error: console.error( 'THREE.RGBELoader Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: console.error( 'THREE.RGBELoader: Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn RGBE_RETURN_FAILURE;\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tif ( RGBE_RETURN_FAILURE !== rgbe_header_info ) {\n\n\t\t\tconst w = rgbe_header_info.width,\n\t\t\t\th = rgbe_header_info.height,\n\t\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\t\t\tif ( RGBE_RETURN_FAILURE !== image_rgba_data ) {\n\n\t\t\t\tlet data, type;\n\t\t\t\tlet numElements;\n\n\t\t\t\tswitch ( this.type ) {\n\n\t\t\t\t\tcase FloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = floatArray;\n\t\t\t\t\t\ttype = FloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = halfArray;\n\t\t\t\t\t\ttype = HalfFloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.error( 'THREE.RGBELoader: unsupported type: ', this.type );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\twidth: w, height: h,\n\t\t\t\t\tdata: data,\n\t\t\t\t\theader: rgbe_header_info.string,\n\t\t\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\t\t\texposure: rgbe_header_info.exposure,\n\t\t\t\t\ttype: type\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\tthis.isPass = true;\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nconst _geometry = new BufferGeometry();\n_geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n_geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tname: 'CopyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tVector2\n} from 'three';\n\n/**\n * NVIDIA FXAA by Timothy Lottes\n * https://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf\n * - WebGL port by @supereggbert\n * http://www.glge.org/demos/fxaa/\n * Further improved by Daniel Sturk\n */\n\nconst FXAAShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: `\n\tprecision highp float;\n\n\tuniform sampler2D tDiffuse;\n\n\tuniform vec2 resolution;\n\n\tvarying vec2 vUv;\n\n\t// FXAA 3.11 implementation by NVIDIA, ported to WebGL by Agost Biro (biro@archilogic.com)\n\n\t//----------------------------------------------------------------------------------\n\t// File: es3-kepler\\FXAA\\assets\\shaders/FXAA_DefaultES.frag\n\t// SDK Version: v3.00\n\t// Email: gameworks@nvidia.com\n\t// Site: http://developer.nvidia.com/\n\t//\n\t// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n\t//\n\t// Redistribution and use in source and binary forms, with or without\n\t// modification, are permitted provided that the following conditions\n\t// are met:\n\t// * Redistributions of source code must retain the above copyright\n\t// notice, this list of conditions and the following disclaimer.\n\t// * Redistributions in binary form must reproduce the above copyright\n\t// notice, this list of conditions and the following disclaimer in the\n\t// documentation and/or other materials provided with the distribution.\n\t// * Neither the name of NVIDIA CORPORATION nor the names of its\n\t// contributors may be used to endorse or promote products derived\n\t// from this software without specific prior written permission.\n\t//\n\t// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY\n\t// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\t// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n\t// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n\t// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n\t// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n\t// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n\t// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n\t// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t//\n\t//----------------------------------------------------------------------------------\n\n\t#ifndef FXAA_DISCARD\n\t\t\t//\n\t\t\t// Only valid for PC OpenGL currently.\n\t\t\t// Probably will not work when FXAA_GREEN_AS_LUMA = 1.\n\t\t\t//\n\t\t\t// 1 = Use discard on pixels which don't need AA.\n\t\t\t// For APIs which enable concurrent TEX+ROP from same surface.\n\t\t\t// 0 = Return unchanged color on pixels which don't need AA.\n\t\t\t//\n\t\t\t#define FXAA_DISCARD 0\n\t#endif\n\n\t/*--------------------------------------------------------------------------*/\n\t#define FxaaTexTop(t, p) texture2D(t, p, -100.0)\n\t#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), -100.0)\n\t/*--------------------------------------------------------------------------*/\n\n\t#define NUM_SAMPLES 5\n\n\t// assumes colors have premultipliedAlpha, so that the calculated color contrast is scaled by alpha\n\tfloat contrast( vec4 a, vec4 b ) {\n\t\t\tvec4 diff = abs( a - b );\n\t\t\treturn max( max( max( diff.r, diff.g ), diff.b ), diff.a );\n\t}\n\n\t/*============================================================================\n\n\t\t\t\t\t\t\t\t\tFXAA3 QUALITY - PC\n\n\t============================================================================*/\n\n\t/*--------------------------------------------------------------------------*/\n\tvec4 FxaaPixelShader(\n\t\t\tvec2 posM,\n\t\t\tsampler2D tex,\n\t\t\tvec2 fxaaQualityRcpFrame,\n\t\t\tfloat fxaaQualityEdgeThreshold,\n\t\t\tfloat fxaaQualityinvEdgeThreshold\n\t) {\n\t\t\tvec4 rgbaM = FxaaTexTop(tex, posM);\n\t\t\tvec4 rgbaS = FxaaTexOff(tex, posM, vec2( 0.0, 1.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaE = FxaaTexOff(tex, posM, vec2( 1.0, 0.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaN = FxaaTexOff(tex, posM, vec2( 0.0,-1.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaW = FxaaTexOff(tex, posM, vec2(-1.0, 0.0), fxaaQualityRcpFrame.xy);\n\t\t\t// . S .\n\t\t\t// W M E\n\t\t\t// . N .\n\n\t\t\tbool earlyExit = max( max( max(\n\t\t\t\t\tcontrast( rgbaM, rgbaN ),\n\t\t\t\t\tcontrast( rgbaM, rgbaS ) ),\n\t\t\t\t\tcontrast( rgbaM, rgbaE ) ),\n\t\t\t\t\tcontrast( rgbaM, rgbaW ) )\n\t\t\t\t\t< fxaaQualityEdgeThreshold;\n\t\t\t// . 0 .\n\t\t\t// 0 0 0\n\t\t\t// . 0 .\n\n\t\t\t#if (FXAA_DISCARD == 1)\n\t\t\t\t\tif(earlyExit) FxaaDiscard;\n\t\t\t#else\n\t\t\t\t\tif(earlyExit) return rgbaM;\n\t\t\t#endif\n\n\t\t\tfloat contrastN = contrast( rgbaM, rgbaN );\n\t\t\tfloat contrastS = contrast( rgbaM, rgbaS );\n\t\t\tfloat contrastE = contrast( rgbaM, rgbaE );\n\t\t\tfloat contrastW = contrast( rgbaM, rgbaW );\n\n\t\t\tfloat relativeVContrast = ( contrastN + contrastS ) - ( contrastE + contrastW );\n\t\t\trelativeVContrast *= fxaaQualityinvEdgeThreshold;\n\n\t\t\tbool horzSpan = relativeVContrast > 0.;\n\t\t\t// . 1 .\n\t\t\t// 0 0 0\n\t\t\t// . 1 .\n\n\t\t\t// 45 deg edge detection and corners of objects, aka V/H contrast is too similar\n\t\t\tif( abs( relativeVContrast ) < .3 ) {\n\t\t\t\t\t// locate the edge\n\t\t\t\t\tvec2 dirToEdge;\n\t\t\t\t\tdirToEdge.x = contrastE > contrastW ? 1. : -1.;\n\t\t\t\t\tdirToEdge.y = contrastS > contrastN ? 1. : -1.;\n\t\t\t\t\t// . 2 . . 1 .\n\t\t\t\t\t// 1 0 2 ~= 0 0 1\n\t\t\t\t\t// . 1 . . 0 .\n\n\t\t\t\t\t// tap 2 pixels and see which ones are \"outside\" the edge, to\n\t\t\t\t\t// determine if the edge is vertical or horizontal\n\n\t\t\t\t\tvec4 rgbaAlongH = FxaaTexOff(tex, posM, vec2( dirToEdge.x, -dirToEdge.y ), fxaaQualityRcpFrame.xy);\n\t\t\t\t\tfloat matchAlongH = contrast( rgbaM, rgbaAlongH );\n\t\t\t\t\t// . 1 .\n\t\t\t\t\t// 0 0 1\n\t\t\t\t\t// . 0 H\n\n\t\t\t\t\tvec4 rgbaAlongV = FxaaTexOff(tex, posM, vec2( -dirToEdge.x, dirToEdge.y ), fxaaQualityRcpFrame.xy);\n\t\t\t\t\tfloat matchAlongV = contrast( rgbaM, rgbaAlongV );\n\t\t\t\t\t// V 1 .\n\t\t\t\t\t// 0 0 1\n\t\t\t\t\t// . 0 .\n\n\t\t\t\t\trelativeVContrast = matchAlongV - matchAlongH;\n\t\t\t\t\trelativeVContrast *= fxaaQualityinvEdgeThreshold;\n\n\t\t\t\t\tif( abs( relativeVContrast ) < .3 ) { // 45 deg edge\n\t\t\t\t\t\t\t// 1 1 .\n\t\t\t\t\t\t\t// 0 0 1\n\t\t\t\t\t\t\t// . 0 1\n\n\t\t\t\t\t\t\t// do a simple blur\n\t\t\t\t\t\t\treturn mix(\n\t\t\t\t\t\t\t\t\trgbaM,\n\t\t\t\t\t\t\t\t\t(rgbaN + rgbaS + rgbaE + rgbaW) * .25,\n\t\t\t\t\t\t\t\t\t.4\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\thorzSpan = relativeVContrast > 0.;\n\t\t\t}\n\n\t\t\tif(!horzSpan) rgbaN = rgbaW;\n\t\t\tif(!horzSpan) rgbaS = rgbaE;\n\t\t\t// . 0 . 1\n\t\t\t// 1 0 1 -> 0\n\t\t\t// . 0 . 1\n\n\t\t\tbool pairN = contrast( rgbaM, rgbaN ) > contrast( rgbaM, rgbaS );\n\t\t\tif(!pairN) rgbaN = rgbaS;\n\n\t\t\tvec2 offNP;\n\t\t\toffNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\n\t\t\toffNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\n\n\t\t\tbool doneN = false;\n\t\t\tbool doneP = false;\n\n\t\t\tfloat nDist = 0.;\n\t\t\tfloat pDist = 0.;\n\n\t\t\tvec2 posN = posM;\n\t\t\tvec2 posP = posM;\n\n\t\t\tint iterationsUsed = 0;\n\t\t\tint iterationsUsedN = 0;\n\t\t\tint iterationsUsedP = 0;\n\t\t\tfor( int i = 0; i < NUM_SAMPLES; i++ ) {\n\t\t\t\t\titerationsUsed = i;\n\n\t\t\t\t\tfloat increment = float(i + 1);\n\n\t\t\t\t\tif(!doneN) {\n\t\t\t\t\t\t\tnDist += increment;\n\t\t\t\t\t\t\tposN = posM + offNP * nDist;\n\t\t\t\t\t\t\tvec4 rgbaEndN = FxaaTexTop(tex, posN.xy);\n\t\t\t\t\t\t\tdoneN = contrast( rgbaEndN, rgbaM ) > contrast( rgbaEndN, rgbaN );\n\t\t\t\t\t\t\titerationsUsedN = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!doneP) {\n\t\t\t\t\t\t\tpDist += increment;\n\t\t\t\t\t\t\tposP = posM - offNP * pDist;\n\t\t\t\t\t\t\tvec4 rgbaEndP = FxaaTexTop(tex, posP.xy);\n\t\t\t\t\t\t\tdoneP = contrast( rgbaEndP, rgbaM ) > contrast( rgbaEndP, rgbaN );\n\t\t\t\t\t\t\titerationsUsedP = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(doneN || doneP) break;\n\t\t\t}\n\n\n\t\t\tif ( !doneP && !doneN ) return rgbaM; // failed to find end of edge\n\n\t\t\tfloat dist = min(\n\t\t\t\t\tdoneN ? float( iterationsUsedN ) / float( NUM_SAMPLES - 1 ) : 1.,\n\t\t\t\t\tdoneP ? float( iterationsUsedP ) / float( NUM_SAMPLES - 1 ) : 1.\n\t\t\t);\n\n\t\t\t// hacky way of reduces blurriness of mostly diagonal edges\n\t\t\t// but reduces AA quality\n\t\t\tdist = pow(dist, .5);\n\n\t\t\tdist = 1. - dist;\n\n\t\t\treturn mix(\n\t\t\t\t\trgbaM,\n\t\t\t\t\trgbaN,\n\t\t\t\t\tdist * .5\n\t\t\t);\n\t}\n\n\tvoid main() {\n\t\t\tconst float edgeDetectionQuality = .2;\n\t\t\tconst float invEdgeDetectionQuality = 1. / edgeDetectionQuality;\n\n\t\t\tgl_FragColor = FxaaPixelShader(\n\t\t\t\t\tvUv,\n\t\t\t\t\ttDiffuse,\n\t\t\t\t\tresolution,\n\t\t\t\t\tedgeDetectionQuality, // [0,1] contrast needed, otherwise early discard\n\t\t\t\t\tinvEdgeDetectionQuality\n\t\t\t);\n\n\t}\n\t`\n\n};\n\nexport { FXAAShader };\n","import {\n\tBackSide,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMesh,\n\tMeshBasicMaterial\n} from 'three';\n\n/**\n * This helper must be added as a child of the light\n */\n\nclass RectAreaLightHelper extends Line {\n\n\tconstructor( light, color ) {\n\n\t\tconst positions = [ 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\tconst material = new LineBasicMaterial( { fog: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\t\tthis.color = color; // optional hardwired color for the helper\n\t\tthis.type = 'RectAreaLightHelper';\n\n\t\t//\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( { side: BackSide, fog: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld() {\n\n\t\tthis.scale.set( 0.5 * this.light.width, 0.5 * this.light.height, 1 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\t\t\tthis.children[ 0 ].material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// prevent hue shift\n\t\t\tconst c = this.material.color;\n\t\t\tconst max = Math.max( c.r, c.g, c.b );\n\t\t\tif ( max > 1 ) c.multiplyScalar( 1 / max );\n\n\t\t\tthis.children[ 0 ].material.color.copy( this.material.color );\n\n\t\t}\n\n\t\t// ignore world scale on light\n\t\tthis.matrixWorld.extractRotation( this.light.matrixWorld ).scale( this.scale ).copyPosition( this.light.matrixWorld );\n\n\t\tthis.children[ 0 ].matrixWorld.copy( this.matrixWorld );\n\n\t}\n\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\nexport { RectAreaLightHelper };\n","/**\n * postprocessing v6.33.0 build Fri Aug 11 2023\n * https://github.com/pmndrs/postprocessing\n * Copyright 2015-2023 Raoul van Rüschen\n * @license Zlib\n */\n\n// src/core/Disposable.js\nvar Disposable = class {\n /**\n * Frees internal resources.\n */\n dispose() {\n }\n};\n\n// src/core/EffectComposer.js\nimport {\n DepthStencilFormat,\n DepthTexture,\n LinearFilter as LinearFilter2,\n UnsignedByteType as UnsignedByteType11,\n UnsignedIntType,\n UnsignedInt248Type,\n Vector2 as Vector216,\n WebGLRenderTarget as WebGLRenderTarget13\n} from \"three\";\n\n// src/passes/AdaptiveLuminancePass.js\nimport { NearestFilter, WebGLRenderTarget as WebGLRenderTarget3 } from \"three\";\n\n// src/materials/AdaptiveLuminanceMaterial.js\nimport { NoBlending, ShaderMaterial, Uniform } from \"three\";\n\n// src/materials/glsl/adaptive-luminance.frag\nvar adaptive_luminance_default = \"#include <packing>\\n#define packFloatToRGBA(v) packDepthToRGBA(v)\\n#define unpackRGBAToFloat(v) unpackRGBAToDepth(v)\\nuniform lowp sampler2D luminanceBuffer0;uniform lowp sampler2D luminanceBuffer1;uniform float minLuminance;uniform float deltaTime;uniform float tau;varying vec2 vUv;void main(){float l0=unpackRGBAToFloat(texture2D(luminanceBuffer0,vUv));\\n#if __VERSION__ < 300\\nfloat l1=texture2DLodEXT(luminanceBuffer1,vUv,MIP_LEVEL_1X1).r;\\n#else\\nfloat l1=textureLod(luminanceBuffer1,vUv,MIP_LEVEL_1X1).r;\\n#endif\\nl0=max(minLuminance,l0);l1=max(minLuminance,l1);float adaptedLum=l0+(l1-l0)*(1.0-exp(-deltaTime*tau));gl_FragColor=(adaptedLum==1.0)?vec4(1.0):packFloatToRGBA(adaptedLum);}\";\n\n// src/materials/glsl/common.vert\nvar common_default = \"varying vec2 vUv;void main(){vUv=position.xy*0.5+0.5;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/AdaptiveLuminanceMaterial.js\nvar AdaptiveLuminanceMaterial = class extends ShaderMaterial {\n /**\n * Constructs a new adaptive luminance material.\n */\n constructor() {\n super({\n name: \"AdaptiveLuminanceMaterial\",\n defines: {\n MIP_LEVEL_1X1: \"0.0\"\n },\n uniforms: {\n luminanceBuffer0: new Uniform(null),\n luminanceBuffer1: new Uniform(null),\n minLuminance: new Uniform(0.01),\n deltaTime: new Uniform(0),\n tau: new Uniform(1)\n },\n extensions: {\n shaderTextureLOD: true\n },\n blending: NoBlending,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: adaptive_luminance_default,\n vertexShader: common_default\n });\n }\n /**\n * The primary luminance buffer that contains the downsampled average luminance.\n *\n * @type {Texture}\n */\n set luminanceBuffer0(value) {\n this.uniforms.luminanceBuffer0.value = value;\n }\n /**\n * Sets the primary luminance buffer that contains the downsampled average luminance.\n *\n * @deprecated Use luminanceBuffer0 instead.\n * @param {Texture} value - The buffer.\n */\n setLuminanceBuffer0(value) {\n this.uniforms.luminanceBuffer0.value = value;\n }\n /**\n * The secondary luminance buffer.\n *\n * @type {Texture}\n */\n set luminanceBuffer1(value) {\n this.uniforms.luminanceBuffer1.value = value;\n }\n /**\n * Sets the secondary luminance buffer.\n *\n * @deprecated Use luminanceBuffer1 instead.\n * @param {Texture} value - The buffer.\n */\n setLuminanceBuffer1(value) {\n this.uniforms.luminanceBuffer1.value = value;\n }\n /**\n * The 1x1 mipmap level.\n *\n * This level is used to identify the smallest mipmap of the primary luminance buffer.\n *\n * @type {Number}\n */\n set mipLevel1x1(value) {\n this.defines.MIP_LEVEL_1X1 = value.toFixed(1);\n this.needsUpdate = true;\n }\n /**\n * Sets the 1x1 mipmap level.\n *\n * @deprecated Use mipLevel1x1 instead.\n * @param {Number} value - The level.\n */\n setMipLevel1x1(value) {\n this.mipLevel1x1 = value;\n }\n /**\n * The delta time.\n *\n * @type {Number}\n */\n set deltaTime(value) {\n this.uniforms.deltaTime.value = value;\n }\n /**\n * Sets the delta time.\n *\n * @deprecated Use deltaTime instead.\n * @param {Number} value - The delta time.\n */\n setDeltaTime(value) {\n this.uniforms.deltaTime.value = value;\n }\n /**\n * The lowest possible luminance value.\n *\n * @type {Number}\n */\n get minLuminance() {\n return this.uniforms.minLuminance.value;\n }\n set minLuminance(value) {\n this.uniforms.minLuminance.value = value;\n }\n /**\n * Returns the lowest possible luminance value.\n *\n * @deprecated Use minLuminance instead.\n * @return {Number} The minimum luminance.\n */\n getMinLuminance() {\n return this.uniforms.minLuminance.value;\n }\n /**\n * Sets the minimum luminance.\n *\n * @deprecated Use minLuminance instead.\n * @param {Number} value - The minimum luminance.\n */\n setMinLuminance(value) {\n this.uniforms.minLuminance.value = value;\n }\n /**\n * The luminance adaptation rate.\n *\n * @type {Number}\n */\n get adaptationRate() {\n return this.uniforms.tau.value;\n }\n set adaptationRate(value) {\n this.uniforms.tau.value = value;\n }\n /**\n * Returns the luminance adaptation rate.\n *\n * @deprecated Use adaptationRate instead.\n * @return {Number} The adaptation rate.\n */\n getAdaptationRate() {\n return this.uniforms.tau.value;\n }\n /**\n * Sets the luminance adaptation rate.\n *\n * @deprecated Use adaptationRate instead.\n * @param {Number} value - The adaptation rate.\n */\n setAdaptationRate(value) {\n this.uniforms.tau.value = value;\n }\n};\n\n// src/materials/BokehMaterial.js\nimport { NoBlending as NoBlending2, ShaderMaterial as ShaderMaterial2, Uniform as Uniform2, Vector2 } from \"three\";\n\n// src/materials/glsl/convolution.bokeh.frag\nvar convolution_bokeh_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#if PASS == 1\\nuniform vec4 kernel64[32];\\n#else\\nuniform vec4 kernel16[8];\\n#endif\\nuniform lowp sampler2D cocBuffer;uniform vec2 texelSize;uniform float scale;varying vec2 vUv;void main(){\\n#ifdef FOREGROUND\\nvec2 CoCNearFar=texture2D(cocBuffer,vUv).rg;float CoC=CoCNearFar.r*scale;\\n#else\\nfloat CoC=texture2D(cocBuffer,vUv).g*scale;\\n#endif\\nif(CoC==0.0){gl_FragColor=texture2D(inputBuffer,vUv);}else{\\n#ifdef FOREGROUND\\nvec2 step=texelSize*max(CoC,CoCNearFar.g*scale);\\n#else\\nvec2 step=texelSize*CoC;\\n#endif\\n#if PASS == 1\\nvec4 acc=vec4(0.0);for(int i=0;i<32;++i){vec4 kernel=kernel64[i];vec2 uv=step*kernel.xy+vUv;acc+=texture2D(inputBuffer,uv);uv=step*kernel.zw+vUv;acc+=texture2D(inputBuffer,uv);}gl_FragColor=acc/64.0;\\n#else\\nvec4 maxValue=texture2D(inputBuffer,vUv);for(int i=0;i<8;++i){vec4 kernel=kernel16[i];vec2 uv=step*kernel.xy+vUv;maxValue=max(texture2D(inputBuffer,uv),maxValue);uv=step*kernel.zw+vUv;maxValue=max(texture2D(inputBuffer,uv),maxValue);}gl_FragColor=maxValue;\\n#endif\\n}}\";\n\n// src/materials/BokehMaterial.js\nvar BokehMaterial = class extends ShaderMaterial2 {\n /**\n * Constructs a new bokeh material.\n *\n * @param {Boolean} [fill=false] - Enables or disables the bokeh highlight fill mode.\n * @param {Boolean} [foreground=false] - Determines whether this material will be applied to foreground colors.\n */\n constructor(fill = false, foreground = false) {\n super({\n name: \"BokehMaterial\",\n defines: {\n PASS: fill ? \"2\" : \"1\"\n },\n uniforms: {\n inputBuffer: new Uniform2(null),\n cocBuffer: new Uniform2(null),\n texelSize: new Uniform2(new Vector2()),\n kernel64: new Uniform2(null),\n kernel16: new Uniform2(null),\n scale: new Uniform2(1)\n },\n blending: NoBlending2,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: convolution_bokeh_default,\n vertexShader: common_default\n });\n if (foreground) {\n this.defines.FOREGROUND = \"1\";\n }\n this.generateKernel();\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Texture} value - The buffer.\n */\n setInputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * The circle of confusion buffer.\n *\n * @type {Texture}\n */\n set cocBuffer(value) {\n this.uniforms.cocBuffer.value = value;\n }\n /**\n * Sets the circle of confusion buffer.\n *\n * @deprecated Use cocBuffer instead.\n * @param {Texture} value - The buffer.\n */\n setCoCBuffer(value) {\n this.uniforms.cocBuffer.value = value;\n }\n /**\n * The blur scale.\n *\n * @type {Number}\n */\n get scale() {\n return this.uniforms.scale.value;\n }\n set scale(value) {\n this.uniforms.scale.value = value;\n }\n /**\n * Returns the blur scale.\n *\n * @deprecated Use scale instead.\n * @return {Number} The scale.\n */\n getScale(value) {\n return this.scale;\n }\n /**\n * Sets the blur scale.\n *\n * @deprecated Use scale instead.\n * @param {Number} value - The scale.\n */\n setScale(value) {\n this.scale = value;\n }\n /**\n * Generates the blur kernel.\n *\n * @private\n */\n generateKernel() {\n const GOLDEN_ANGLE = 2.39996323;\n const points64 = new Float64Array(128);\n const points16 = new Float64Array(32);\n let i64 = 0, i16 = 0;\n for (let i = 0, sqrt80 = Math.sqrt(80); i < 80; ++i) {\n const theta = i * GOLDEN_ANGLE;\n const r = Math.sqrt(i) / sqrt80;\n const u = r * Math.cos(theta), v3 = r * Math.sin(theta);\n if (i % 5 === 0) {\n points16[i16++] = u;\n points16[i16++] = v3;\n } else {\n points64[i64++] = u;\n points64[i64++] = v3;\n }\n }\n this.uniforms.kernel64.value = points64;\n this.uniforms.kernel16.value = points16;\n }\n /**\n * Sets the texel size.\n *\n * @deprecated Use setSize() instead.\n * @param {Number} x - The texel width.\n * @param {Number} y - The texel height.\n */\n setTexelSize(x, y) {\n this.uniforms.texelSize.value.set(x, y);\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.uniforms.texelSize.value.set(1 / width, 1 / height);\n }\n};\n\n// src/materials/BoxBlurMaterial.js\nimport { NoBlending as NoBlending3, PerspectiveCamera, ShaderMaterial as ShaderMaterial3, Uniform as Uniform3, Vector2 as Vector22 } from \"three\";\n\n// src/utils/BackCompat.js\nimport { LinearEncoding, REVISION, sRGBEncoding } from \"three\";\n\n// src/enums/BlendFunction.js\nvar BlendFunction = {\n SKIP: 9,\n SET: 30,\n ADD: 0,\n ALPHA: 1,\n AVERAGE: 2,\n COLOR: 3,\n COLOR_BURN: 4,\n COLOR_DODGE: 5,\n DARKEN: 6,\n DIFFERENCE: 7,\n DIVIDE: 8,\n DST: 9,\n EXCLUSION: 10,\n HARD_LIGHT: 11,\n HARD_MIX: 12,\n HUE: 13,\n INVERT: 14,\n INVERT_RGB: 15,\n LIGHTEN: 16,\n LINEAR_BURN: 17,\n LINEAR_DODGE: 18,\n LINEAR_LIGHT: 19,\n LUMINOSITY: 20,\n MULTIPLY: 21,\n NEGATION: 22,\n NORMAL: 23,\n OVERLAY: 24,\n PIN_LIGHT: 25,\n REFLECT: 26,\n SATURATION: 27,\n SCREEN: 28,\n SOFT_LIGHT: 29,\n SRC: 30,\n SUBTRACT: 31,\n VIVID_LIGHT: 32\n};\n\n// src/enums/ColorChannel.js\nvar ColorChannel = {\n RED: 0,\n GREEN: 1,\n BLUE: 2,\n ALPHA: 3\n};\n\n// src/enums/ColorSpace.js\nvar NoColorSpace = \"\";\nvar SRGBColorSpace = \"srgb\";\nvar LinearSRGBColorSpace = \"srgb-linear\";\nvar DisplayP3ColorSpace = \"display-p3\";\n\n// src/enums/DepthCopyMode.js\nvar DepthCopyMode = {\n FULL: 0,\n SINGLE: 1\n};\n\n// src/enums/DepthTestStrategy.js\nvar DepthTestStrategy = {\n DEFAULT: 0,\n KEEP_MAX_DEPTH: 1,\n DISCARD_MAX_DEPTH: 2\n};\n\n// src/enums/EdgeDetectionMode.js\nvar EdgeDetectionMode = {\n DEPTH: 0,\n LUMA: 1,\n COLOR: 2\n};\n\n// src/enums/EffectAttribute.js\nvar EffectAttribute = {\n NONE: 0,\n DEPTH: 1,\n CONVOLUTION: 2\n};\n\n// src/enums/EffectShaderSection.js\nvar EffectShaderSection = {\n FRAGMENT_HEAD: \"FRAGMENT_HEAD\",\n FRAGMENT_MAIN_UV: \"FRAGMENT_MAIN_UV\",\n FRAGMENT_MAIN_IMAGE: \"FRAGMENT_MAIN_IMAGE\",\n VERTEX_HEAD: \"VERTEX_HEAD\",\n VERTEX_MAIN_SUPPORT: \"VERTEX_MAIN_SUPPORT\"\n};\n\n// src/enums/GlitchMode.js\nvar GlitchMode = {\n DISABLED: 0,\n SPORADIC: 1,\n CONSTANT_MILD: 2,\n CONSTANT_WILD: 3\n};\n\n// src/enums/KernelSize.js\nvar KernelSize = {\n VERY_SMALL: 0,\n SMALL: 1,\n MEDIUM: 2,\n LARGE: 3,\n VERY_LARGE: 4,\n HUGE: 5\n};\n\n// src/enums/LUTOperation.js\nvar LUTOperation = {\n SCALE_UP: \"lut.scaleup\"\n};\n\n// src/enums/MaskFunction.js\nvar MaskFunction = {\n DISCARD: 0,\n MULTIPLY: 1,\n MULTIPLY_RGB_SET_ALPHA: 2\n};\n\n// src/enums/PredicationMode.js\nvar PredicationMode = {\n DISABLED: 0,\n DEPTH: 1,\n CUSTOM: 2\n};\n\n// src/enums/SMAAPreset.js\nvar SMAAPreset = {\n LOW: 0,\n MEDIUM: 1,\n HIGH: 2,\n ULTRA: 3\n};\n\n// src/enums/ToneMappingMode.js\nvar ToneMappingMode = {\n REINHARD: 0,\n REINHARD2: 1,\n REINHARD2_ADAPTIVE: 2,\n OPTIMIZED_CINEON: 3,\n ACES_FILMIC: 4,\n UNCHARTED2: 5\n};\n\n// src/enums/VignetteTechnique.js\nvar VignetteTechnique = {\n DEFAULT: 0,\n ESKIL: 1\n};\n\n// src/enums/WebGLExtension.js\nvar WebGLExtension = {\n DERIVATIVES: \"derivatives\",\n FRAG_DEPTH: \"fragDepth\",\n DRAW_BUFFERS: \"drawBuffers\",\n SHADER_TEXTURE_LOD: \"shaderTextureLOD\"\n};\n\n// src/utils/BackCompat.js\nvar revision = Number(REVISION.replace(/\\D+/g, \"\"));\nvar useColorSpace = revision >= 152;\nvar encodingToColorSpace = /* @__PURE__ */ new Map([\n [LinearEncoding, LinearSRGBColorSpace],\n [sRGBEncoding, SRGBColorSpace]\n]);\nvar colorSpaceToEncoding = /* @__PURE__ */ new Map([\n [LinearSRGBColorSpace, LinearEncoding],\n [SRGBColorSpace, sRGBEncoding]\n]);\nfunction getOutputColorSpace(renderer) {\n return renderer === null ? null : useColorSpace ? renderer.outputColorSpace : encodingToColorSpace.get(renderer.outputEncoding);\n}\nfunction setTextureColorSpace(texture, colorSpace) {\n if (texture === null) {\n return;\n }\n if (useColorSpace) {\n texture.colorSpace = colorSpace;\n } else {\n texture.encoding = colorSpaceToEncoding.get(colorSpace);\n }\n}\nfunction copyTextureColorSpace(src, dest) {\n if (src === null || dest === null) {\n return;\n }\n if (useColorSpace) {\n dest.colorSpace = src.colorSpace;\n } else {\n dest.encoding = src.encoding;\n }\n}\nfunction updateFragmentShader(fragmentShader) {\n if (revision < 154) {\n return fragmentShader.replace(\"colorspace_fragment\", \"encodings_fragment\");\n }\n return fragmentShader;\n}\n\n// src/utils/orthographicDepthToViewZ.js\nfunction orthographicDepthToViewZ(depth, near, far) {\n return depth * (near - far) - near;\n}\n\n// src/utils/viewZToOrthographicDepth.js\nfunction viewZToOrthographicDepth(viewZ, near, far) {\n return Math.min(Math.max((viewZ + near) / (near - far), 0), 1);\n}\n\n// src/materials/glsl/convolution.box.frag\nvar convolution_box_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#ifdef BILATERAL\\n#include <packing>\\nuniform vec2 cameraNearFar;\\n#ifdef NORMAL_DEPTH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D normalDepthBuffer;\\n#else\\nuniform mediump sampler2D normalDepthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){return texture2D(normalDepthBuffer,uv).a;}\\n#else\\n#if DEPTH_PACKING == 3201\\nuniform lowp sampler2D depthBuffer;\\n#elif defined(GL_FRAGMENT_PRECISION_HIGH)\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}\\n#endif\\nfloat getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#endif\\n}\\n#ifdef PERSPECTIVE_CAMERA\\n#define linearDepth(v) viewZToOrthographicDepth(getViewZ(readDepth(v)), cameraNearFar.x, cameraNearFar.y)\\n#else\\n#define linearDepth(v) readDepth(v)\\n#endif\\n#endif\\n#define getTexel(v) texture2D(inputBuffer, v)\\n#if KERNEL_SIZE == 3\\nvarying vec2 vUv00,vUv01,vUv02;varying vec2 vUv03,vUv04,vUv05;varying vec2 vUv06,vUv07,vUv08;\\n#elif KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13\\nvarying vec2 vUv00,vUv01,vUv02,vUv03,vUv04;varying vec2 vUv05,vUv06,vUv07,vUv08,vUv09;varying vec2 vUv10,vUv11,vUv12,vUv13,vUv14;varying vec2 vUv15,vUv16,vUv17,vUv18,vUv19;varying vec2 vUv20,vUv21,vUv22,vUv23,vUv24;\\n#else\\nuniform vec2 texelSize;uniform float scale;varying vec2 vUv;\\n#endif\\nvoid main(){\\n#if KERNEL_SIZE == 3\\nvec4 c[]=vec4[KERNEL_SIZE_SQ](getTexel(vUv00),getTexel(vUv01),getTexel(vUv02),getTexel(vUv03),getTexel(vUv04),getTexel(vUv05),getTexel(vUv06),getTexel(vUv07),getTexel(vUv08));\\n#ifdef BILATERAL\\nfloat z[]=float[KERNEL_SIZE_SQ](linearDepth(vUv00),linearDepth(vUv01),linearDepth(vUv02),linearDepth(vUv03),linearDepth(vUv04),linearDepth(vUv05),linearDepth(vUv06),linearDepth(vUv07),linearDepth(vUv08));\\n#endif\\n#elif KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13\\nvec4 c[]=vec4[KERNEL_SIZE_SQ](getTexel(vUv00),getTexel(vUv01),getTexel(vUv02),getTexel(vUv03),getTexel(vUv04),getTexel(vUv05),getTexel(vUv06),getTexel(vUv07),getTexel(vUv08),getTexel(vUv09),getTexel(vUv10),getTexel(vUv11),getTexel(vUv12),getTexel(vUv13),getTexel(vUv14),getTexel(vUv15),getTexel(vUv16),getTexel(vUv17),getTexel(vUv18),getTexel(vUv19),getTexel(vUv20),getTexel(vUv21),getTexel(vUv22),getTexel(vUv23),getTexel(vUv24));\\n#ifdef BILATERAL\\nfloat z[]=float[KERNEL_SIZE_SQ](linearDepth(vUv00),linearDepth(vUv01),linearDepth(vUv02),linearDepth(vUv03),linearDepth(vUv04),linearDepth(vUv05),linearDepth(vUv06),linearDepth(vUv07),linearDepth(vUv08),linearDepth(vUv09),linearDepth(vUv10),linearDepth(vUv11),linearDepth(vUv12),linearDepth(vUv13),linearDepth(vUv14),linearDepth(vUv15),linearDepth(vUv16),linearDepth(vUv17),linearDepth(vUv18),linearDepth(vUv19),linearDepth(vUv20),linearDepth(vUv21),linearDepth(vUv22),linearDepth(vUv23),linearDepth(vUv24));\\n#endif\\n#endif\\nvec4 result=vec4(0.0);\\n#ifdef BILATERAL\\nfloat w=0.0;\\n#if KERNEL_SIZE == 3 || (KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13)\\nfloat centerDepth=z[KERNEL_SIZE_SQ_HALF];for(int i=0;i<KERNEL_SIZE_SQ;++i){float d=step(abs(z[i]-centerDepth),DISTANCE_THRESHOLD);result+=c[i]*d;w+=d;}\\n#else\\nfloat centerDepth=linearDepth(vUv);vec2 s=texelSize*scale;for(int x=-KERNEL_SIZE_HALF;x<=KERNEL_SIZE_HALF;++x){for(int y=-KERNEL_SIZE_HALF;y<=KERNEL_SIZE_HALF;++y){vec2 coords=vUv+vec2(x,y)*s;vec4 c=getTexel(coords);float z=(x==0&&y==0)?centerDepth:linearDepth(coords);float d=step(abs(z-centerDepth),DISTANCE_THRESHOLD);result+=c*d;w+=d;}}\\n#endif\\ngl_FragColor=result/max(w,1.0);\\n#else\\n#if KERNEL_SIZE == 3 || (KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13)\\nfor(int i=0;i<KERNEL_SIZE_SQ;++i){result+=c[i];}\\n#else\\nvec2 s=texelSize*scale;for(int x=-KERNEL_SIZE_HALF;x<=KERNEL_SIZE_HALF;++x){for(int y=-KERNEL_SIZE_HALF;y<=KERNEL_SIZE_HALF;++y){result+=getTexel(uv+vec2(x,y)*s);}}\\n#endif\\ngl_FragColor=result*INV_KERNEL_SIZE_SQ;\\n#endif\\n}\";\n\n// src/materials/glsl/convolution.box.vert\nvar convolution_box_default2 = \"uniform vec2 texelSize;uniform float scale;\\n#if KERNEL_SIZE == 3\\nvarying vec2 vUv00,vUv01,vUv02;varying vec2 vUv03,vUv04,vUv05;varying vec2 vUv06,vUv07,vUv08;\\n#elif KERNEL_SIZE == 5 && MAX_VARYING_VECTORS >= 13\\nvarying vec2 vUv00,vUv01,vUv02,vUv03,vUv04;varying vec2 vUv05,vUv06,vUv07,vUv08,vUv09;varying vec2 vUv10,vUv11,vUv12,vUv13,vUv14;varying vec2 vUv15,vUv16,vUv17,vUv18,vUv19;varying vec2 vUv20,vUv21,vUv22,vUv23,vUv24;\\n#else\\nvarying vec2 vUv;\\n#endif\\nvoid main(){vec2 uv=position.xy*0.5+0.5;\\n#if KERNEL_SIZE == 3\\nvec2 s=texelSize*scale;vUv00=uv+s*vec2(-1.0,-1.0);vUv01=uv+s*vec2(0.0,-1.0);vUv02=uv+s*vec2(1.0,-1.0);vUv03=uv+s*vec2(-1.0,0.0);vUv04=uv;vUv05=uv+s*vec2(1.0,0.0);vUv06=uv+s*vec2(-1.0,1.0);vUv07=uv+s*vec2(0.0,1.0);vUv08=uv+s*vec2(1.0,1.0);\\n#elif KERNEL_SIZE == 5\\nvec2 s=texelSize*scale;vUv00=uv+s*vec2(-2.0,-2.0);vUv01=uv+s*vec2(-1.0,-2.0);vUv02=uv+s*vec2(0.0,-2.0);vUv03=uv+s*vec2(1.0,-2.0);vUv04=uv+s*vec2(2.0,-2.0);vUv05=uv+s*vec2(-2.0,-1.0);vUv06=uv+s*vec2(-1.0,-1.0);vUv07=uv+s*vec2(0.0,-1.0);vUv08=uv+s*vec2(1.0,-1.0);vUv09=uv+s*vec2(2.0,-1.0);vUv10=uv+s*vec2(-2.0,0.0);vUv11=uv+s*vec2(-1.0,0.0);vUv12=uv;vUv13=uv+s*vec2(1.0,0.0);vUv14=uv+s*vec2(2.0,0.0);vUv15=uv+s*vec2(-2.0,1.0);vUv16=uv+s*vec2(-1.0,1.0);vUv17=uv+s*vec2(0.0,1.0);vUv18=uv+s*vec2(1.0,1.0);vUv19=uv+s*vec2(2.0,1.0);vUv20=uv+s*vec2(-2.0,2.0);vUv21=uv+s*vec2(-1.0,2.0);vUv22=uv+s*vec2(0.0,2.0);vUv23=uv+s*vec2(1.0,2.0);vUv24=uv+s*vec2(2.0,2.0);\\n#else\\nvUv=uv;\\n#endif\\ngl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/BoxBlurMaterial.js\nvar BoxBlurMaterial = class extends ShaderMaterial3 {\n /**\n * Constructs a new box blur material.\n *\n * @param {Object} [options] - The options.\n * @param {Number} [options.bilateral=false] - Enables or disables bilateral blurring.\n * @param {Number} [options.kernelSize=5] - The kernel size.\n */\n constructor({ bilateral = false, kernelSize = 5 } = {}) {\n super({\n name: \"BoxBlurMaterial\",\n defines: {\n DEPTH_PACKING: \"0\",\n DISTANCE_THRESHOLD: \"0.1\"\n },\n uniforms: {\n inputBuffer: new Uniform3(null),\n depthBuffer: new Uniform3(null),\n normalDepthBuffer: new Uniform3(null),\n texelSize: new Uniform3(new Vector22()),\n cameraNearFar: new Uniform3(new Vector22()),\n scale: new Uniform3(1)\n },\n blending: NoBlending3,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: convolution_box_default,\n vertexShader: convolution_box_default2\n });\n this.bilateral = bilateral;\n this.kernelSize = kernelSize;\n this.maxVaryingVectors = 8;\n }\n /**\n * The maximum amount of varying vectors.\n *\n * Should be synced with `renderer.capabilities.maxVaryings`. Default is 8.\n *\n * @type {Number}\n */\n set maxVaryingVectors(value) {\n this.defines.MAX_VARYING_VECTORS = value.toFixed(0);\n }\n /**\n * The kernel size.\n *\n * - Must be an odd number\n * - Kernel size 3 and 5 use optimized code paths\n * - Default is 5\n *\n * @type {Number}\n */\n get kernelSize() {\n return Number(this.defines.KERNEL_SIZE);\n }\n set kernelSize(value) {\n if (value % 2 === 0) {\n throw new Error(\"The kernel size must be an odd number\");\n }\n this.defines.KERNEL_SIZE = value.toFixed(0);\n this.defines.KERNEL_SIZE_HALF = Math.floor(value / 2).toFixed(0);\n this.defines.KERNEL_SIZE_SQ = (value ** 2).toFixed(0);\n this.defines.KERNEL_SIZE_SQ_HALF = Math.floor(value ** 2 / 2).toFixed(0);\n this.defines.INV_KERNEL_SIZE_SQ = (1 / value ** 2).toFixed(6);\n this.needsUpdate = true;\n }\n /**\n * The blur scale.\n *\n * @type {Number}\n */\n get scale() {\n return this.uniforms.scale.value;\n }\n set scale(value) {\n this.uniforms.scale.value = value;\n }\n /**\n * The current near plane setting.\n *\n * @type {Number}\n * @private\n */\n get near() {\n return this.uniforms.cameraNearFar.value.x;\n }\n /**\n * The current far plane setting.\n *\n * @type {Number}\n * @private\n */\n get far() {\n return this.uniforms.cameraNearFar.value.y;\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * The depth buffer.\n *\n * @type {Texture}\n */\n set depthBuffer(value) {\n this.uniforms.depthBuffer.value = value;\n }\n /**\n * A combined normal-depth buffer. Overrides {@link depthBuffer} if set.\n *\n * @type {Texture}\n */\n set normalDepthBuffer(value) {\n this.uniforms.normalDepthBuffer.value = value;\n if (value !== null) {\n this.defines.NORMAL_DEPTH = \"1\";\n } else {\n delete this.defines.NORMAL_DEPTH;\n }\n this.needsUpdate = true;\n }\n /**\n * The depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set depthPacking(value) {\n this.defines.DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Indicates whether bilateral filtering is enabled.\n *\n * @type {Boolean}\n */\n get bilateral() {\n return this.defines.BILATERAL !== void 0;\n }\n set bilateral(value) {\n if (value !== null) {\n this.defines.BILATERAL = \"1\";\n } else {\n delete this.defines.BILATERAL;\n }\n this.needsUpdate = true;\n }\n /**\n * The bilateral filter distance threshold in world units.\n *\n * @type {Number}\n */\n get worldDistanceThreshold() {\n return -orthographicDepthToViewZ(Number(this.defines.DISTANCE_THRESHOLD), this.near, this.far);\n }\n set worldDistanceThreshold(value) {\n const threshold = viewZToOrthographicDepth(-value, this.near, this.far);\n this.defines.DISTANCE_THRESHOLD = threshold.toFixed(12);\n this.needsUpdate = true;\n }\n /**\n * Copies the settings of the given camera.\n *\n * @param {Camera} camera - A camera.\n */\n copyCameraSettings(camera) {\n if (camera) {\n this.uniforms.cameraNearFar.value.set(camera.near, camera.far);\n if (camera instanceof PerspectiveCamera) {\n this.defines.PERSPECTIVE_CAMERA = \"1\";\n } else {\n delete this.defines.PERSPECTIVE_CAMERA;\n }\n this.needsUpdate = true;\n }\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.uniforms.texelSize.value.set(1 / width, 1 / height);\n }\n};\n\n// src/materials/CircleOfConfusionMaterial.js\nimport { BasicDepthPacking, NoBlending as NoBlending4, PerspectiveCamera as PerspectiveCamera2, ShaderMaterial as ShaderMaterial4, Uniform as Uniform4 } from \"three\";\n\n// src/materials/glsl/circle-of-confusion.frag\nvar circle_of_confusion_default = \"#include <common>\\n#include <packing>\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nuniform float focusDistance;uniform float focusRange;uniform float cameraNear;uniform float cameraFar;varying vec2 vUv;float readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nfloat depth=unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nfloat depth=texture2D(depthBuffer,uv).r;\\n#endif\\n#ifdef LOG_DEPTH\\nfloat d=pow(2.0,depth*log2(cameraFar+1.0))-1.0;float a=cameraFar/(cameraFar-cameraNear);float b=cameraFar*cameraNear/(cameraNear-cameraFar);depth=a+b/d;\\n#endif\\nreturn depth;}void main(){float depth=readDepth(vUv);\\n#ifdef PERSPECTIVE_CAMERA\\nfloat viewZ=perspectiveDepthToViewZ(depth,cameraNear,cameraFar);float linearDepth=viewZToOrthographicDepth(viewZ,cameraNear,cameraFar);\\n#else\\nfloat linearDepth=depth;\\n#endif\\nfloat signedDistance=linearDepth-focusDistance;float magnitude=smoothstep(0.0,focusRange,abs(signedDistance));gl_FragColor.rg=magnitude*vec2(step(signedDistance,0.0),step(0.0,signedDistance));}\";\n\n// src/materials/CircleOfConfusionMaterial.js\nvar CircleOfConfusionMaterial = class extends ShaderMaterial4 {\n /**\n * Constructs a new CoC material.\n *\n * @param {Camera} camera - A camera.\n */\n constructor(camera) {\n super({\n name: \"CircleOfConfusionMaterial\",\n defines: {\n DEPTH_PACKING: \"0\"\n },\n uniforms: {\n depthBuffer: new Uniform4(null),\n focusDistance: new Uniform4(0),\n focusRange: new Uniform4(0),\n cameraNear: new Uniform4(0.3),\n cameraFar: new Uniform4(1e3)\n },\n blending: NoBlending4,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: circle_of_confusion_default,\n vertexShader: common_default\n });\n this.uniforms.focalLength = this.uniforms.focusRange;\n this.copyCameraSettings(camera);\n }\n /**\n * The current near plane setting.\n *\n * @type {Number}\n * @private\n */\n get near() {\n return this.uniforms.cameraNear.value;\n }\n /**\n * The current far plane setting.\n *\n * @type {Number}\n * @private\n */\n get far() {\n return this.uniforms.cameraFar.value;\n }\n /**\n * The depth buffer.\n *\n * @type {Texture}\n */\n set depthBuffer(value) {\n this.uniforms.depthBuffer.value = value;\n }\n /**\n * The depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set depthPacking(value) {\n this.defines.DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the depth buffer.\n *\n * @deprecated Use depthBuffer and depthPacking instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthBuffer(buffer, depthPacking = BasicDepthPacking) {\n this.depthBuffer = buffer;\n this.depthPacking = depthPacking;\n }\n /**\n * The focus distance. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get focusDistance() {\n return this.uniforms.focusDistance.value;\n }\n set focusDistance(value) {\n this.uniforms.focusDistance.value = value;\n }\n /**\n * The focus distance in world units.\n *\n * @type {Number}\n */\n get worldFocusDistance() {\n return -orthographicDepthToViewZ(this.focusDistance, this.near, this.far);\n }\n set worldFocusDistance(value) {\n this.focusDistance = viewZToOrthographicDepth(-value, this.near, this.far);\n }\n /**\n * Returns the focus distance.\n *\n * @deprecated Use focusDistance instead.\n * @return {Number} The focus distance.\n */\n getFocusDistance(value) {\n this.uniforms.focusDistance.value = value;\n }\n /**\n * Sets the focus distance.\n *\n * @deprecated Use focusDistance instead.\n * @param {Number} value - The focus distance.\n */\n setFocusDistance(value) {\n this.uniforms.focusDistance.value = value;\n }\n /**\n * The focal length.\n *\n * @deprecated Renamed to focusRange.\n * @type {Number}\n */\n get focalLength() {\n return this.focusRange;\n }\n set focalLength(value) {\n this.focusRange = value;\n }\n /**\n * The focus range. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get focusRange() {\n return this.uniforms.focusRange.value;\n }\n set focusRange(value) {\n this.uniforms.focusRange.value = value;\n }\n /**\n * The focus range in world units.\n *\n * @type {Number}\n */\n get worldFocusRange() {\n return -orthographicDepthToViewZ(this.focusRange, this.near, this.far);\n }\n set worldFocusRange(value) {\n this.focusRange = viewZToOrthographicDepth(-value, this.near, this.far);\n }\n /**\n * Returns the focal length.\n *\n * @deprecated Use focusRange instead.\n * @return {Number} The focal length.\n */\n getFocalLength(value) {\n return this.focusRange;\n }\n /**\n * Sets the focal length.\n *\n * @deprecated Use focusRange instead.\n * @param {Number} value - The focal length.\n */\n setFocalLength(value) {\n this.focusRange = value;\n }\n /**\n * Copies the settings of the given camera.\n *\n * @deprecated Use copyCameraSettings instead.\n * @param {Camera} camera - A camera.\n */\n adoptCameraSettings(camera) {\n this.copyCameraSettings(camera);\n }\n /**\n * Copies the settings of the given camera.\n *\n * @param {Camera} camera - A camera.\n */\n copyCameraSettings(camera) {\n if (camera) {\n this.uniforms.cameraNear.value = camera.near;\n this.uniforms.cameraFar.value = camera.far;\n if (camera instanceof PerspectiveCamera2) {\n this.defines.PERSPECTIVE_CAMERA = \"1\";\n } else {\n delete this.defines.PERSPECTIVE_CAMERA;\n }\n this.needsUpdate = true;\n }\n }\n};\n\n// src/materials/KawaseBlurMaterial.js\nimport { NoBlending as NoBlending5, ShaderMaterial as ShaderMaterial5, Uniform as Uniform5, Vector4 } from \"three\";\n\n// src/materials/glsl/convolution.kawase.frag\nvar convolution_kawase_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nvarying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec4 sum=texture2D(inputBuffer,vUv0);sum+=texture2D(inputBuffer,vUv1);sum+=texture2D(inputBuffer,vUv2);sum+=texture2D(inputBuffer,vUv3);gl_FragColor=sum*0.25;\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.kawase.vert\nvar convolution_kawase_default2 = \"uniform vec4 texelSize;uniform float kernel;uniform float scale;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec2 uv=position.xy*0.5+0.5;vec2 dUv=(texelSize.xy*vec2(kernel)+texelSize.zw)*scale;vUv0=vec2(uv.x-dUv.x,uv.y+dUv.y);vUv1=vec2(uv.x+dUv.x,uv.y+dUv.y);vUv2=vec2(uv.x+dUv.x,uv.y-dUv.y);vUv3=vec2(uv.x-dUv.x,uv.y-dUv.y);gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/KawaseBlurMaterial.js\nvar kernelPresets = [\n new Float32Array([0, 0]),\n new Float32Array([0, 1, 1]),\n new Float32Array([0, 1, 1, 2]),\n new Float32Array([0, 1, 2, 2, 3]),\n new Float32Array([0, 1, 2, 3, 4, 4, 5]),\n new Float32Array([0, 1, 2, 3, 4, 5, 7, 8, 9, 10])\n];\nvar KawaseBlurMaterial = class extends ShaderMaterial5 {\n /**\n * Constructs a new convolution material.\n *\n * TODO Remove texelSize param.\n * @param {Vector4} [texelSize] - Deprecated.\n */\n constructor(texelSize = new Vector4()) {\n super({\n name: \"KawaseBlurMaterial\",\n uniforms: {\n inputBuffer: new Uniform5(null),\n texelSize: new Uniform5(new Vector4()),\n scale: new Uniform5(1),\n kernel: new Uniform5(0)\n },\n blending: NoBlending5,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: convolution_kawase_default,\n vertexShader: convolution_kawase_default2\n });\n this.fragmentShader = updateFragmentShader(this.fragmentShader);\n this.setTexelSize(texelSize.x, texelSize.y);\n this.kernelSize = KernelSize.MEDIUM;\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Texture} value - The input buffer.\n */\n setInputBuffer(value) {\n this.inputBuffer = value;\n }\n /**\n * The kernel sequence for the current kernel size.\n *\n * @type {Float32Array}\n */\n get kernelSequence() {\n return kernelPresets[this.kernelSize];\n }\n /**\n * The blur scale.\n *\n * @type {Number}\n */\n get scale() {\n return this.uniforms.scale.value;\n }\n set scale(value) {\n this.uniforms.scale.value = value;\n }\n /**\n * Returns the blur scale.\n *\n * @deprecated Use scale instead.\n * @return {Number} The scale.\n */\n getScale() {\n return this.uniforms.scale.value;\n }\n /**\n * Sets the blur scale.\n *\n * @deprecated Use scale instead.\n * @return {Number} value - The scale.\n */\n setScale(value) {\n this.uniforms.scale.value = value;\n }\n /**\n * Returns the kernel.\n *\n * @return {Float32Array} The kernel.\n * @deprecated Implementation detail, removed with no replacement.\n */\n getKernel() {\n return null;\n }\n /**\n * The current kernel.\n *\n * @type {Number}\n */\n get kernel() {\n return this.uniforms.kernel.value;\n }\n set kernel(value) {\n this.uniforms.kernel.value = value;\n }\n /**\n * Sets the current kernel.\n *\n * @deprecated Use kernel instead.\n * @param {Number} value - The kernel.\n */\n setKernel(value) {\n this.kernel = value;\n }\n /**\n * Sets the texel size.\n *\n * @deprecated Use setSize() instead.\n * @param {Number} x - The texel width.\n * @param {Number} y - The texel height.\n */\n setTexelSize(x, y) {\n this.uniforms.texelSize.value.set(x, y, x * 0.5, y * 0.5);\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const x = 1 / width, y = 1 / height;\n this.uniforms.texelSize.value.set(x, y, x * 0.5, y * 0.5);\n }\n};\n\n// src/materials/CopyMaterial.js\nimport { NoBlending as NoBlending6, ShaderMaterial as ShaderMaterial6, Uniform as Uniform6 } from \"three\";\n\n// src/materials/glsl/copy.frag\nvar copy_default = \"#include <common>\\n#include <dithering_pars_fragment>\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform float opacity;varying vec2 vUv;void main(){vec4 texel=texture2D(inputBuffer,vUv);gl_FragColor=opacity*texel;\\n#include <colorspace_fragment>\\n#include <dithering_fragment>\\n}\";\n\n// src/materials/CopyMaterial.js\nvar CopyMaterial = class extends ShaderMaterial6 {\n /**\n * Constructs a new copy material.\n */\n constructor() {\n super({\n name: \"CopyMaterial\",\n uniforms: {\n inputBuffer: new Uniform6(null),\n opacity: new Uniform6(1)\n },\n blending: NoBlending6,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: copy_default,\n vertexShader: common_default\n });\n this.fragmentShader = updateFragmentShader(this.fragmentShader);\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Number} value - The buffer.\n */\n setInputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Returns the opacity.\n *\n * @deprecated Use opacity instead.\n * @return {Number} The opacity.\n */\n getOpacity(value) {\n return this.uniforms.opacity.value;\n }\n /**\n * Sets the opacity.\n *\n * @deprecated Use opacity instead.\n * @param {Number} value - The opacity.\n */\n setOpacity(value) {\n this.uniforms.opacity.value = value;\n }\n};\n\n// src/materials/DepthComparisonMaterial.js\nimport { NoBlending as NoBlending7, PerspectiveCamera as PerspectiveCamera3, RGBADepthPacking, ShaderMaterial as ShaderMaterial7, Uniform as Uniform7 } from \"three\";\n\n// src/materials/glsl/depth-comparison.frag\nvar depth_comparison_default = \"#include <packing>\\n#include <clipping_planes_pars_fragment>\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nuniform float cameraNear;uniform float cameraFar;centroid varying float vViewZ;centroid varying vec4 vProjTexCoord;void main(){\\n#include <clipping_planes_fragment>\\nvec2 projTexCoord=(vProjTexCoord.xy/vProjTexCoord.w)*0.5+0.5;projTexCoord=clamp(projTexCoord,0.002,0.998);\\n#if DEPTH_PACKING == 3201\\nfloat fragCoordZ=unpackRGBAToDepth(texture2D(depthBuffer,projTexCoord));\\n#else\\nfloat fragCoordZ=texture2D(depthBuffer,projTexCoord).r;\\n#endif\\n#ifdef PERSPECTIVE_CAMERA\\nfloat viewZ=perspectiveDepthToViewZ(fragCoordZ,cameraNear,cameraFar);\\n#else\\nfloat viewZ=orthographicDepthToViewZ(fragCoordZ,cameraNear,cameraFar);\\n#endif\\nfloat depthTest=(-vViewZ>-viewZ)?1.0:0.0;gl_FragColor.rg=vec2(0.0,depthTest);}\";\n\n// src/materials/glsl/depth-comparison.vert\nvar depth_comparison_default2 = \"#include <common>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying float vViewZ;varying vec4 vProjTexCoord;void main(){\\n#include <skinbase_vertex>\\n#include <begin_vertex>\\n#include <morphtarget_vertex>\\n#include <skinning_vertex>\\n#include <project_vertex>\\nvViewZ=mvPosition.z;vProjTexCoord=gl_Position;\\n#include <clipping_planes_vertex>\\n}\";\n\n// src/materials/DepthComparisonMaterial.js\nvar DepthComparisonMaterial = class extends ShaderMaterial7 {\n /**\n * Constructs a new depth comparison material.\n *\n * @param {Texture} [depthTexture=null] - A depth texture.\n * @param {PerspectiveCamera} [camera] - A camera.\n */\n constructor(depthTexture = null, camera) {\n super({\n name: \"DepthComparisonMaterial\",\n defines: {\n DEPTH_PACKING: \"0\"\n },\n uniforms: {\n depthBuffer: new Uniform7(null),\n cameraNear: new Uniform7(0.3),\n cameraFar: new Uniform7(1e3)\n },\n blending: NoBlending7,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: depth_comparison_default,\n vertexShader: depth_comparison_default2\n });\n this.depthBuffer = depthTexture;\n this.depthPacking = RGBADepthPacking;\n this.copyCameraSettings(camera);\n }\n /**\n * The depth buffer.\n *\n * @type {Texture}\n */\n set depthBuffer(value) {\n this.uniforms.depthBuffer.value = value;\n }\n /**\n * The depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set depthPacking(value) {\n this.defines.DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the depth buffer.\n *\n * @deprecated Use depthBuffer and depthPacking instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=RGBADepthPacking] - The depth packing strategy.\n */\n setDepthBuffer(buffer, depthPacking = RGBADepthPacking) {\n this.depthBuffer = buffer;\n this.depthPacking = depthPacking;\n }\n /**\n * Copies the settings of the given camera.\n *\n * @deprecated Use copyCameraSettings instead.\n * @param {Camera} camera - A camera.\n */\n adoptCameraSettings(camera) {\n this.copyCameraSettings(camera);\n }\n /**\n * Copies the settings of the given camera.\n *\n * @param {Camera} camera - A camera.\n */\n copyCameraSettings(camera) {\n if (camera) {\n this.uniforms.cameraNear.value = camera.near;\n this.uniforms.cameraFar.value = camera.far;\n if (camera instanceof PerspectiveCamera3) {\n this.defines.PERSPECTIVE_CAMERA = \"1\";\n } else {\n delete this.defines.PERSPECTIVE_CAMERA;\n }\n this.needsUpdate = true;\n }\n }\n};\n\n// src/materials/DepthCopyMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking2, NoBlending as NoBlending8, ShaderMaterial as ShaderMaterial8, Uniform as Uniform8, Vector2 as Vector23 } from \"three\";\n\n// src/materials/glsl/depth-copy.frag\nvar depth_copy_default = \"#include <packing>\\nvarying vec2 vUv;\\n#ifdef NORMAL_DEPTH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D normalDepthBuffer;\\n#else\\nuniform mediump sampler2D normalDepthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){return texture2D(normalDepthBuffer,uv).a;}\\n#else\\n#if INPUT_DEPTH_PACKING == 3201\\nuniform lowp sampler2D depthBuffer;\\n#elif defined(GL_FRAGMENT_PRECISION_HIGH)\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){\\n#if INPUT_DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}\\n#endif\\nvoid main(){\\n#if INPUT_DEPTH_PACKING == OUTPUT_DEPTH_PACKING\\ngl_FragColor=texture2D(depthBuffer,vUv);\\n#else\\nfloat depth=readDepth(vUv);\\n#if OUTPUT_DEPTH_PACKING == 3201\\ngl_FragColor=(depth==1.0)?vec4(1.0):packDepthToRGBA(depth);\\n#else\\ngl_FragColor=vec4(vec3(depth),1.0);\\n#endif\\n#endif\\n}\";\n\n// src/materials/glsl/depth-copy.vert\nvar depth_copy_default2 = \"varying vec2 vUv;\\n#if DEPTH_COPY_MODE == 1\\nuniform vec2 texelPosition;\\n#endif\\nvoid main(){\\n#if DEPTH_COPY_MODE == 1\\nvUv=texelPosition;\\n#else\\nvUv=position.xy*0.5+0.5;\\n#endif\\ngl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/DepthCopyMaterial.js\nvar DepthCopyMaterial = class extends ShaderMaterial8 {\n /**\n * Constructs a new depth copy material.\n */\n constructor() {\n super({\n name: \"DepthCopyMaterial\",\n defines: {\n INPUT_DEPTH_PACKING: \"0\",\n OUTPUT_DEPTH_PACKING: \"0\",\n DEPTH_COPY_MODE: \"0\"\n },\n uniforms: {\n depthBuffer: new Uniform8(null),\n texelPosition: new Uniform8(new Vector23())\n },\n blending: NoBlending8,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: depth_copy_default,\n vertexShader: depth_copy_default2\n });\n this.depthCopyMode = DepthCopyMode.FULL;\n }\n /**\n * The input depth buffer.\n *\n * @type {Texture}\n */\n get depthBuffer() {\n return this.uniforms.depthBuffer.value;\n }\n set depthBuffer(value) {\n this.uniforms.depthBuffer.value = value;\n }\n /**\n * The input depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set inputDepthPacking(value) {\n this.defines.INPUT_DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * The output depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n get outputDepthPacking() {\n return Number(this.defines.OUTPUT_DEPTH_PACKING);\n }\n set outputDepthPacking(value) {\n this.defines.OUTPUT_DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the input depth buffer.\n *\n * @deprecated Use depthBuffer and inputDepthPacking instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthBuffer(buffer, depthPacking = BasicDepthPacking2) {\n this.depthBuffer = buffer;\n this.inputDepthPacking = depthPacking;\n }\n /**\n * Returns the current input depth packing strategy.\n *\n * @deprecated\n * @return {DepthPackingStrategies} The input depth packing strategy.\n */\n getInputDepthPacking() {\n return Number(this.defines.INPUT_DEPTH_PACKING);\n }\n /**\n * Sets the input depth packing strategy.\n *\n * @deprecated Use inputDepthPacking instead.\n * @param {DepthPackingStrategies} value - The new input depth packing strategy.\n */\n setInputDepthPacking(value) {\n this.defines.INPUT_DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Returns the current output depth packing strategy.\n *\n * @deprecated Use outputDepthPacking instead.\n * @return {DepthPackingStrategies} The output depth packing strategy.\n */\n getOutputDepthPacking() {\n return Number(this.defines.OUTPUT_DEPTH_PACKING);\n }\n /**\n * Sets the output depth packing strategy.\n *\n * @deprecated Use outputDepthPacking instead.\n * @param {DepthPackingStrategies} value - The new output depth packing strategy.\n */\n setOutputDepthPacking(value) {\n this.defines.OUTPUT_DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * The screen space position used for single-texel copy operations.\n *\n * @type {Vector2}\n */\n get texelPosition() {\n return this.uniforms.texelPosition.value;\n }\n /**\n * Returns the screen space position used for single-texel copy operations.\n *\n * @deprecated Use texelPosition instead.\n * @return {Vector2} The position.\n */\n getTexelPosition() {\n return this.uniforms.texelPosition.value;\n }\n /**\n * Sets the screen space position used for single-texel copy operations.\n *\n * @deprecated\n * @param {Vector2} value - The position.\n */\n setTexelPosition(value) {\n this.uniforms.texelPosition.value = value;\n }\n /**\n * The depth copy mode.\n *\n * @type {DepthCopyMode}\n */\n get mode() {\n return this.depthCopyMode;\n }\n set mode(value) {\n this.depthCopyMode = value;\n this.defines.DEPTH_COPY_MODE = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Returns the depth copy mode.\n *\n * @deprecated Use mode instead.\n * @return {DepthCopyMode} The depth copy mode.\n */\n getMode() {\n return this.mode;\n }\n /**\n * Sets the depth copy mode.\n *\n * @deprecated Use mode instead.\n * @param {DepthCopyMode} value - The new mode.\n */\n setMode(value) {\n this.mode = value;\n }\n};\n\n// src/materials/DepthDownsamplingMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking3, NoBlending as NoBlending9, ShaderMaterial as ShaderMaterial9, Uniform as Uniform9, Vector2 as Vector24 } from \"three\";\n\n// src/materials/glsl/depth-downsampling.frag\nvar depth_downsampling_default = \"#include <packing>\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\n#ifdef DOWNSAMPLE_NORMALS\\nuniform lowp sampler2D normalBuffer;\\n#endif\\nvarying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;float readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}int findBestDepth(const in highp float samples[4]){float c=(samples[0]+samples[1]+samples[2]+samples[3])*0.25;highp float distances[]=float[4](abs(c-samples[0]),abs(c-samples[1]),abs(c-samples[2]),abs(c-samples[3]));float maxDistance=max(max(distances[0],distances[1]),max(distances[2],distances[3]));int remaining[3];int rejected[3];int i,j,k;for(i=0,j=0,k=0;i<4;++i){if(distances[i]<maxDistance){remaining[j++]=i;}else{rejected[k++]=i;}}for(;j<3;++j){remaining[j]=rejected[--k];}vec3 s=vec3(samples[remaining[0]],samples[remaining[1]],samples[remaining[2]]);c=(s.x+s.y+s.z)/3.0;distances[0]=abs(c-s.x);distances[1]=abs(c-s.y);distances[2]=abs(c-s.z);float minDistance=min(distances[0],min(distances[1],distances[2]));for(i=0;i<3;++i){if(distances[i]==minDistance){break;}}return remaining[i];}void main(){highp float d[]=float[4](readDepth(vUv0),readDepth(vUv1),readDepth(vUv2),readDepth(vUv3));int index=findBestDepth(d);\\n#ifdef DOWNSAMPLE_NORMALS\\nhighp vec3 n[]=vec3[4](texture2D(normalBuffer,vUv0).rgb,texture2D(normalBuffer,vUv1).rgb,texture2D(normalBuffer,vUv2).rgb,texture2D(normalBuffer,vUv3).rgb);\\n#else\\nhighp vec3 n[]=vec3[4](vec3(0.0),vec3(0.0),vec3(0.0),vec3(0.0));\\n#endif\\ngl_FragColor=vec4(n[index],d[index]);}\";\n\n// src/materials/glsl/depth-downsampling.vert\nvar depth_downsampling_default2 = \"uniform vec2 texelSize;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec2 uv=position.xy*0.5+0.5;vUv0=uv;vUv1=vec2(uv.x,uv.y+texelSize.y);vUv2=vec2(uv.x+texelSize.x,uv.y);vUv3=uv+texelSize;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/DepthDownsamplingMaterial.js\nvar DepthDownsamplingMaterial = class extends ShaderMaterial9 {\n /**\n * Constructs a new depth downsampling material.\n */\n constructor() {\n super({\n name: \"DepthDownsamplingMaterial\",\n defines: {\n DEPTH_PACKING: \"0\"\n },\n uniforms: {\n depthBuffer: new Uniform9(null),\n normalBuffer: new Uniform9(null),\n texelSize: new Uniform9(new Vector24())\n },\n blending: NoBlending9,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: depth_downsampling_default,\n vertexShader: depth_downsampling_default2\n });\n }\n /**\n * The depth buffer.\n *\n * @type {Texture}\n */\n set depthBuffer(value) {\n this.uniforms.depthBuffer.value = value;\n }\n /**\n * The depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set depthPacking(value) {\n this.defines.DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the depth buffer.\n *\n * @deprecated Use depthBuffer and depthPacking instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthBuffer(buffer, depthPacking = BasicDepthPacking3) {\n this.depthBuffer = buffer;\n this.depthPacking = depthPacking;\n }\n /**\n * The normal buffer.\n *\n * @type {Texture}\n */\n set normalBuffer(value) {\n this.uniforms.normalBuffer.value = value;\n if (value !== null) {\n this.defines.DOWNSAMPLE_NORMALS = \"1\";\n } else {\n delete this.defines.DOWNSAMPLE_NORMALS;\n }\n this.needsUpdate = true;\n }\n /**\n * Sets the normal buffer.\n *\n * @deprecated Use normalBuffer instead.\n * @param {Texture} value - The normal buffer.\n */\n setNormalBuffer(value) {\n this.normalBuffer = value;\n }\n /**\n * Sets the texel size.\n *\n * @deprecated Use setSize() instead.\n * @param {Number} x - The texel width.\n * @param {Number} y - The texel height.\n */\n setTexelSize(x, y) {\n this.uniforms.texelSize.value.set(x, y);\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.uniforms.texelSize.value.set(1 / width, 1 / height);\n }\n};\n\n// src/materials/DepthMaskMaterial.js\nimport {\n AlwaysDepth,\n BasicDepthPacking as BasicDepthPacking4,\n EqualDepth,\n GreaterDepth,\n GreaterEqualDepth,\n LessDepth,\n LessEqualDepth,\n NeverDepth,\n NoBlending as NoBlending10,\n NotEqualDepth,\n PerspectiveCamera as PerspectiveCamera4,\n ShaderMaterial as ShaderMaterial10,\n Uniform as Uniform10,\n Vector2 as Vector25\n} from \"three\";\n\n// src/materials/glsl/depth-mask.frag\nvar depth_mask_default = \"#include <common>\\n#include <packing>\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer0;uniform highp sampler2D depthBuffer1;\\n#else\\nuniform mediump sampler2D depthBuffer0;uniform mediump sampler2D depthBuffer1;\\n#endif\\nuniform sampler2D inputBuffer;uniform vec2 cameraNearFar;float getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#endif\\n}varying vec2 vUv;void main(){vec2 depth;\\n#if DEPTH_PACKING_0 == 3201\\ndepth.x=unpackRGBAToDepth(texture2D(depthBuffer0,vUv));\\n#else\\ndepth.x=texture2D(depthBuffer0,vUv).r;\\n#ifdef LOG_DEPTH\\nfloat d=pow(2.0,depth.x*log2(cameraNearFar.y+1.0))-1.0;float a=cameraNearFar.y/(cameraNearFar.y-cameraNearFar.x);float b=cameraNearFar.y*cameraNearFar.x/(cameraNearFar.x-cameraNearFar.y);depth.x=a+b/d;\\n#endif\\n#endif\\n#if DEPTH_PACKING_1 == 3201\\ndepth.y=unpackRGBAToDepth(texture2D(depthBuffer1,vUv));\\n#else\\ndepth.y=texture2D(depthBuffer1,vUv).r;\\n#ifdef LOG_DEPTH\\nfloat d=pow(2.0,depth.y*log2(cameraNearFar.y+1.0))-1.0;float a=cameraNearFar.y/(cameraNearFar.y-cameraNearFar.x);float b=cameraNearFar.y*cameraNearFar.x/(cameraNearFar.x-cameraNearFar.y);depth.y=a+b/d;\\n#endif\\n#endif\\nbool isMaxDepth=(depth.x==1.0);\\n#ifdef PERSPECTIVE_CAMERA\\ndepth.x=viewZToOrthographicDepth(getViewZ(depth.x),cameraNearFar.x,cameraNearFar.y);depth.y=viewZToOrthographicDepth(getViewZ(depth.y),cameraNearFar.x,cameraNearFar.y);\\n#endif\\n#if DEPTH_TEST_STRATEGY == 0\\nbool keep=depthTest(depth.x,depth.y);\\n#elif DEPTH_TEST_STRATEGY == 1\\nbool keep=isMaxDepth||depthTest(depth.x,depth.y);\\n#else\\nbool keep=!isMaxDepth&&depthTest(depth.x,depth.y);\\n#endif\\nif(keep){gl_FragColor=texture2D(inputBuffer,vUv);}else{discard;}}\";\n\n// src/materials/DepthMaskMaterial.js\nvar DepthMaskMaterial = class extends ShaderMaterial10 {\n /**\n * Constructs a new depth mask material.\n */\n constructor() {\n super({\n name: \"DepthMaskMaterial\",\n defines: {\n DEPTH_EPSILON: \"0.0001\",\n DEPTH_PACKING_0: \"0\",\n DEPTH_PACKING_1: \"0\",\n DEPTH_TEST_STRATEGY: DepthTestStrategy.KEEP_MAX_DEPTH\n },\n uniforms: {\n inputBuffer: new Uniform10(null),\n depthBuffer0: new Uniform10(null),\n depthBuffer1: new Uniform10(null),\n cameraNearFar: new Uniform10(new Vector25(1, 1))\n },\n blending: NoBlending10,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: depth_mask_default,\n vertexShader: common_default\n });\n this.depthMode = LessDepth;\n }\n /**\n * The primary depth buffer.\n *\n * @type {Texture}\n */\n set depthBuffer0(value) {\n this.uniforms.depthBuffer0.value = value;\n }\n /**\n * The primary depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set depthPacking0(value) {\n this.defines.DEPTH_PACKING_0 = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the base depth buffer.\n *\n * @deprecated Use depthBuffer0 and depthPacking0 instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthBuffer0(buffer, depthPacking = BasicDepthPacking4) {\n this.depthBuffer0 = buffer;\n this.depthPacking0 = depthPacking;\n }\n /**\n * The secondary depth buffer.\n *\n * @type {Texture}\n */\n set depthBuffer1(value) {\n this.uniforms.depthBuffer1.value = value;\n }\n /**\n * The secondary depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set depthPacking1(value) {\n this.defines.DEPTH_PACKING_1 = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the depth buffer that will be compared with the base depth buffer.\n *\n * @deprecated Use depthBuffer1 and depthPacking1 instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthBuffer1(buffer, depthPacking = BasicDepthPacking4) {\n this.depthBuffer1 = buffer;\n this.depthPacking1 = depthPacking;\n }\n /**\n * The strategy for handling maximum depth.\n *\n * @type {DepthTestStrategy}\n */\n get maxDepthStrategy() {\n return Number(this.defines.DEPTH_TEST_STRATEGY);\n }\n set maxDepthStrategy(value) {\n this.defines.DEPTH_TEST_STRATEGY = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Indicates whether maximum depth values should be preserved.\n *\n * @type {Boolean}\n * @deprecated Use maxDepthStrategy instead.\n */\n get keepFar() {\n return this.maxDepthStrategy;\n }\n set keepFar(value) {\n this.maxDepthStrategy = value ? DepthTestStrategy.KEEP_MAX_DEPTH : DepthTestStrategy.DISCARD_MAX_DEPTH;\n }\n /**\n * Returns the strategy for dealing with maximum depth values.\n *\n * @deprecated Use maxDepthStrategy instead.\n * @return {DepthTestStrategy} The strategy.\n */\n getMaxDepthStrategy() {\n return this.maxDepthStrategy;\n }\n /**\n * Sets the strategy for dealing with maximum depth values.\n *\n * @deprecated Use maxDepthStrategy instead.\n * @param {DepthTestStrategy} value - The strategy.\n */\n setMaxDepthStrategy(value) {\n this.maxDepthStrategy = value;\n }\n /**\n * A small error threshold that is used for `EqualDepth` and `NotEqualDepth` tests. Default is `1e-4`.\n *\n * @type {Number}\n */\n get epsilon() {\n return Number(this.defines.DEPTH_EPSILON);\n }\n set epsilon(value) {\n this.defines.DEPTH_EPSILON = value.toFixed(16);\n this.needsUpdate = true;\n }\n /**\n * Returns the current error threshold for depth comparisons.\n *\n * @deprecated Use epsilon instead.\n * @return {Number} The error threshold.\n */\n getEpsilon() {\n return this.epsilon;\n }\n /**\n * Sets the depth comparison error threshold.\n *\n * @deprecated Use epsilon instead.\n * @param {Number} value - The new error threshold.\n */\n setEpsilon(value) {\n this.epsilon = value;\n }\n /**\n * The depth mode.\n *\n * @see https://threejs.org/docs/#api/en/constants/Materials\n * @type {DepthModes}\n */\n get depthMode() {\n return Number(this.defines.DEPTH_MODE);\n }\n set depthMode(value) {\n let depthTest;\n switch (value) {\n case NeverDepth:\n depthTest = \"false\";\n break;\n case AlwaysDepth:\n depthTest = \"true\";\n break;\n case EqualDepth:\n depthTest = \"abs(d1 - d0) <= DEPTH_EPSILON\";\n break;\n case NotEqualDepth:\n depthTest = \"abs(d1 - d0) > DEPTH_EPSILON\";\n break;\n case LessDepth:\n depthTest = \"d0 > d1\";\n break;\n case LessEqualDepth:\n depthTest = \"d0 >= d1\";\n break;\n case GreaterEqualDepth:\n depthTest = \"d0 <= d1\";\n break;\n case GreaterDepth:\n default:\n depthTest = \"d0 < d1\";\n break;\n }\n this.defines.DEPTH_MODE = value.toFixed(0);\n this.defines[\"depthTest(d0, d1)\"] = depthTest;\n this.needsUpdate = true;\n }\n /**\n * Returns the current depth mode.\n *\n * @deprecated Use depthMode instead.\n * @return {DepthModes} The depth mode. Default is `LessDepth`.\n */\n getDepthMode() {\n return this.depthMode;\n }\n /**\n * Sets the depth mode.\n *\n * @deprecated Use depthMode instead.\n * @param {DepthModes} mode - The depth mode.\n */\n setDepthMode(mode) {\n this.depthMode = mode;\n }\n /**\n * Copies the settings of the given camera.\n *\n * @deprecated Use copyCameraSettings instead.\n * @param {Camera} camera - A camera.\n */\n adoptCameraSettings(camera) {\n this.copyCameraSettings(camera);\n }\n /**\n * Copies the settings of the given camera.\n *\n * @param {Camera} camera - A camera.\n */\n copyCameraSettings(camera) {\n if (camera) {\n this.uniforms.cameraNearFar.value.set(camera.near, camera.far);\n if (camera instanceof PerspectiveCamera4) {\n this.defines.PERSPECTIVE_CAMERA = \"1\";\n } else {\n delete this.defines.PERSPECTIVE_CAMERA;\n }\n this.needsUpdate = true;\n }\n }\n};\n\n// src/materials/DownsamplingMaterial.js\nimport { NoBlending as NoBlending11, ShaderMaterial as ShaderMaterial11, Uniform as Uniform11, Vector2 as Vector26 } from \"three\";\n\n// src/materials/glsl/convolution.downsampling.frag\nvar convolution_downsampling_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#define WEIGHT_INNER 0.125\\n#define WEIGHT_OUTER 0.0555555\\nvarying vec2 vUv;varying vec2 vUv00;varying vec2 vUv01;varying vec2 vUv02;varying vec2 vUv03;varying vec2 vUv04;varying vec2 vUv05;varying vec2 vUv06;varying vec2 vUv07;varying vec2 vUv08;varying vec2 vUv09;varying vec2 vUv10;varying vec2 vUv11;float clampToBorder(const in vec2 uv){return float(uv.s>=0.0&&uv.s<=1.0&&uv.t>=0.0&&uv.t<=1.0);}void main(){vec4 c=vec4(0.0);vec4 w=WEIGHT_INNER*vec4(clampToBorder(vUv00),clampToBorder(vUv01),clampToBorder(vUv02),clampToBorder(vUv03));c+=w.x*texture2D(inputBuffer,vUv00);c+=w.y*texture2D(inputBuffer,vUv01);c+=w.z*texture2D(inputBuffer,vUv02);c+=w.w*texture2D(inputBuffer,vUv03);w=WEIGHT_OUTER*vec4(clampToBorder(vUv04),clampToBorder(vUv05),clampToBorder(vUv06),clampToBorder(vUv07));c+=w.x*texture2D(inputBuffer,vUv04);c+=w.y*texture2D(inputBuffer,vUv05);c+=w.z*texture2D(inputBuffer,vUv06);c+=w.w*texture2D(inputBuffer,vUv07);w=WEIGHT_OUTER*vec4(clampToBorder(vUv08),clampToBorder(vUv09),clampToBorder(vUv10),clampToBorder(vUv11));c+=w.x*texture2D(inputBuffer,vUv08);c+=w.y*texture2D(inputBuffer,vUv09);c+=w.z*texture2D(inputBuffer,vUv10);c+=w.w*texture2D(inputBuffer,vUv11);c+=WEIGHT_OUTER*texture2D(inputBuffer,vUv);gl_FragColor=c;\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.downsampling.vert\nvar convolution_downsampling_default2 = \"uniform vec2 texelSize;varying vec2 vUv;varying vec2 vUv00;varying vec2 vUv01;varying vec2 vUv02;varying vec2 vUv03;varying vec2 vUv04;varying vec2 vUv05;varying vec2 vUv06;varying vec2 vUv07;varying vec2 vUv08;varying vec2 vUv09;varying vec2 vUv10;varying vec2 vUv11;void main(){vUv=position.xy*0.5+0.5;vUv00=vUv+texelSize*vec2(-1.0,1.0);vUv01=vUv+texelSize*vec2(1.0,1.0);vUv02=vUv+texelSize*vec2(-1.0,-1.0);vUv03=vUv+texelSize*vec2(1.0,-1.0);vUv04=vUv+texelSize*vec2(-2.0,2.0);vUv05=vUv+texelSize*vec2(0.0,2.0);vUv06=vUv+texelSize*vec2(2.0,2.0);vUv07=vUv+texelSize*vec2(-2.0,0.0);vUv08=vUv+texelSize*vec2(2.0,0.0);vUv09=vUv+texelSize*vec2(-2.0,-2.0);vUv10=vUv+texelSize*vec2(0.0,-2.0);vUv11=vUv+texelSize*vec2(2.0,-2.0);gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/DownsamplingMaterial.js\nvar DownsamplingMaterial = class extends ShaderMaterial11 {\n /**\n * Constructs a new downsampling material.\n */\n constructor() {\n super({\n name: \"DownsamplingMaterial\",\n uniforms: {\n inputBuffer: new Uniform11(null),\n texelSize: new Uniform11(new Vector26())\n },\n blending: NoBlending11,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: convolution_downsampling_default,\n vertexShader: convolution_downsampling_default2\n });\n this.fragmentShader = updateFragmentShader(this.fragmentShader);\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.uniforms.texelSize.value.set(1 / width, 1 / height);\n }\n};\n\n// src/materials/EdgeDetectionMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking5, NoBlending as NoBlending12, REVISION as REVISION2, ShaderMaterial as ShaderMaterial12, Uniform as Uniform12, Vector2 as Vector27 } from \"three\";\n\n// src/materials/glsl/edge-detection.frag\nvar edge_detection_default = \"varying vec2 vUv;varying vec2 vUv0;varying vec2 vUv1;\\n#if THREE_REVISION < 143\\n#define luminance(v) linearToRelativeLuminance(v)\\n#endif\\n#if EDGE_DETECTION_MODE != 0\\nvarying vec2 vUv2;varying vec2 vUv3;varying vec2 vUv4;varying vec2 vUv5;\\n#endif\\n#if EDGE_DETECTION_MODE == 1\\n#include <common>\\n#endif\\n#if EDGE_DETECTION_MODE == 0 || PREDICATION_MODE == 1\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}vec3 gatherNeighbors(){float p=readDepth(vUv);float pLeft=readDepth(vUv0);float pTop=readDepth(vUv1);return vec3(p,pLeft,pTop);}\\n#elif PREDICATION_MODE == 2\\nuniform sampler2D predicationBuffer;vec3 gatherNeighbors(){float p=texture2D(predicationBuffer,vUv).r;float pLeft=texture2D(predicationBuffer,vUv0).r;float pTop=texture2D(predicationBuffer,vUv1).r;return vec3(p,pLeft,pTop);}\\n#endif\\n#if PREDICATION_MODE != 0\\nvec2 calculatePredicatedThreshold(){vec3 neighbours=gatherNeighbors();vec2 delta=abs(neighbours.xx-neighbours.yz);vec2 edges=step(PREDICATION_THRESHOLD,delta);return PREDICATION_SCALE*EDGE_THRESHOLD*(1.0-PREDICATION_STRENGTH*edges);}\\n#endif\\n#if EDGE_DETECTION_MODE != 0\\nuniform sampler2D inputBuffer;\\n#endif\\nvoid main(){\\n#if EDGE_DETECTION_MODE == 0\\nconst vec2 threshold=vec2(DEPTH_THRESHOLD);\\n#elif PREDICATION_MODE != 0\\nvec2 threshold=calculatePredicatedThreshold();\\n#else\\nconst vec2 threshold=vec2(EDGE_THRESHOLD);\\n#endif\\n#if EDGE_DETECTION_MODE == 0\\nvec3 neighbors=gatherNeighbors();vec2 delta=abs(neighbors.xx-vec2(neighbors.y,neighbors.z));vec2 edges=step(threshold,delta);if(dot(edges,vec2(1.0))==0.0){discard;}gl_FragColor=vec4(edges,0.0,1.0);\\n#elif EDGE_DETECTION_MODE == 1\\nfloat l=luminance(texture2D(inputBuffer,vUv).rgb);float lLeft=luminance(texture2D(inputBuffer,vUv0).rgb);float lTop=luminance(texture2D(inputBuffer,vUv1).rgb);vec4 delta;delta.xy=abs(l-vec2(lLeft,lTop));vec2 edges=step(threshold,delta.xy);if(dot(edges,vec2(1.0))==0.0){discard;}float lRight=luminance(texture2D(inputBuffer,vUv2).rgb);float lBottom=luminance(texture2D(inputBuffer,vUv3).rgb);delta.zw=abs(l-vec2(lRight,lBottom));vec2 maxDelta=max(delta.xy,delta.zw);float lLeftLeft=luminance(texture2D(inputBuffer,vUv4).rgb);float lTopTop=luminance(texture2D(inputBuffer,vUv5).rgb);delta.zw=abs(vec2(lLeft,lTop)-vec2(lLeftLeft,lTopTop));maxDelta=max(maxDelta.xy,delta.zw);float finalDelta=max(maxDelta.x,maxDelta.y);edges.xy*=step(finalDelta,LOCAL_CONTRAST_ADAPTATION_FACTOR*delta.xy);gl_FragColor=vec4(edges,0.0,1.0);\\n#elif EDGE_DETECTION_MODE == 2\\nvec4 delta;vec3 c=texture2D(inputBuffer,vUv).rgb;vec3 cLeft=texture2D(inputBuffer,vUv0).rgb;vec3 t=abs(c-cLeft);delta.x=max(max(t.r,t.g),t.b);vec3 cTop=texture2D(inputBuffer,vUv1).rgb;t=abs(c-cTop);delta.y=max(max(t.r,t.g),t.b);vec2 edges=step(threshold,delta.xy);if(dot(edges,vec2(1.0))==0.0){discard;}vec3 cRight=texture2D(inputBuffer,vUv2).rgb;t=abs(c-cRight);delta.z=max(max(t.r,t.g),t.b);vec3 cBottom=texture2D(inputBuffer,vUv3).rgb;t=abs(c-cBottom);delta.w=max(max(t.r,t.g),t.b);vec2 maxDelta=max(delta.xy,delta.zw);vec3 cLeftLeft=texture2D(inputBuffer,vUv4).rgb;t=abs(c-cLeftLeft);delta.z=max(max(t.r,t.g),t.b);vec3 cTopTop=texture2D(inputBuffer,vUv5).rgb;t=abs(c-cTopTop);delta.w=max(max(t.r,t.g),t.b);maxDelta=max(maxDelta.xy,delta.zw);float finalDelta=max(maxDelta.x,maxDelta.y);edges*=step(finalDelta,LOCAL_CONTRAST_ADAPTATION_FACTOR*delta.xy);gl_FragColor=vec4(edges,0.0,1.0);\\n#endif\\n}\";\n\n// src/materials/glsl/edge-detection.vert\nvar edge_detection_default2 = \"uniform vec2 texelSize;varying vec2 vUv;varying vec2 vUv0;varying vec2 vUv1;\\n#if EDGE_DETECTION_MODE != 0\\nvarying vec2 vUv2;varying vec2 vUv3;varying vec2 vUv4;varying vec2 vUv5;\\n#endif\\nvoid main(){vUv=position.xy*0.5+0.5;vUv0=vUv+texelSize*vec2(-1.0,0.0);vUv1=vUv+texelSize*vec2(0.0,-1.0);\\n#if EDGE_DETECTION_MODE != 0\\nvUv2=vUv+texelSize*vec2(1.0,0.0);vUv3=vUv+texelSize*vec2(0.0,1.0);vUv4=vUv+texelSize*vec2(-2.0,0.0);vUv5=vUv+texelSize*vec2(0.0,-2.0);\\n#endif\\ngl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/EdgeDetectionMaterial.js\nvar EdgeDetectionMaterial = class extends ShaderMaterial12 {\n /**\n * Constructs a new edge detection material.\n *\n * TODO Remove parameters.\n * @param {Vector2} [texelSize] - The screen texel size.\n * @param {EdgeDetectionMode} [mode=EdgeDetectionMode.COLOR] - The edge detection mode.\n */\n constructor(texelSize = new Vector27(), mode = EdgeDetectionMode.COLOR) {\n super({\n name: \"EdgeDetectionMaterial\",\n defines: {\n THREE_REVISION: REVISION2.replace(/\\D+/g, \"\"),\n LOCAL_CONTRAST_ADAPTATION_FACTOR: \"2.0\",\n EDGE_THRESHOLD: \"0.1\",\n DEPTH_THRESHOLD: \"0.01\",\n PREDICATION_MODE: \"0\",\n PREDICATION_THRESHOLD: \"0.01\",\n PREDICATION_SCALE: \"2.0\",\n PREDICATION_STRENGTH: \"1.0\",\n DEPTH_PACKING: \"0\"\n },\n uniforms: {\n inputBuffer: new Uniform12(null),\n depthBuffer: new Uniform12(null),\n predicationBuffer: new Uniform12(null),\n texelSize: new Uniform12(texelSize)\n },\n blending: NoBlending12,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: edge_detection_default,\n vertexShader: edge_detection_default2\n });\n this.edgeDetectionMode = mode;\n }\n /**\n * The depth buffer.\n *\n * @type {Texture}\n */\n set depthBuffer(value) {\n this.uniforms.depthBuffer.value = value;\n }\n /**\n * The depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set depthPacking(value) {\n this.defines.DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the depth buffer.\n *\n * @deprecated Use depthBuffer and depthPacking instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthBuffer(buffer, depthPacking = BasicDepthPacking5) {\n this.depthBuffer = buffer;\n this.depthPacking = depthPacking;\n }\n /**\n * The edge detection mode.\n *\n * @type {EdgeDetectionMode}\n */\n get edgeDetectionMode() {\n return Number(this.defines.EDGE_DETECTION_MODE);\n }\n set edgeDetectionMode(value) {\n this.defines.EDGE_DETECTION_MODE = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Returns the edge detection mode.\n *\n * @deprecated Use edgeDetectionMode instead.\n * @return {EdgeDetectionMode} The mode.\n */\n getEdgeDetectionMode() {\n return this.edgeDetectionMode;\n }\n /**\n * Sets the edge detection mode.\n *\n * @deprecated Use edgeDetectionMode instead.\n * @param {EdgeDetectionMode} value - The edge detection mode.\n */\n setEdgeDetectionMode(value) {\n this.edgeDetectionMode = value;\n }\n /**\n * The local contrast adaptation factor. Has no effect if the edge detection mode is set to DEPTH. Default is 2.0.\n *\n * If a neighbor edge has _factor_ times bigger contrast than the current edge, the edge will be discarded.\n *\n * This allows to eliminate spurious crossing edges and is based on the fact that if there is too much contrast in a\n * direction, the perceptual contrast in the other neighbors will be hidden.\n *\n * @type {Number}\n */\n get localContrastAdaptationFactor() {\n return Number(this.defines.LOCAL_CONTRAST_ADAPTATION_FACTOR);\n }\n set localContrastAdaptationFactor(value) {\n this.defines.LOCAL_CONTRAST_ADAPTATION_FACTOR = value.toFixed(\"6\");\n this.needsUpdate = true;\n }\n /**\n * Returns the local contrast adaptation factor.\n *\n * @deprecated Use localContrastAdaptationFactor instead.\n * @return {Number} The factor.\n */\n getLocalContrastAdaptationFactor() {\n return this.localContrastAdaptationFactor;\n }\n /**\n * Sets the local contrast adaptation factor. Has no effect if the edge detection mode is set to DEPTH.\n *\n * @deprecated Use localContrastAdaptationFactor instead.\n * @param {Number} value - The local contrast adaptation factor. Default is 2.0.\n */\n setLocalContrastAdaptationFactor(value) {\n this.localContrastAdaptationFactor = value;\n }\n /**\n * The edge detection threshold. Range: [0.0, 0.5].\n *\n * A lower value results in more edges being detected at the expense of performance.\n *\n * For luma- and chroma-based edge detection, 0.1 is a reasonable value and allows to catch most visible edges. 0.05\n * is a rather overkill value that allows to catch 'em all. Darker scenes may require an even lower threshold.\n *\n * If depth-based edge detection is used, the threshold will depend on the scene depth.\n *\n * @type {Number}\n */\n get edgeDetectionThreshold() {\n return Number(this.defines.EDGE_THRESHOLD);\n }\n set edgeDetectionThreshold(value) {\n this.defines.EDGE_THRESHOLD = value.toFixed(\"6\");\n this.defines.DEPTH_THRESHOLD = (value * 0.1).toFixed(\"6\");\n this.needsUpdate = true;\n }\n /**\n * Returns the edge detection threshold.\n *\n * @deprecated Use edgeDetectionThreshold instead.\n * @return {Number} The threshold.\n */\n getEdgeDetectionThreshold() {\n return this.edgeDetectionThreshold;\n }\n /**\n * Sets the edge detection threshold.\n *\n * @deprecated Use edgeDetectionThreshold instead.\n * @param {Number} value - The edge detection threshold. Range: [0.0, 0.5].\n */\n setEdgeDetectionThreshold(value) {\n this.edgeDetectionThreshold = value;\n }\n /**\n * The predication mode.\n *\n * Predicated thresholding allows to better preserve texture details and to improve edge detection using an additional\n * buffer such as a light accumulation or depth buffer.\n *\n * @type {PredicationMode}\n */\n get predicationMode() {\n return Number(this.defines.PREDICATION_MODE);\n }\n set predicationMode(value) {\n this.defines.PREDICATION_MODE = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Returns the predication mode.\n *\n * @deprecated Use predicationMode instead.\n * @return {PredicationMode} The mode.\n */\n getPredicationMode() {\n return this.predicationMode;\n }\n /**\n * Sets the predication mode.\n *\n * @deprecated Use predicationMode instead.\n * @param {PredicationMode} value - The predication mode.\n */\n setPredicationMode(value) {\n this.predicationMode = value;\n }\n /**\n * The predication buffer.\n *\n * @type {Texture}\n */\n set predicationBuffer(value) {\n this.uniforms.predicationBuffer.value = value;\n }\n /**\n * Sets a custom predication buffer.\n *\n * @deprecated Use predicationBuffer instead.\n * @param {Texture} value - The predication buffer.\n */\n setPredicationBuffer(value) {\n this.uniforms.predicationBuffer.value = value;\n }\n /**\n * The predication threshold.\n *\n * @type {Number}\n */\n get predicationThreshold() {\n return Number(this.defines.PREDICATION_THRESHOLD);\n }\n set predicationThreshold(value) {\n this.defines.PREDICATION_THRESHOLD = value.toFixed(\"6\");\n this.needsUpdate = true;\n }\n /**\n * Returns the predication threshold.\n *\n * @deprecated Use predicationThreshold instead.\n * @return {Number} The threshold.\n */\n getPredicationThreshold() {\n return this.predicationThreshold;\n }\n /**\n * Sets the predication threshold.\n *\n * @deprecated Use predicationThreshold instead.\n * @param {Number} value - The threshold.\n */\n setPredicationThreshold(value) {\n this.predicationThreshold = value;\n }\n /**\n * The predication scale. Range: [1.0, 5.0].\n *\n * Determines how much the edge detection threshold should be scaled when using predication.\n *\n * @type {Boolean|Texture|Number}\n */\n get predicationScale() {\n return Number(this.defines.PREDICATION_SCALE);\n }\n set predicationScale(value) {\n this.defines.PREDICATION_SCALE = value.toFixed(\"6\");\n this.needsUpdate = true;\n }\n /**\n * Returns the predication scale.\n *\n * @deprecated Use predicationScale instead.\n * @return {Number} The scale.\n */\n getPredicationScale() {\n return this.predicationScale;\n }\n /**\n * Sets the predication scale.\n *\n * @deprecated Use predicationScale instead.\n * @param {Number} value - The scale. Range: [1.0, 5.0].\n */\n setPredicationScale(value) {\n this.predicationScale = value;\n }\n /**\n * The predication strength. Range: [0.0, 1.0].\n *\n * Determines how much the edge detection threshold should be decreased locally when using predication.\n *\n * @type {Number}\n */\n get predicationStrength() {\n return Number(this.defines.PREDICATION_STRENGTH);\n }\n set predicationStrength(value) {\n this.defines.PREDICATION_STRENGTH = value.toFixed(\"6\");\n this.needsUpdate = true;\n }\n /**\n * Returns the predication strength.\n *\n * @deprecated Use predicationStrength instead.\n * @return {Number} The strength.\n */\n getPredicationStrength() {\n return this.predicationStrength;\n }\n /**\n * Sets the predication strength.\n *\n * @deprecated Use predicationStrength instead.\n * @param {Number} value - The strength. Range: [0.0, 1.0].\n */\n setPredicationStrength(value) {\n this.predicationStrength = value;\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.uniforms.texelSize.value.set(1 / width, 1 / height);\n }\n};\n\n// src/materials/EffectMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking6, NoBlending as NoBlending13, PerspectiveCamera as PerspectiveCamera5, REVISION as REVISION3, ShaderMaterial as ShaderMaterial13, Uniform as Uniform13, Vector2 as Vector28 } from \"three\";\n\n// src/materials/glsl/effect.frag\nvar effect_default = \"#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#define packFloatToRGBA(v) packDepthToRGBA(v)\\n#define unpackRGBAToFloat(v) unpackRGBAToDepth(v)\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#if DEPTH_PACKING == 3201\\nuniform lowp sampler2D depthBuffer;\\n#elif defined(GL_FRAGMENT_PRECISION_HIGH)\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nuniform vec2 resolution;uniform vec2 texelSize;uniform float cameraNear;uniform float cameraFar;uniform float aspect;uniform float time;varying vec2 vUv;\\n#if THREE_REVISION < 143\\n#define luminance(v) linearToRelativeLuminance(v)\\n#endif\\n#if THREE_REVISION >= 137\\nvec4 sRGBToLinear(const in vec4 value){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#endif\\nfloat readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}float getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNear,cameraFar);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNear,cameraFar);\\n#endif\\n}vec3 RGBToHCV(const in vec3 RGB){vec4 P=mix(vec4(RGB.bg,-1.0,2.0/3.0),vec4(RGB.gb,0.0,-1.0/3.0),step(RGB.b,RGB.g));vec4 Q=mix(vec4(P.xyw,RGB.r),vec4(RGB.r,P.yzx),step(P.x,RGB.r));float C=Q.x-min(Q.w,Q.y);float H=abs((Q.w-Q.y)/(6.0*C+EPSILON)+Q.z);return vec3(H,C,Q.x);}vec3 RGBToHSL(const in vec3 RGB){vec3 HCV=RGBToHCV(RGB);float L=HCV.z-HCV.y*0.5;float S=HCV.y/(1.0-abs(L*2.0-1.0)+EPSILON);return vec3(HCV.x,S,L);}vec3 HueToRGB(const in float H){float R=abs(H*6.0-3.0)-1.0;float G=2.0-abs(H*6.0-2.0);float B=2.0-abs(H*6.0-4.0);return clamp(vec3(R,G,B),0.0,1.0);}vec3 HSLToRGB(const in vec3 HSL){vec3 RGB=HueToRGB(HSL.x);float C=(1.0-abs(2.0*HSL.z-1.0))*HSL.y;return(RGB-0.5)*C+HSL.z;}FRAGMENT_HEAD void main(){FRAGMENT_MAIN_UV vec4 color0=texture2D(inputBuffer,UV);vec4 color1=vec4(0.0);FRAGMENT_MAIN_IMAGE gl_FragColor=color0;\\n#ifdef ENCODE_OUTPUT\\n#include <colorspace_fragment>\\n#endif\\n#include <dithering_fragment>\\n}\";\n\n// src/materials/glsl/effect.vert\nvar effect_default2 = \"uniform vec2 resolution;uniform vec2 texelSize;uniform float cameraNear;uniform float cameraFar;uniform float aspect;uniform float time;varying vec2 vUv;VERTEX_HEAD void main(){vUv=position.xy*0.5+0.5;VERTEX_MAIN_SUPPORT gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/EffectMaterial.js\nvar EffectMaterial = class extends ShaderMaterial13 {\n /**\n * Constructs a new effect material.\n *\n * @param {Map<String, String>} [shaderParts] - Deprecated. Use setShaderData instead.\n * @param {Map<String, String>} [defines] - Deprecated. Use setShaderData instead.\n * @param {Map<String, Uniform>} [uniforms] - Deprecated. Use setShaderData instead.\n * @param {Camera} [camera] - A camera.\n * @param {Boolean} [dithering=false] - Deprecated.\n */\n constructor(shaderParts, defines, uniforms, camera, dithering = false) {\n super({\n name: \"EffectMaterial\",\n defines: {\n THREE_REVISION: REVISION3.replace(/\\D+/g, \"\"),\n DEPTH_PACKING: \"0\",\n ENCODE_OUTPUT: \"1\"\n },\n uniforms: {\n inputBuffer: new Uniform13(null),\n depthBuffer: new Uniform13(null),\n resolution: new Uniform13(new Vector28()),\n texelSize: new Uniform13(new Vector28()),\n cameraNear: new Uniform13(0.3),\n cameraFar: new Uniform13(1e3),\n aspect: new Uniform13(1),\n time: new Uniform13(0)\n },\n blending: NoBlending13,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n dithering\n });\n if (shaderParts) {\n this.setShaderParts(shaderParts);\n }\n if (defines) {\n this.setDefines(defines);\n }\n if (uniforms) {\n this.setUniforms(uniforms);\n }\n this.copyCameraSettings(camera);\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Texture} value - The input buffer.\n */\n setInputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * The depth buffer.\n *\n * @type {Texture}\n */\n get depthBuffer() {\n return this.uniforms.depthBuffer.value;\n }\n set depthBuffer(value) {\n this.uniforms.depthBuffer.value = value;\n }\n /**\n * The depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n get depthPacking() {\n return Number(this.defines.DEPTH_PACKING);\n }\n set depthPacking(value) {\n this.defines.DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the depth buffer.\n *\n * @deprecated Use depthBuffer and depthPacking instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthBuffer(buffer, depthPacking = BasicDepthPacking6) {\n this.depthBuffer = buffer;\n this.depthPacking = depthPacking;\n }\n /**\n * Sets the shader data.\n *\n * @param {EffectShaderData} data - The shader data.\n * @return {EffectMaterial} This material.\n */\n setShaderData(data) {\n this.setShaderParts(data.shaderParts);\n this.setDefines(data.defines);\n this.setUniforms(data.uniforms);\n this.setExtensions(data.extensions);\n }\n /**\n * Sets the shader parts.\n *\n * @deprecated Use setShaderData instead.\n * @param {Map<String, String>} shaderParts - A collection of shader snippets. See {@link EffectShaderSection}.\n * @return {EffectMaterial} This material.\n */\n setShaderParts(shaderParts) {\n this.fragmentShader = effect_default.replace(EffectShaderSection.FRAGMENT_HEAD, shaderParts.get(EffectShaderSection.FRAGMENT_HEAD) || \"\").replace(EffectShaderSection.FRAGMENT_MAIN_UV, shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_UV) || \"\").replace(EffectShaderSection.FRAGMENT_MAIN_IMAGE, shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_IMAGE) || \"\");\n this.vertexShader = effect_default2.replace(EffectShaderSection.VERTEX_HEAD, shaderParts.get(EffectShaderSection.VERTEX_HEAD) || \"\").replace(EffectShaderSection.VERTEX_MAIN_SUPPORT, shaderParts.get(EffectShaderSection.VERTEX_MAIN_SUPPORT) || \"\");\n this.fragmentShader = updateFragmentShader(this.fragmentShader);\n this.needsUpdate = true;\n return this;\n }\n /**\n * Sets the shader macros.\n *\n * @deprecated Use setShaderData instead.\n * @param {Map<String, String>} defines - A collection of preprocessor macro definitions.\n * @return {EffectMaterial} This material.\n */\n setDefines(defines) {\n for (const entry of defines.entries()) {\n this.defines[entry[0]] = entry[1];\n }\n this.needsUpdate = true;\n return this;\n }\n /**\n * Sets the shader uniforms.\n *\n * @deprecated Use setShaderData instead.\n * @param {Map<String, Uniform>} uniforms - A collection of uniforms.\n * @return {EffectMaterial} This material.\n */\n setUniforms(uniforms) {\n for (const entry of uniforms.entries()) {\n this.uniforms[entry[0]] = entry[1];\n }\n return this;\n }\n /**\n * Sets the required shader extensions.\n *\n * @deprecated Use setShaderData instead.\n * @param {Set<WebGLExtension>} extensions - A collection of extensions.\n * @return {EffectMaterial} This material.\n */\n setExtensions(extensions) {\n this.extensions = {};\n for (const extension of extensions) {\n this.extensions[extension] = true;\n }\n return this;\n }\n /**\n * Indicates whether output encoding is enabled.\n *\n * @type {Boolean}\n */\n get encodeOutput() {\n return this.defines.ENCODE_OUTPUT !== void 0;\n }\n set encodeOutput(value) {\n if (this.encodeOutput !== value) {\n if (value) {\n this.defines.ENCODE_OUTPUT = \"1\";\n } else {\n delete this.defines.ENCODE_OUTPUT;\n }\n this.needsUpdate = true;\n }\n }\n /**\n * Indicates whether output encoding is enabled.\n *\n * @deprecated Use encodeOutput instead.\n * @return {Boolean} Whether output encoding is enabled.\n */\n isOutputEncodingEnabled(value) {\n return this.encodeOutput;\n }\n /**\n * Enables or disables output encoding.\n *\n * @deprecated Use encodeOutput instead.\n * @param {Boolean} value - Whether output encoding should be enabled.\n */\n setOutputEncodingEnabled(value) {\n this.encodeOutput = value;\n }\n /**\n * The time in seconds.\n *\n * @type {Number}\n */\n get time() {\n return this.uniforms.time.value;\n }\n set time(value) {\n this.uniforms.time.value = value;\n }\n /**\n * Sets the delta time.\n *\n * @deprecated Use time instead.\n * @param {Number} value - The delta time in seconds.\n */\n setDeltaTime(value) {\n this.uniforms.time.value += value;\n }\n /**\n * Copies the settings of the given camera.\n *\n * @deprecated Use copyCameraSettings instead.\n * @param {Camera} camera - A camera.\n */\n adoptCameraSettings(camera) {\n this.copyCameraSettings(camera);\n }\n /**\n * Copies the settings of the given camera.\n *\n * @param {Camera} camera - A camera.\n */\n copyCameraSettings(camera) {\n if (camera) {\n this.uniforms.cameraNear.value = camera.near;\n this.uniforms.cameraFar.value = camera.far;\n if (camera instanceof PerspectiveCamera5) {\n this.defines.PERSPECTIVE_CAMERA = \"1\";\n } else {\n delete this.defines.PERSPECTIVE_CAMERA;\n }\n this.needsUpdate = true;\n }\n }\n /**\n * Sets the resolution.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const uniforms = this.uniforms;\n uniforms.resolution.value.set(width, height);\n uniforms.texelSize.value.set(1 / width, 1 / height);\n uniforms.aspect.value = width / height;\n }\n /**\n * An enumeration of shader code placeholders.\n *\n * @deprecated Use EffectShaderSection instead.\n * @type {Object}\n */\n static get Section() {\n return EffectShaderSection;\n }\n};\n\n// src/materials/GaussianBlurMaterial.js\nimport { NoBlending as NoBlending14, ShaderMaterial as ShaderMaterial14, Uniform as Uniform14, Vector2 as Vector29 } from \"three\";\n\n// src/materials/glsl/convolution.gaussian.frag\nvar convolution_gaussian_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform vec2 kernel[STEPS];varying vec2 vOffset;varying vec2 vUv;void main(){vec4 result=texture2D(inputBuffer,vUv)*kernel[0].y;for(int i=1;i<STEPS;++i){vec2 offset=kernel[i].x*vOffset;vec4 c0=texture2D(inputBuffer,vUv+offset);vec4 c1=texture2D(inputBuffer,vUv-offset);result+=(c0+c1)*kernel[i].y;}gl_FragColor=result;\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.gaussian.vert\nvar convolution_gaussian_default2 = \"uniform vec2 texelSize;uniform vec2 direction;uniform float scale;varying vec2 vOffset;varying vec2 vUv;void main(){vOffset=direction*texelSize*scale;vUv=position.xy*0.5+0.5;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/GaussianBlurMaterial.js\nvar GaussianBlurMaterial = class extends ShaderMaterial14 {\n /**\n * Constructs a new convolution material.\n *\n * @param {Object} [options] - The options.\n * @param {Number} [options.kernelSize=35] - The kernel size.\n */\n constructor({ kernelSize = 35 } = {}) {\n super({\n name: \"GaussianBlurMaterial\",\n uniforms: {\n inputBuffer: new Uniform14(null),\n texelSize: new Uniform14(new Vector29()),\n direction: new Uniform14(new Vector29()),\n kernel: new Uniform14(null),\n scale: new Uniform14(1)\n },\n blending: NoBlending14,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: convolution_gaussian_default,\n vertexShader: convolution_gaussian_default2\n });\n this.fragmentShader = updateFragmentShader(this.fragmentShader);\n this._kernelSize = 0;\n this.kernelSize = kernelSize;\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * The kernel size.\n *\n * @type {Number}\n */\n get kernelSize() {\n return this._kernelSize;\n }\n set kernelSize(value) {\n this._kernelSize = value;\n this.generateKernel(value);\n }\n /**\n * The blur direction.\n *\n * @type {Vector2}\n */\n get direction() {\n return this.uniforms.direction.value;\n }\n /**\n * The blur kernel scale. Values greater than 1.0 may introduce artifacts.\n *\n * @type {Number}\n */\n get scale() {\n return this.uniforms.scale.value;\n }\n set scale(value) {\n this.uniforms.scale.value = value;\n }\n /**\n * Generates the Gauss kernel.\n *\n * @param {KernelSize} kernelSize - The kernel size. Should be an odd number.\n * @private\n */\n generateKernel(kernelSize) {\n const kernel = new GaussKernel(kernelSize);\n const steps = kernel.linearSteps;\n const kernelData = new Float64Array(steps * 2);\n for (let i = 0, j = 0; i < steps; ++i) {\n kernelData[j++] = kernel.linearOffsets[i];\n kernelData[j++] = kernel.linearWeights[i];\n }\n this.uniforms.kernel.value = kernelData;\n this.defines.STEPS = steps.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.uniforms.texelSize.value.set(1 / width, 1 / height);\n }\n};\n\n// src/materials/GodRaysMaterial.js\nimport { NoBlending as NoBlending15, ShaderMaterial as ShaderMaterial15, Uniform as Uniform15 } from \"three\";\n\n// src/materials/glsl/convolution.god-rays.frag\nvar convolution_god_rays_default = \"#include <common>\\n#include <dithering_pars_fragment>\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform vec2 lightPosition;uniform float exposure;uniform float decay;uniform float density;uniform float weight;uniform float clampMax;varying vec2 vUv;void main(){vec2 coord=vUv;vec2 delta=lightPosition-coord;delta*=1.0/SAMPLES_FLOAT*density;float illuminationDecay=1.0;vec4 color=vec4(0.0);for(int i=0;i<SAMPLES_INT;++i){coord+=delta;vec4 texel=texture2D(inputBuffer,coord);texel*=illuminationDecay*weight;color+=texel;illuminationDecay*=decay;}gl_FragColor=clamp(color*exposure,0.0,clampMax);\\n#include <dithering_fragment>\\n}\";\n\n// src/materials/GodRaysMaterial.js\nvar GodRaysMaterial = class extends ShaderMaterial15 {\n /**\n * Constructs a new god rays material.\n *\n * TODO Remove lightPosition param.\n * @param {Vector2} lightPosition - Deprecated.\n */\n constructor(lightPosition) {\n super({\n name: \"GodRaysMaterial\",\n defines: {\n SAMPLES_INT: \"60\",\n SAMPLES_FLOAT: \"60.0\"\n },\n uniforms: {\n inputBuffer: new Uniform15(null),\n lightPosition: new Uniform15(lightPosition),\n density: new Uniform15(1),\n decay: new Uniform15(1),\n weight: new Uniform15(1),\n exposure: new Uniform15(1),\n clampMax: new Uniform15(1)\n },\n blending: NoBlending15,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: convolution_god_rays_default,\n vertexShader: common_default\n });\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Texture} value - The input buffer.\n */\n setInputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * The screen space position of the light source.\n *\n * @type {Vector2}\n */\n get lightPosition() {\n return this.uniforms.lightPosition.value;\n }\n /**\n * Returns the screen space position of the light source.\n *\n * @deprecated Use lightPosition instead.\n * @return {Vector2} The position.\n */\n getLightPosition() {\n return this.uniforms.lightPosition.value;\n }\n /**\n * Sets the screen space position of the light source.\n *\n * @deprecated Use lightPosition instead.\n * @param {Vector2} value - The position.\n */\n setLightPosition(value) {\n this.uniforms.lightPosition.value = value;\n }\n /**\n * The density.\n *\n * @type {Number}\n */\n get density() {\n return this.uniforms.density.value;\n }\n set density(value) {\n this.uniforms.density.value = value;\n }\n /**\n * Returns the density.\n *\n * @deprecated Use density instead.\n * @return {Number} The density.\n */\n getDensity() {\n return this.uniforms.density.value;\n }\n /**\n * Sets the density.\n *\n * @deprecated Use density instead.\n * @param {Number} value - The density.\n */\n setDensity(value) {\n this.uniforms.density.value = value;\n }\n /**\n * The decay.\n *\n * @type {Number}\n */\n get decay() {\n return this.uniforms.decay.value;\n }\n set decay(value) {\n this.uniforms.decay.value = value;\n }\n /**\n * Returns the decay.\n *\n * @deprecated Use decay instead.\n * @return {Number} The decay.\n */\n getDecay() {\n return this.uniforms.decay.value;\n }\n /**\n * Sets the decay.\n *\n * @deprecated Use decay instead.\n * @param {Number} value - The decay.\n */\n setDecay(value) {\n this.uniforms.decay.value = value;\n }\n /**\n * The weight.\n *\n * @type {Number}\n */\n get weight() {\n return this.uniforms.weight.value;\n }\n set weight(value) {\n this.uniforms.weight.value = value;\n }\n /**\n * Returns the weight.\n *\n * @deprecated Use weight instead.\n * @return {Number} The weight.\n */\n getWeight() {\n return this.uniforms.weight.value;\n }\n /**\n * Sets the weight.\n *\n * @deprecated Use weight instead.\n * @param {Number} value - The weight.\n */\n setWeight(value) {\n this.uniforms.weight.value = value;\n }\n /**\n * The exposure.\n *\n * @type {Number}\n */\n get exposure() {\n return this.uniforms.exposure.value;\n }\n set exposure(value) {\n this.uniforms.exposure.value = value;\n }\n /**\n * Returns the exposure.\n *\n * @deprecated Use exposure instead.\n * @return {Number} The exposure.\n */\n getExposure() {\n return this.uniforms.exposure.value;\n }\n /**\n * Sets the exposure.\n *\n * @deprecated Use exposure instead.\n * @param {Number} value - The exposure.\n */\n setExposure(value) {\n this.uniforms.exposure.value = value;\n }\n /**\n * The maximum light intensity.\n *\n * @type {Number}\n */\n get maxIntensity() {\n return this.uniforms.clampMax.value;\n }\n set maxIntensity(value) {\n this.uniforms.clampMax.value = value;\n }\n /**\n * Returns the maximum light intensity.\n *\n * @deprecated Use maxIntensity instead.\n * @return {Number} The maximum light intensity.\n */\n getMaxIntensity() {\n return this.uniforms.clampMax.value;\n }\n /**\n * Sets the maximum light intensity.\n *\n * @deprecated Use maxIntensity instead.\n * @param {Number} value - The maximum light intensity.\n */\n setMaxIntensity(value) {\n this.uniforms.clampMax.value = value;\n }\n /**\n * The amount of samples per pixel.\n *\n * @type {Number}\n */\n get samples() {\n return Number(this.defines.SAMPLES_INT);\n }\n set samples(value) {\n const s = Math.floor(value);\n this.defines.SAMPLES_INT = s.toFixed(0);\n this.defines.SAMPLES_FLOAT = s.toFixed(1);\n this.needsUpdate = true;\n }\n /**\n * Returns the amount of samples per pixel.\n *\n * @deprecated Use samples instead.\n * @return {Number} The sample count.\n */\n getSamples() {\n return this.samples;\n }\n /**\n * Sets the amount of samples per pixel.\n *\n * @deprecated Use samples instead.\n * @param {Number} value - The sample count.\n */\n setSamples(value) {\n this.samples = value;\n }\n};\n\n// src/materials/LuminanceMaterial.js\nimport { NoBlending as NoBlending16, REVISION as REVISION4, ShaderMaterial as ShaderMaterial16, Uniform as Uniform16 } from \"three\";\n\n// src/materials/glsl/luminance.frag\nvar luminance_default = \"#include <common>\\n#if THREE_REVISION < 143\\n#define luminance(v) linearToRelativeLuminance(v)\\n#endif\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#ifdef RANGE\\nuniform vec2 range;\\n#elif defined(THRESHOLD)\\nuniform float threshold;uniform float smoothing;\\n#endif\\nvarying vec2 vUv;void main(){vec4 texel=texture2D(inputBuffer,vUv);float l=luminance(texel.rgb);\\n#ifdef RANGE\\nfloat low=step(range.x,l);float high=step(l,range.y);l*=low*high;\\n#elif defined(THRESHOLD)\\nl=smoothstep(threshold,threshold+smoothing,l);\\n#endif\\n#ifdef COLOR\\ngl_FragColor=vec4(texel.rgb*l,l);\\n#else\\ngl_FragColor=vec4(l);\\n#endif\\n}\";\n\n// src/materials/LuminanceMaterial.js\nvar LuminanceMaterial = class extends ShaderMaterial16 {\n /**\n * Constructs a new luminance material.\n *\n * @param {Boolean} [colorOutput=false] - Defines whether the shader should output colors scaled with their luminance value.\n * @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range.\n */\n constructor(colorOutput = false, luminanceRange = null) {\n super({\n name: \"LuminanceMaterial\",\n defines: {\n THREE_REVISION: REVISION4.replace(/\\D+/g, \"\")\n },\n uniforms: {\n inputBuffer: new Uniform16(null),\n threshold: new Uniform16(0),\n smoothing: new Uniform16(1),\n range: new Uniform16(null)\n },\n blending: NoBlending16,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: luminance_default,\n vertexShader: common_default\n });\n this.colorOutput = colorOutput;\n this.luminanceRange = luminanceRange;\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Texture} value - The input buffer.\n */\n setInputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * The luminance threshold.\n *\n * @type {Number}\n */\n get threshold() {\n return this.uniforms.threshold.value;\n }\n set threshold(value) {\n if (this.smoothing > 0 || value > 0) {\n this.defines.THRESHOLD = \"1\";\n } else {\n delete this.defines.THRESHOLD;\n }\n this.uniforms.threshold.value = value;\n }\n /**\n * Returns the luminance threshold.\n *\n * @deprecated Use threshold instead.\n * @return {Number} The threshold.\n */\n getThreshold() {\n return this.threshold;\n }\n /**\n * Sets the luminance threshold.\n *\n * @deprecated Use threshold instead.\n * @param {Number} value - The threshold.\n */\n setThreshold(value) {\n this.threshold = value;\n }\n /**\n * The luminance threshold smoothing.\n *\n * @type {Number}\n */\n get smoothing() {\n return this.uniforms.smoothing.value;\n }\n set smoothing(value) {\n if (this.threshold > 0 || value > 0) {\n this.defines.THRESHOLD = \"1\";\n } else {\n delete this.defines.THRESHOLD;\n }\n this.uniforms.smoothing.value = value;\n }\n /**\n * Returns the luminance threshold smoothing factor.\n *\n * @deprecated Use smoothing instead.\n * @return {Number} The smoothing factor.\n */\n getSmoothingFactor() {\n return this.smoothing;\n }\n /**\n * Sets the luminance threshold smoothing factor.\n *\n * @deprecated Use smoothing instead.\n * @param {Number} value - The smoothing factor.\n */\n setSmoothingFactor(value) {\n this.smoothing = value;\n }\n /**\n * Indicates whether the luminance threshold is enabled.\n *\n * @type {Boolean}\n * @deprecated Adjust the threshold or smoothing factor instead.\n */\n get useThreshold() {\n return this.threshold > 0 || this.smoothing > 0;\n }\n set useThreshold(value) {\n }\n /**\n * Indicates whether color output is enabled.\n *\n * @type {Boolean}\n */\n get colorOutput() {\n return this.defines.COLOR !== void 0;\n }\n set colorOutput(value) {\n if (value) {\n this.defines.COLOR = \"1\";\n } else {\n delete this.defines.COLOR;\n }\n this.needsUpdate = true;\n }\n /**\n * Indicates whether color output is enabled.\n *\n * @deprecated Use colorOutput instead.\n * @return {Boolean} Whether color output is enabled.\n */\n isColorOutputEnabled(value) {\n return this.colorOutput;\n }\n /**\n * Enables or disables color output.\n *\n * @deprecated Use colorOutput instead.\n * @param {Boolean} value - Whether color output should be enabled.\n */\n setColorOutputEnabled(value) {\n this.colorOutput = value;\n }\n /**\n * Indicates whether luminance masking is enabled.\n *\n * @type {Boolean}\n * @deprecated\n */\n get useRange() {\n return this.luminanceRange !== null;\n }\n set useRange(value) {\n this.luminanceRange = null;\n }\n /**\n * The luminance range. Set to null to disable.\n *\n * @type {Boolean}\n */\n get luminanceRange() {\n return this.uniforms.range.value;\n }\n set luminanceRange(value) {\n if (value !== null) {\n this.defines.RANGE = \"1\";\n } else {\n delete this.defines.RANGE;\n }\n this.uniforms.range.value = value;\n this.needsUpdate = true;\n }\n /**\n * Returns the current luminance range.\n *\n * @deprecated Use luminanceRange instead.\n * @return {Vector2} The luminance range.\n */\n getLuminanceRange() {\n return this.luminanceRange;\n }\n /**\n * Sets a luminance range. Set to null to disable.\n *\n * @deprecated Use luminanceRange instead.\n * @param {Vector2} value - The luminance range.\n */\n setLuminanceRange(value) {\n this.luminanceRange = value;\n }\n};\n\n// src/materials/MaskMaterial.js\nimport { NoBlending as NoBlending17, ShaderMaterial as ShaderMaterial17, Uniform as Uniform17, UnsignedByteType } from \"three\";\n\n// src/materials/glsl/mask.frag\nvar mask_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\n#ifdef MASK_PRECISION_HIGH\\nuniform mediump sampler2D maskTexture;\\n#else\\nuniform lowp sampler2D maskTexture;\\n#endif\\n#if MASK_FUNCTION != 0\\nuniform float strength;\\n#endif\\nvarying vec2 vUv;void main(){\\n#if COLOR_CHANNEL == 0\\nfloat mask=texture2D(maskTexture,vUv).r;\\n#elif COLOR_CHANNEL == 1\\nfloat mask=texture2D(maskTexture,vUv).g;\\n#elif COLOR_CHANNEL == 2\\nfloat mask=texture2D(maskTexture,vUv).b;\\n#else\\nfloat mask=texture2D(maskTexture,vUv).a;\\n#endif\\n#if MASK_FUNCTION == 0\\n#ifdef INVERTED\\nmask=step(mask,0.0);\\n#else\\nmask=1.0-step(mask,0.0);\\n#endif\\n#else\\nmask=clamp(mask*strength,0.0,1.0);\\n#ifdef INVERTED\\nmask=1.0-mask;\\n#endif\\n#endif\\n#if MASK_FUNCTION == 2\\ngl_FragColor=vec4(mask*texture2D(inputBuffer,vUv).rgb,mask);\\n#else\\ngl_FragColor=mask*texture2D(inputBuffer,vUv);\\n#endif\\n}\";\n\n// src/materials/MaskMaterial.js\nvar MaskMaterial = class extends ShaderMaterial17 {\n /**\n * Constructs a new mask material.\n *\n * @param {Texture} [maskTexture] - The mask texture.\n */\n constructor(maskTexture = null) {\n super({\n name: \"MaskMaterial\",\n uniforms: {\n maskTexture: new Uniform17(maskTexture),\n inputBuffer: new Uniform17(null),\n strength: new Uniform17(1)\n },\n blending: NoBlending17,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: mask_default,\n vertexShader: common_default\n });\n this.colorChannel = ColorChannel.RED;\n this.maskFunction = MaskFunction.DISCARD;\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Texture} value - The input buffer.\n */\n setInputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * The mask texture.\n *\n * @type {Texture}\n */\n set maskTexture(value) {\n this.uniforms.maskTexture.value = value;\n delete this.defines.MASK_PRECISION_HIGH;\n if (value.type !== UnsignedByteType) {\n this.defines.MASK_PRECISION_HIGH = \"1\";\n }\n this.needsUpdate = true;\n }\n /**\n * Sets the mask texture.\n *\n * @deprecated Use maskTexture instead.\n * @param {Texture} value - The texture.\n */\n setMaskTexture(value) {\n this.maskTexture = value;\n }\n /**\n * Sets the color channel to use for masking. Default is `ColorChannel.RED`.\n *\n * @type {ColorChannel}\n */\n set colorChannel(value) {\n this.defines.COLOR_CHANNEL = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the color channel to use for masking. Default is `ColorChannel.RED`.\n *\n * @deprecated Use colorChannel instead.\n * @param {ColorChannel} value - The channel.\n */\n setColorChannel(value) {\n this.colorChannel = value;\n }\n /**\n * The masking technique. Default is `MaskFunction.DISCARD`.\n *\n * @type {MaskFunction}\n */\n set maskFunction(value) {\n this.defines.MASK_FUNCTION = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the masking technique. Default is `MaskFunction.DISCARD`.\n *\n * @deprecated Use maskFunction instead.\n * @param {MaskFunction} value - The function.\n */\n setMaskFunction(value) {\n this.maskFunction = value;\n }\n /**\n * Indicates whether the masking is inverted.\n *\n * @type {Boolean}\n */\n get inverted() {\n return this.defines.INVERTED !== void 0;\n }\n set inverted(value) {\n if (this.inverted && !value) {\n delete this.defines.INVERTED;\n } else if (value) {\n this.defines.INVERTED = \"1\";\n }\n this.needsUpdate = true;\n }\n /**\n * Indicates whether the masking is inverted.\n *\n * @deprecated Use inverted instead.\n * @return {Boolean} Whether the masking is inverted.\n */\n isInverted() {\n return this.inverted;\n }\n /**\n * Determines whether the masking should be inverted.\n *\n * @deprecated Use inverted instead.\n * @param {Boolean} value - Whether the masking should be inverted.\n */\n setInverted(value) {\n this.inverted = value;\n }\n /**\n * The current mask strength.\n *\n * Individual mask values will be clamped to [0.0, 1.0]. Has no effect when the mask function is set to `DISCARD`.\n *\n * @type {Number}\n */\n get strength() {\n return this.uniforms.strength.value;\n }\n set strength(value) {\n this.uniforms.strength.value = value;\n }\n /**\n * Returns the current mask strength.\n *\n * @deprecated Use strength instead.\n * @return {Number} The mask strength.\n */\n getStrength() {\n return this.strength;\n }\n /**\n * Sets the mask strength.\n *\n * Has no effect when the mask function is set to `DISCARD`.\n *\n * @deprecated Use strength instead.\n * @param {Number} value - The mask strength.\n */\n setStrength(value) {\n this.strength = value;\n }\n};\n\n// src/materials/OutlineMaterial.js\nimport { NoBlending as NoBlending18, ShaderMaterial as ShaderMaterial18, Uniform as Uniform18, Vector2 as Vector210 } from \"three\";\n\n// src/materials/glsl/outline.frag\nvar outline_default = \"uniform lowp sampler2D inputBuffer;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec2 c0=texture2D(inputBuffer,vUv0).rg;vec2 c1=texture2D(inputBuffer,vUv1).rg;vec2 c2=texture2D(inputBuffer,vUv2).rg;vec2 c3=texture2D(inputBuffer,vUv3).rg;float d0=(c0.x-c1.x)*0.5;float d1=(c2.x-c3.x)*0.5;float d=length(vec2(d0,d1));float a0=min(c0.y,c1.y);float a1=min(c2.y,c3.y);float visibilityFactor=min(a0,a1);gl_FragColor.rg=(1.0-visibilityFactor>0.001)?vec2(d,0.0):vec2(0.0,d);}\";\n\n// src/materials/glsl/outline.vert\nvar outline_default2 = \"uniform vec2 texelSize;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;void main(){vec2 uv=position.xy*0.5+0.5;vUv0=vec2(uv.x+texelSize.x,uv.y);vUv1=vec2(uv.x-texelSize.x,uv.y);vUv2=vec2(uv.x,uv.y+texelSize.y);vUv3=vec2(uv.x,uv.y-texelSize.y);gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/OutlineMaterial.js\nvar OutlineMaterial = class extends ShaderMaterial18 {\n /**\n * Constructs a new outline material.\n *\n * TODO Remove texelSize param.\n * @param {Vector2} [texelSize] - The screen texel size.\n */\n constructor(texelSize = new Vector210()) {\n super({\n name: \"OutlineMaterial\",\n uniforms: {\n inputBuffer: new Uniform18(null),\n texelSize: new Uniform18(new Vector210())\n },\n blending: NoBlending18,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: outline_default,\n vertexShader: outline_default2\n });\n this.uniforms.texelSize.value.set(texelSize.x, texelSize.y);\n this.uniforms.maskTexture = this.uniforms.inputBuffer;\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Texture} value - The input buffer.\n */\n setInputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the texel size.\n *\n * @deprecated Use setSize() instead.\n * @param {Number} x - The texel width.\n * @param {Number} y - The texel height.\n */\n setTexelSize(x, y) {\n this.uniforms.texelSize.value.set(x, y);\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.uniforms.texelSize.value.set(1 / width, 1 / height);\n }\n};\n\n// src/materials/SMAAWeightsMaterial.js\nimport { NoBlending as NoBlending19, ShaderMaterial as ShaderMaterial19, Uniform as Uniform19, Vector2 as Vector211 } from \"three\";\n\n// src/materials/glsl/smaa-weights.frag\nvar smaa_weights_default = \"#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + offset * texelSize)\\n#if __VERSION__ < 300\\n#define round(v) floor(v + 0.5)\\n#endif\\n#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform lowp sampler2D areaTexture;uniform lowp sampler2D searchTexture;uniform vec2 texelSize;uniform vec2 resolution;varying vec2 vUv;varying vec4 vOffset[3];varying vec2 vPixCoord;void movec(const in bvec2 c,inout vec2 variable,const in vec2 value){if(c.x){variable.x=value.x;}if(c.y){variable.y=value.y;}}void movec(const in bvec4 c,inout vec4 variable,const in vec4 value){movec(c.xy,variable.xy,value.xy);movec(c.zw,variable.zw,value.zw);}vec2 decodeDiagBilinearAccess(in vec2 e){e.r=e.r*abs(5.0*e.r-5.0*0.75);return round(e);}vec4 decodeDiagBilinearAccess(in vec4 e){e.rb=e.rb*abs(5.0*e.rb-5.0*0.75);return round(e);}vec2 searchDiag1(const in vec2 texCoord,const in vec2 dir,out vec2 e){vec4 coord=vec4(texCoord,-1.0,1.0);vec3 t=vec3(texelSize,1.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(coord.z<float(MAX_SEARCH_STEPS_DIAG_INT-1)&&coord.w>0.9)){break;}coord.xyz=t*vec3(dir,1.0)+coord.xyz;e=texture2D(inputBuffer,coord.xy).rg;coord.w=dot(e,vec2(0.5));}return coord.zw;}vec2 searchDiag2(const in vec2 texCoord,const in vec2 dir,out vec2 e){vec4 coord=vec4(texCoord,-1.0,1.0);coord.x+=0.25*texelSize.x;vec3 t=vec3(texelSize,1.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(coord.z<float(MAX_SEARCH_STEPS_DIAG_INT-1)&&coord.w>0.9)){break;}coord.xyz=t*vec3(dir,1.0)+coord.xyz;e=texture2D(inputBuffer,coord.xy).rg;e=decodeDiagBilinearAccess(e);coord.w=dot(e,vec2(0.5));}return coord.zw;}vec2 areaDiag(const in vec2 dist,const in vec2 e,const in float offset){vec2 texCoord=vec2(AREATEX_MAX_DISTANCE_DIAG,AREATEX_MAX_DISTANCE_DIAG)*e+dist;texCoord=AREATEX_PIXEL_SIZE*texCoord+0.5*AREATEX_PIXEL_SIZE;texCoord.x+=0.5;texCoord.y+=AREATEX_SUBTEX_SIZE*offset;return texture2D(areaTexture,texCoord).rg;}vec2 calculateDiagWeights(const in vec2 texCoord,const in vec2 e,const in vec4 subsampleIndices){vec2 weights=vec2(0.0);vec4 d;vec2 end;if(e.r>0.0){d.xz=searchDiag1(texCoord,vec2(-1.0,1.0),end);d.x+=float(end.y>0.9);}else{d.xz=vec2(0.0);}d.yw=searchDiag1(texCoord,vec2(1.0,-1.0),end);if(d.x+d.y>2.0){vec4 coords=vec4(-d.x+0.25,d.x,d.y,-d.y-0.25)*texelSize.xyxy+texCoord.xyxy;vec4 c;c.xy=sampleLevelZeroOffset(inputBuffer,coords.xy,vec2(-1,0)).rg;c.zw=sampleLevelZeroOffset(inputBuffer,coords.zw,vec2(1,0)).rg;c.yxwz=decodeDiagBilinearAccess(c.xyzw);vec2 cc=vec2(2.0)*c.xz+c.yw;movec(bvec2(step(0.9,d.zw)),cc,vec2(0.0));weights+=areaDiag(d.xy,cc,subsampleIndices.z);}d.xz=searchDiag2(texCoord,vec2(-1.0,-1.0),end);if(sampleLevelZeroOffset(inputBuffer,texCoord,vec2(1,0)).r>0.0){d.yw=searchDiag2(texCoord,vec2(1.0),end);d.y+=float(end.y>0.9);}else{d.yw=vec2(0.0);}if(d.x+d.y>2.0){vec4 coords=vec4(-d.x,-d.x,d.y,d.y)*texelSize.xyxy+texCoord.xyxy;vec4 c;c.x=sampleLevelZeroOffset(inputBuffer,coords.xy,vec2(-1,0)).g;c.y=sampleLevelZeroOffset(inputBuffer,coords.xy,vec2(0,-1)).r;c.zw=sampleLevelZeroOffset(inputBuffer,coords.zw,vec2(1,0)).gr;vec2 cc=vec2(2.0)*c.xz+c.yw;movec(bvec2(step(0.9,d.zw)),cc,vec2(0.0));weights+=areaDiag(d.xy,cc,subsampleIndices.w).gr;}return weights;}float searchLength(const in vec2 e,const in float offset){vec2 scale=SEARCHTEX_SIZE*vec2(0.5,-1.0);vec2 bias=SEARCHTEX_SIZE*vec2(offset,1.0);scale+=vec2(-1.0,1.0);bias+=vec2(0.5,-0.5);scale*=1.0/SEARCHTEX_PACKED_SIZE;bias*=1.0/SEARCHTEX_PACKED_SIZE;return texture2D(searchTexture,scale*e+bias).r;}float searchXLeft(in vec2 texCoord,const in float end){vec2 e=vec2(0.0,1.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(texCoord.x>end&&e.g>0.8281&&e.r==0.0)){break;}e=texture2D(inputBuffer,texCoord).rg;texCoord=vec2(-2.0,0.0)*texelSize+texCoord;}float offset=-(255.0/127.0)*searchLength(e,0.0)+3.25;return texelSize.x*offset+texCoord.x;}float searchXRight(vec2 texCoord,const in float end){vec2 e=vec2(0.0,1.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(texCoord.x<end&&e.g>0.8281&&e.r==0.0)){break;}e=texture2D(inputBuffer,texCoord).rg;texCoord=vec2(2.0,0.0)*texelSize.xy+texCoord;}float offset=-(255.0/127.0)*searchLength(e,0.5)+3.25;return-texelSize.x*offset+texCoord.x;}float searchYUp(vec2 texCoord,const in float end){vec2 e=vec2(1.0,0.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;++i){if(!(texCoord.y>end&&e.r>0.8281&&e.g==0.0)){break;}e=texture2D(inputBuffer,texCoord).rg;texCoord=-vec2(0.0,2.0)*texelSize.xy+texCoord;}float offset=-(255.0/127.0)*searchLength(e.gr,0.0)+3.25;return texelSize.y*offset+texCoord.y;}float searchYDown(vec2 texCoord,const in float end){vec2 e=vec2(1.0,0.0);for(int i=0;i<MAX_SEARCH_STEPS_INT;i++){if(!(texCoord.y<end&&e.r>0.8281&&e.g==0.0)){break;}e=texture2D(inputBuffer,texCoord).rg;texCoord=vec2(0.0,2.0)*texelSize.xy+texCoord;}float offset=-(255.0/127.0)*searchLength(e.gr,0.5)+3.25;return-texelSize.y*offset+texCoord.y;}vec2 area(const in vec2 dist,const in float e1,const in float e2,const in float offset){vec2 texCoord=vec2(AREATEX_MAX_DISTANCE)*round(4.0*vec2(e1,e2))+dist;texCoord=AREATEX_PIXEL_SIZE*texCoord+0.5*AREATEX_PIXEL_SIZE;texCoord.y=AREATEX_SUBTEX_SIZE*offset+texCoord.y;return texture2D(areaTexture,texCoord).rg;}void detectHorizontalCornerPattern(inout vec2 weights,const in vec4 texCoord,const in vec2 d){\\n#if !defined(DISABLE_CORNER_DETECTION)\\nvec2 leftRight=step(d.xy,d.yx);vec2 rounding=(1.0-CORNER_ROUNDING_NORM)*leftRight;rounding/=leftRight.x+leftRight.y;vec2 factor=vec2(1.0);factor.x-=rounding.x*sampleLevelZeroOffset(inputBuffer,texCoord.xy,vec2(0,1)).r;factor.x-=rounding.y*sampleLevelZeroOffset(inputBuffer,texCoord.zw,vec2(1,1)).r;factor.y-=rounding.x*sampleLevelZeroOffset(inputBuffer,texCoord.xy,vec2(0,-2)).r;factor.y-=rounding.y*sampleLevelZeroOffset(inputBuffer,texCoord.zw,vec2(1,-2)).r;weights*=clamp(factor,0.0,1.0);\\n#endif\\n}void detectVerticalCornerPattern(inout vec2 weights,const in vec4 texCoord,const in vec2 d){\\n#if !defined(DISABLE_CORNER_DETECTION)\\nvec2 leftRight=step(d.xy,d.yx);vec2 rounding=(1.0-CORNER_ROUNDING_NORM)*leftRight;rounding/=leftRight.x+leftRight.y;vec2 factor=vec2(1.0);factor.x-=rounding.x*sampleLevelZeroOffset(inputBuffer,texCoord.xy,vec2(1,0)).g;factor.x-=rounding.y*sampleLevelZeroOffset(inputBuffer,texCoord.zw,vec2(1,1)).g;factor.y-=rounding.x*sampleLevelZeroOffset(inputBuffer,texCoord.xy,vec2(-2,0)).g;factor.y-=rounding.y*sampleLevelZeroOffset(inputBuffer,texCoord.zw,vec2(-2,1)).g;weights*=clamp(factor,0.0,1.0);\\n#endif\\n}void main(){vec4 weights=vec4(0.0);vec4 subsampleIndices=vec4(0.0);vec2 e=texture2D(inputBuffer,vUv).rg;if(e.g>0.0){\\n#if !defined(DISABLE_DIAG_DETECTION)\\nweights.rg=calculateDiagWeights(vUv,e,subsampleIndices);if(weights.r==-weights.g){\\n#endif\\nvec2 d;vec3 coords;coords.x=searchXLeft(vOffset[0].xy,vOffset[2].x);coords.y=vOffset[1].y;d.x=coords.x;float e1=texture2D(inputBuffer,coords.xy).r;coords.z=searchXRight(vOffset[0].zw,vOffset[2].y);d.y=coords.z;d=round(resolution.xx*d+-vPixCoord.xx);vec2 sqrtD=sqrt(abs(d));float e2=sampleLevelZeroOffset(inputBuffer,coords.zy,vec2(1,0)).r;weights.rg=area(sqrtD,e1,e2,subsampleIndices.y);coords.y=vUv.y;detectHorizontalCornerPattern(weights.rg,coords.xyzy,d);\\n#if !defined(DISABLE_DIAG_DETECTION)\\n}else{e.r=0.0;}\\n#endif\\n}if(e.r>0.0){vec2 d;vec3 coords;coords.y=searchYUp(vOffset[1].xy,vOffset[2].z);coords.x=vOffset[0].x;d.x=coords.y;float e1=texture2D(inputBuffer,coords.xy).g;coords.z=searchYDown(vOffset[1].zw,vOffset[2].w);d.y=coords.z;d=round(resolution.yy*d-vPixCoord.yy);vec2 sqrtD=sqrt(abs(d));float e2=sampleLevelZeroOffset(inputBuffer,coords.xz,vec2(0,1)).g;weights.ba=area(sqrtD,e1,e2,subsampleIndices.x);coords.x=vUv.x;detectVerticalCornerPattern(weights.ba,coords.xyxz,d);}gl_FragColor=weights;}\";\n\n// src/materials/glsl/smaa-weights.vert\nvar smaa_weights_default2 = \"uniform vec2 texelSize;uniform vec2 resolution;varying vec2 vUv;varying vec4 vOffset[3];varying vec2 vPixCoord;void main(){vUv=position.xy*0.5+0.5;vPixCoord=vUv*resolution;vOffset[0]=vUv.xyxy+texelSize.xyxy*vec4(-0.25,-0.125,1.25,-0.125);vOffset[1]=vUv.xyxy+texelSize.xyxy*vec4(-0.125,-0.25,-0.125,1.25);vOffset[2]=vec4(vOffset[0].xz,vOffset[1].yw)+vec4(-2.0,2.0,-2.0,2.0)*texelSize.xxyy*MAX_SEARCH_STEPS_FLOAT;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/SMAAWeightsMaterial.js\nvar SMAAWeightsMaterial = class extends ShaderMaterial19 {\n /**\n * Constructs a new SMAA weights material.\n *\n * @param {Vector2} [texelSize] - The absolute screen texel size.\n * @param {Vector2} [resolution] - The resolution.\n */\n constructor(texelSize = new Vector211(), resolution = new Vector211()) {\n super({\n name: \"SMAAWeightsMaterial\",\n defines: {\n // Configurable settings:\n MAX_SEARCH_STEPS_INT: \"16\",\n MAX_SEARCH_STEPS_FLOAT: \"16.0\",\n MAX_SEARCH_STEPS_DIAG_INT: \"8\",\n MAX_SEARCH_STEPS_DIAG_FLOAT: \"8.0\",\n CORNER_ROUNDING: \"25\",\n CORNER_ROUNDING_NORM: \"0.25\",\n // Non-configurable settings:\n AREATEX_MAX_DISTANCE: \"16.0\",\n AREATEX_MAX_DISTANCE_DIAG: \"20.0\",\n AREATEX_PIXEL_SIZE: \"(1.0 / vec2(160.0, 560.0))\",\n AREATEX_SUBTEX_SIZE: \"(1.0 / 7.0)\",\n SEARCHTEX_SIZE: \"vec2(66.0, 33.0)\",\n SEARCHTEX_PACKED_SIZE: \"vec2(64.0, 16.0)\"\n },\n uniforms: {\n inputBuffer: new Uniform19(null),\n searchTexture: new Uniform19(null),\n areaTexture: new Uniform19(null),\n resolution: new Uniform19(resolution),\n texelSize: new Uniform19(texelSize)\n },\n blending: NoBlending19,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: smaa_weights_default,\n vertexShader: smaa_weights_default2\n });\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * Sets the input buffer.\n *\n * @deprecated Use inputBuffer instead.\n * @param {Texture} value - The input buffer.\n */\n setInputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * The search lookup texture.\n *\n * @type {Texture}\n */\n get searchTexture() {\n return this.uniforms.searchTexture.value;\n }\n set searchTexture(value) {\n this.uniforms.searchTexture.value = value;\n }\n /**\n * The area lookup texture.\n *\n * @type {Texture}\n */\n get areaTexture() {\n return this.uniforms.areaTexture.value;\n }\n set areaTexture(value) {\n this.uniforms.areaTexture.value = value;\n }\n /**\n * Sets the search and area lookup textures.\n *\n * @deprecated Use searchTexture and areaTexture instead.\n * @param {Texture} search - The search lookup texture.\n * @param {Texture} area - The area lookup texture.\n */\n setLookupTextures(search, area2) {\n this.searchTexture = search;\n this.areaTexture = area2;\n }\n /**\n * The maximum amount of steps performed in the horizontal/vertical pattern searches, at each side of the pixel.\n * Range: [0, 112].\n *\n * In number of pixels, it's actually the double. So the maximum line length perfectly handled by, for example 16, is\n * 64 (perfectly means that longer lines won't look as good, but are still antialiased).\n *\n * @type {Number}\n */\n get orthogonalSearchSteps() {\n return Number(this.defines.MAX_SEARCH_STEPS_INT);\n }\n set orthogonalSearchSteps(value) {\n const s = Math.min(Math.max(value, 0), 112);\n this.defines.MAX_SEARCH_STEPS_INT = s.toFixed(\"0\");\n this.defines.MAX_SEARCH_STEPS_FLOAT = s.toFixed(\"1\");\n this.needsUpdate = true;\n }\n /**\n * Sets the maximum amount of steps performed in the horizontal/vertical pattern searches, at each side of the pixel.\n *\n * @deprecated Use orthogonalSearchSteps instead.\n * @param {Number} value - The search steps. Range: [0, 112].\n */\n setOrthogonalSearchSteps(value) {\n this.orthogonalSearchSteps = value;\n }\n /**\n * The maximum steps performed in the diagonal pattern searches, at each side of the pixel. This search\n * jumps one pixel at a time. Range: [0, 20].\n *\n * On high-end machines this search is cheap (between 0.8x and 0.9x slower for 16 steps), but it can have a\n * significant impact on older machines.\n *\n * @type {Number}\n */\n get diagonalSearchSteps() {\n return Number(this.defines.MAX_SEARCH_STEPS_DIAG_INT);\n }\n set diagonalSearchSteps(value) {\n const s = Math.min(Math.max(value, 0), 20);\n this.defines.MAX_SEARCH_STEPS_DIAG_INT = s.toFixed(\"0\");\n this.defines.MAX_SEARCH_STEPS_DIAG_FLOAT = s.toFixed(\"1\");\n this.needsUpdate = true;\n }\n /**\n * Specifies the maximum steps performed in the diagonal pattern searches, at each side of the pixel.\n *\n * @deprecated Use diagonalSearchSteps instead.\n * @param {Number} value - The search steps. Range: [0, 20].\n */\n setDiagonalSearchSteps(value) {\n this.diagonalSearchSteps = value;\n }\n /**\n * Indicates whether diagonal pattern detection is enabled.\n *\n * @type {Boolean}\n */\n get diagonalDetection() {\n return this.defines.DISABLE_DIAG_DETECTION === void 0;\n }\n set diagonalDetection(value) {\n if (value) {\n delete this.defines.DISABLE_DIAG_DETECTION;\n } else {\n this.defines.DISABLE_DIAG_DETECTION = \"1\";\n }\n this.needsUpdate = true;\n }\n /**\n * Indicates whether diagonal pattern detection is enabled.\n *\n * @deprecated Use diagonalDetection instead.\n * @return {Boolean} Whether diagonal pattern detection is enabled.\n */\n isDiagonalDetectionEnabled() {\n return this.diagonalDetection;\n }\n /**\n * Enables or disables diagonal pattern detection.\n *\n * @deprecated Use diagonalDetection instead.\n * @param {Boolean} value - Whether diagonal pattern detection should be enabled.\n */\n setDiagonalDetectionEnabled(value) {\n this.diagonalDetection = value;\n }\n /**\n * Specifies how much sharp corners will be rounded. Range: [0, 100].\n *\n * @type {Number}\n */\n get cornerRounding() {\n return Number(this.defines.CORNER_ROUNDING);\n }\n set cornerRounding(value) {\n const r = Math.min(Math.max(value, 0), 100);\n this.defines.CORNER_ROUNDING = r.toFixed(\"4\");\n this.defines.CORNER_ROUNDING_NORM = (r / 100).toFixed(\"4\");\n this.needsUpdate = true;\n }\n /**\n * Specifies how much sharp corners will be rounded.\n *\n * @deprecated Use cornerRounding instead.\n * @param {Number} value - The corner rounding amount. Range: [0, 100].\n */\n setCornerRounding(value) {\n this.cornerRounding = value;\n }\n /**\n * Indicates whether corner detection is enabled.\n *\n * @type {Number}\n */\n get cornerDetection() {\n return this.defines.DISABLE_CORNER_DETECTION === void 0;\n }\n set cornerDetection(value) {\n if (value) {\n delete this.defines.DISABLE_CORNER_DETECTION;\n } else {\n this.defines.DISABLE_CORNER_DETECTION = \"1\";\n }\n this.needsUpdate = true;\n }\n /**\n * Indicates whether corner rounding is enabled.\n *\n * @deprecated Use cornerDetection instead.\n * @return {Boolean} Whether corner rounding is enabled.\n */\n isCornerRoundingEnabled() {\n return this.cornerDetection;\n }\n /**\n * Enables or disables corner rounding.\n *\n * @deprecated Use cornerDetection instead.\n * @param {Boolean} value - Whether corner rounding should be enabled.\n */\n setCornerRoundingEnabled(value) {\n this.cornerDetection = value;\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const uniforms = this.uniforms;\n uniforms.texelSize.value.set(1 / width, 1 / height);\n uniforms.resolution.value.set(width, height);\n }\n};\n\n// src/materials/SSAOMaterial.js\nimport { BasicDepthPacking as BasicDepthPacking7, Matrix4, NoBlending as NoBlending20, PerspectiveCamera as PerspectiveCamera6, ShaderMaterial as ShaderMaterial20, Uniform as Uniform20, Vector2 as Vector212 } from \"three\";\n\n// src/materials/glsl/ssao.frag\nvar ssao_default = \"#include <common>\\n#include <packing>\\n#ifdef NORMAL_DEPTH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D normalDepthBuffer;\\n#else\\nuniform mediump sampler2D normalDepthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){return texture2D(normalDepthBuffer,uv).a;}\\n#else\\nuniform lowp sampler2D normalBuffer;\\n#if DEPTH_PACKING == 3201\\nuniform lowp sampler2D depthBuffer;\\n#elif defined(GL_FRAGMENT_PRECISION_HIGH)\\nuniform highp sampler2D depthBuffer;\\n#else\\nuniform mediump sampler2D depthBuffer;\\n#endif\\nfloat readDepth(const in vec2 uv){\\n#if DEPTH_PACKING == 3201\\nreturn unpackRGBAToDepth(texture2D(depthBuffer,uv));\\n#else\\nreturn texture2D(depthBuffer,uv).r;\\n#endif\\n}\\n#endif\\nuniform lowp sampler2D noiseTexture;uniform mat4 inverseProjectionMatrix;uniform mat4 projectionMatrix;uniform vec2 texelSize;uniform vec2 cameraNearFar;uniform float intensity;uniform float minRadiusScale;uniform float fade;uniform float bias;uniform vec2 distanceCutoff;uniform vec2 proximityCutoff;varying vec2 vUv;varying vec2 vUv2;float getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNearFar.x,cameraNearFar.y);\\n#endif\\n}vec3 getViewPosition(const in vec2 screenPosition,const in float depth,const in float viewZ){vec4 clipPosition=vec4(vec3(screenPosition,depth)*2.0-1.0,1.0);float clipW=projectionMatrix[2][3]*viewZ+projectionMatrix[3][3];clipPosition*=clipW;return(inverseProjectionMatrix*clipPosition).xyz;}float getAmbientOcclusion(const in vec3 p,const in vec3 n,const in float depth,const in vec2 uv){float radiusScale=1.0-smoothstep(0.0,distanceCutoff.y,depth);radiusScale=radiusScale*(1.0-minRadiusScale)+minRadiusScale;float radius=RADIUS*radiusScale;float noise=texture2D(noiseTexture,vUv2).r;float baseAngle=noise*PI2;float rings=SPIRAL_TURNS*PI2;float occlusion=0.0;int taps=0;for(int i=0;i<SAMPLES_INT;++i){float alpha=(float(i)+0.5)*INV_SAMPLES_FLOAT;float angle=alpha*rings+baseAngle;vec2 rotation=vec2(cos(angle),sin(angle));vec2 coords=alpha*radius*rotation*texelSize+uv;if(coords.s<0.0||coords.s>1.0||coords.t<0.0||coords.t>1.0){continue;}float sampleDepth=readDepth(coords);float viewZ=getViewZ(sampleDepth);\\n#ifdef PERSPECTIVE_CAMERA\\nfloat linearSampleDepth=viewZToOrthographicDepth(viewZ,cameraNearFar.x,cameraNearFar.y);\\n#else\\nfloat linearSampleDepth=sampleDepth;\\n#endif\\nfloat proximity=abs(depth-linearSampleDepth);if(proximity<proximityCutoff.y){float falloff=1.0-smoothstep(proximityCutoff.x,proximityCutoff.y,proximity);vec3 Q=getViewPosition(coords,sampleDepth,viewZ);vec3 v=Q-p;float vv=dot(v,v);float vn=dot(v,n)-bias;float f=max(RADIUS_SQ-vv,0.0)/RADIUS_SQ;occlusion+=(f*f*f*max(vn/(fade+vv),0.0))*falloff;}++taps;}return occlusion/(4.0*max(float(taps),1.0));}void main(){\\n#ifdef NORMAL_DEPTH\\nvec4 normalDepth=texture2D(normalDepthBuffer,vUv);\\n#else\\nvec4 normalDepth=vec4(texture2D(normalBuffer,vUv).xyz,readDepth(vUv));\\n#endif\\nfloat ao=0.0;float depth=normalDepth.a;float viewZ=getViewZ(depth);\\n#ifdef PERSPECTIVE_CAMERA\\nfloat linearDepth=viewZToOrthographicDepth(viewZ,cameraNearFar.x,cameraNearFar.y);\\n#else\\nfloat linearDepth=depth;\\n#endif\\nif(linearDepth<distanceCutoff.y){vec3 viewPosition=getViewPosition(vUv,depth,viewZ);vec3 viewNormal=unpackRGBToNormal(normalDepth.rgb);ao+=getAmbientOcclusion(viewPosition,viewNormal,linearDepth,vUv);float d=smoothstep(distanceCutoff.x,distanceCutoff.y,linearDepth);ao=mix(ao,0.0,d);\\n#ifdef LEGACY_INTENSITY\\nao=clamp(1.0-pow(1.0-ao,abs(intensity)),0.0,1.0);\\n#endif\\n}gl_FragColor.r=ao;}\";\n\n// src/materials/glsl/ssao.vert\nvar ssao_default2 = \"uniform vec2 noiseScale;varying vec2 vUv;varying vec2 vUv2;void main(){vUv=position.xy*0.5+0.5;vUv2=vUv*noiseScale;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/SSAOMaterial.js\nvar SSAOMaterial = class extends ShaderMaterial20 {\n /**\n * Constructs a new SSAO material.\n *\n * @param {Camera} camera - A camera.\n */\n constructor(camera) {\n super({\n name: \"SSAOMaterial\",\n defines: {\n SAMPLES_INT: \"0\",\n INV_SAMPLES_FLOAT: \"0.0\",\n SPIRAL_TURNS: \"0.0\",\n RADIUS: \"1.0\",\n RADIUS_SQ: \"1.0\",\n DISTANCE_SCALING: \"1\",\n DEPTH_PACKING: \"0\"\n },\n uniforms: {\n depthBuffer: new Uniform20(null),\n normalBuffer: new Uniform20(null),\n normalDepthBuffer: new Uniform20(null),\n noiseTexture: new Uniform20(null),\n inverseProjectionMatrix: new Uniform20(new Matrix4()),\n projectionMatrix: new Uniform20(new Matrix4()),\n texelSize: new Uniform20(new Vector212()),\n cameraNearFar: new Uniform20(new Vector212()),\n distanceCutoff: new Uniform20(new Vector212()),\n proximityCutoff: new Uniform20(new Vector212()),\n noiseScale: new Uniform20(new Vector212()),\n minRadiusScale: new Uniform20(0.33),\n intensity: new Uniform20(1),\n fade: new Uniform20(0.01),\n bias: new Uniform20(0)\n },\n blending: NoBlending20,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: ssao_default,\n vertexShader: ssao_default2\n });\n this.copyCameraSettings(camera);\n this.resolution = new Vector212();\n this.r = 1;\n }\n /**\n * The current near plane setting.\n *\n * @type {Number}\n * @private\n */\n get near() {\n return this.uniforms.cameraNearFar.value.x;\n }\n /**\n * The current far plane setting.\n *\n * @type {Number}\n * @private\n */\n get far() {\n return this.uniforms.cameraNearFar.value.y;\n }\n /**\n * A combined normal-depth buffer.\n *\n * @type {Texture}\n */\n set normalDepthBuffer(value) {\n this.uniforms.normalDepthBuffer.value = value;\n if (value !== null) {\n this.defines.NORMAL_DEPTH = \"1\";\n } else {\n delete this.defines.NORMAL_DEPTH;\n }\n this.needsUpdate = true;\n }\n /**\n * Sets the combined normal-depth buffer.\n *\n * @deprecated Use normalDepthBuffer instead.\n * @param {Number} value - The buffer.\n */\n setNormalDepthBuffer(value) {\n this.normalDepthBuffer = value;\n }\n /**\n * The normal buffer.\n *\n * @type {Texture}\n */\n set normalBuffer(value) {\n this.uniforms.normalBuffer.value = value;\n }\n /**\n * Sets the normal buffer.\n *\n * @deprecated Use normalBuffer instead.\n * @param {Number} value - The buffer.\n */\n setNormalBuffer(value) {\n this.uniforms.normalBuffer.value = value;\n }\n /**\n * The depth buffer.\n *\n * @type {Texture}\n */\n set depthBuffer(value) {\n this.uniforms.depthBuffer.value = value;\n }\n /**\n * The depth packing strategy.\n *\n * @type {DepthPackingStrategies}\n */\n set depthPacking(value) {\n this.defines.DEPTH_PACKING = value.toFixed(0);\n this.needsUpdate = true;\n }\n /**\n * Sets the depth buffer.\n *\n * @deprecated Use depthBuffer and depthPacking instead.\n * @param {Texture} buffer - The depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthBuffer(buffer, depthPacking = BasicDepthPacking7) {\n this.depthBuffer = buffer;\n this.depthPacking = depthPacking;\n }\n /**\n * The noise texture.\n *\n * @type {Texture}\n */\n set noiseTexture(value) {\n this.uniforms.noiseTexture.value = value;\n }\n /**\n * Sets the noise texture.\n *\n * @deprecated Use noiseTexture instead.\n * @param {Number} value - The texture.\n */\n setNoiseTexture(value) {\n this.uniforms.noiseTexture.value = value;\n }\n /**\n * The sample count.\n *\n * @type {Number}\n */\n get samples() {\n return Number(this.defines.SAMPLES_INT);\n }\n set samples(value) {\n this.defines.SAMPLES_INT = value.toFixed(0);\n this.defines.INV_SAMPLES_FLOAT = (1 / value).toFixed(9);\n this.needsUpdate = true;\n }\n /**\n * Returns the amount of occlusion samples per pixel.\n *\n * @deprecated Use samples instead.\n * @return {Number} The sample count.\n */\n getSamples() {\n return this.samples;\n }\n /**\n * Sets the amount of occlusion samples per pixel.\n *\n * @deprecated Use samples instead.\n * @param {Number} value - The sample count.\n */\n setSamples(value) {\n this.samples = value;\n }\n /**\n * The sampling spiral ring count.\n *\n * @type {Number}\n */\n get rings() {\n return Number(this.defines.SPIRAL_TURNS);\n }\n set rings(value) {\n this.defines.SPIRAL_TURNS = value.toFixed(1);\n this.needsUpdate = true;\n }\n /**\n * Returns the amount of spiral turns in the occlusion sampling pattern.\n *\n * @deprecated Use rings instead.\n * @return {Number} The radius.\n */\n getRings() {\n return this.rings;\n }\n /**\n * Sets the amount of spiral turns in the occlusion sampling pattern.\n *\n * @deprecated Use rings instead.\n * @param {Number} value - The radius.\n */\n setRings(value) {\n this.rings = value;\n }\n /**\n * The intensity.\n *\n * @type {Number}\n * @deprecated Use SSAOEffect.intensity instead.\n */\n get intensity() {\n return this.uniforms.intensity.value;\n }\n set intensity(value) {\n this.uniforms.intensity.value = value;\n if (this.defines.LEGACY_INTENSITY === void 0) {\n this.defines.LEGACY_INTENSITY = \"1\";\n this.needsUpdate = true;\n }\n }\n /**\n * Returns the intensity.\n *\n * @deprecated Use SSAOEffect.intensity instead.\n * @return {Number} The intensity.\n */\n getIntensity() {\n return this.uniforms.intensity.value;\n }\n /**\n * Sets the intensity.\n *\n * @deprecated Use SSAOEffect.intensity instead.\n * @param {Number} value - The intensity.\n */\n setIntensity(value) {\n this.uniforms.intensity.value = value;\n }\n /**\n * The depth fade factor.\n *\n * @type {Number}\n */\n get fade() {\n return this.uniforms.fade.value;\n }\n set fade(value) {\n this.uniforms.fade.value = value;\n }\n /**\n * Returns the depth fade factor.\n *\n * @deprecated Use fade instead.\n * @return {Number} The fade factor.\n */\n getFade() {\n return this.uniforms.fade.value;\n }\n /**\n * Sets the depth fade factor.\n *\n * @deprecated Use fade instead.\n * @param {Number} value - The fade factor.\n */\n setFade(value) {\n this.uniforms.fade.value = value;\n }\n /**\n * The depth bias. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get bias() {\n return this.uniforms.bias.value;\n }\n set bias(value) {\n this.uniforms.bias.value = value;\n }\n /**\n * Returns the depth bias.\n *\n * @deprecated Use bias instead.\n * @return {Number} The bias.\n */\n getBias() {\n return this.uniforms.bias.value;\n }\n /**\n * Sets the depth bias.\n *\n * @deprecated Use bias instead.\n * @param {Number} value - The bias.\n */\n setBias(value) {\n this.uniforms.bias.value = value;\n }\n /**\n * The minimum radius scale for distance scaling. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get minRadiusScale() {\n return this.uniforms.minRadiusScale.value;\n }\n set minRadiusScale(value) {\n this.uniforms.minRadiusScale.value = value;\n }\n /**\n * Returns the minimum radius scale for distance scaling.\n *\n * @deprecated Use minRadiusScale instead.\n * @return {Number} The minimum radius scale.\n */\n getMinRadiusScale() {\n return this.uniforms.minRadiusScale.value;\n }\n /**\n * Sets the minimum radius scale for distance scaling.\n *\n * @deprecated Use minRadiusScale instead.\n * @param {Number} value - The minimum radius scale.\n */\n setMinRadiusScale(value) {\n this.uniforms.minRadiusScale.value = value;\n }\n /**\n * Updates the absolute radius.\n *\n * @private\n */\n updateRadius() {\n const radius = this.r * this.resolution.height;\n this.defines.RADIUS = radius.toFixed(11);\n this.defines.RADIUS_SQ = (radius * radius).toFixed(11);\n this.needsUpdate = true;\n }\n /**\n * The occlusion sampling radius. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get radius() {\n return this.r;\n }\n set radius(value) {\n this.r = Math.min(Math.max(value, 1e-6), 1);\n this.updateRadius();\n }\n /**\n * Returns the occlusion sampling radius.\n *\n * @deprecated Use radius instead.\n * @return {Number} The radius.\n */\n getRadius() {\n return this.radius;\n }\n /**\n * Sets the occlusion sampling radius.\n *\n * @deprecated Use radius instead.\n * @param {Number} value - The radius. Range [1e-6, 1.0].\n */\n setRadius(value) {\n this.radius = value;\n }\n /**\n * Indicates whether distance-based radius scaling is enabled.\n *\n * @type {Boolean}\n * @deprecated\n */\n get distanceScaling() {\n return true;\n }\n set distanceScaling(value) {\n }\n /**\n * Indicates whether distance-based radius scaling is enabled.\n *\n * @deprecated\n * @return {Boolean} Whether distance scaling is enabled.\n */\n isDistanceScalingEnabled() {\n return this.distanceScaling;\n }\n /**\n * Enables or disables distance-based radius scaling.\n *\n * @deprecated\n * @param {Boolean} value - Whether distance scaling should be enabled.\n */\n setDistanceScalingEnabled(value) {\n this.distanceScaling = value;\n }\n /**\n * The occlusion distance threshold. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get distanceThreshold() {\n return this.uniforms.distanceCutoff.value.x;\n }\n set distanceThreshold(value) {\n this.uniforms.distanceCutoff.value.set(\n Math.min(Math.max(value, 0), 1),\n Math.min(Math.max(value + this.distanceFalloff, 0), 1)\n );\n }\n /**\n * The occlusion distance threshold in world units.\n *\n * @type {Number}\n */\n get worldDistanceThreshold() {\n return -orthographicDepthToViewZ(this.distanceThreshold, this.near, this.far);\n }\n set worldDistanceThreshold(value) {\n this.distanceThreshold = viewZToOrthographicDepth(-value, this.near, this.far);\n }\n /**\n * The occlusion distance falloff. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get distanceFalloff() {\n return this.uniforms.distanceCutoff.value.y - this.distanceThreshold;\n }\n set distanceFalloff(value) {\n this.uniforms.distanceCutoff.value.y = Math.min(Math.max(this.distanceThreshold + value, 0), 1);\n }\n /**\n * The occlusion distance falloff in world units.\n *\n * @type {Number}\n */\n get worldDistanceFalloff() {\n return -orthographicDepthToViewZ(this.distanceFalloff, this.near, this.far);\n }\n set worldDistanceFalloff(value) {\n this.distanceFalloff = viewZToOrthographicDepth(-value, this.near, this.far);\n }\n /**\n * Sets the occlusion distance cutoff.\n *\n * @deprecated Use distanceThreshold and distanceFalloff instead.\n * @param {Number} threshold - The distance threshold. Range [0.0, 1.0].\n * @param {Number} falloff - The falloff. Range [0.0, 1.0].\n */\n setDistanceCutoff(threshold, falloff) {\n this.uniforms.distanceCutoff.value.set(\n Math.min(Math.max(threshold, 0), 1),\n Math.min(Math.max(threshold + falloff, 0), 1)\n );\n }\n /**\n * The occlusion proximity threshold. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get proximityThreshold() {\n return this.uniforms.proximityCutoff.value.x;\n }\n set proximityThreshold(value) {\n this.uniforms.proximityCutoff.value.set(\n Math.min(Math.max(value, 0), 1),\n Math.min(Math.max(value + this.proximityFalloff, 0), 1)\n );\n }\n /**\n * The occlusion proximity threshold in world units.\n *\n * @type {Number}\n */\n get worldProximityThreshold() {\n return -orthographicDepthToViewZ(this.proximityThreshold, this.near, this.far);\n }\n set worldProximityThreshold(value) {\n this.proximityThreshold = viewZToOrthographicDepth(-value, this.near, this.far);\n }\n /**\n * The occlusion proximity falloff. Range: [0.0, 1.0].\n *\n * @type {Number}\n */\n get proximityFalloff() {\n return this.uniforms.proximityCutoff.value.y - this.proximityThreshold;\n }\n set proximityFalloff(value) {\n this.uniforms.proximityCutoff.value.y = Math.min(Math.max(this.proximityThreshold + value, 0), 1);\n }\n /**\n * The occlusion proximity falloff in world units.\n *\n * @type {Number}\n */\n get worldProximityFalloff() {\n return -orthographicDepthToViewZ(this.proximityFalloff, this.near, this.far);\n }\n set worldProximityFalloff(value) {\n this.proximityFalloff = viewZToOrthographicDepth(-value, this.near, this.far);\n }\n /**\n * Sets the occlusion proximity cutoff.\n *\n * @deprecated Use proximityThreshold and proximityFalloff instead.\n * @param {Number} threshold - The range threshold. Range [0.0, 1.0].\n * @param {Number} falloff - The falloff. Range [0.0, 1.0].\n */\n setProximityCutoff(threshold, falloff) {\n this.uniforms.proximityCutoff.value.set(\n Math.min(Math.max(threshold, 0), 1),\n Math.min(Math.max(threshold + falloff, 0), 1)\n );\n }\n /**\n * Sets the texel size.\n *\n * @deprecated Use setSize() instead.\n * @param {Number} x - The texel width.\n * @param {Number} y - The texel height.\n */\n setTexelSize(x, y) {\n this.uniforms.texelSize.value.set(x, y);\n }\n /**\n * Copies the settings of the given camera.\n *\n * @deprecated Use copyCameraSettings instead.\n * @param {Camera} camera - A camera.\n */\n adoptCameraSettings(camera) {\n this.copyCameraSettings(camera);\n }\n /**\n * Copies the settings of the given camera.\n *\n * @param {Camera} camera - A camera.\n */\n copyCameraSettings(camera) {\n if (camera) {\n this.uniforms.cameraNearFar.value.set(camera.near, camera.far);\n this.uniforms.projectionMatrix.value.copy(camera.projectionMatrix);\n this.uniforms.inverseProjectionMatrix.value.copy(camera.projectionMatrix).invert();\n if (camera instanceof PerspectiveCamera6) {\n this.defines.PERSPECTIVE_CAMERA = \"1\";\n } else {\n delete this.defines.PERSPECTIVE_CAMERA;\n }\n this.needsUpdate = true;\n }\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const uniforms = this.uniforms;\n const noiseTexture = uniforms.noiseTexture.value;\n if (noiseTexture !== null) {\n uniforms.noiseScale.value.set(\n width / noiseTexture.image.width,\n height / noiseTexture.image.height\n );\n }\n uniforms.texelSize.value.set(1 / width, 1 / height);\n this.resolution.set(width, height);\n this.updateRadius();\n }\n};\n\n// src/materials/TiltShiftBlurMaterial.js\nimport { Uniform as Uniform21, Vector2 as Vector213, Vector4 as Vector42 } from \"three\";\n\n// src/materials/glsl/convolution.tilt-shift.frag\nvar convolution_tilt_shift_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;\\n#endif\\nuniform vec4 maskParams;varying vec2 vUv;varying vec2 vUv2;varying vec2 vOffset;float linearGradientMask(const in float x){return smoothstep(maskParams.x,maskParams.y,x)-smoothstep(maskParams.w,maskParams.z,x);}void main(){vec2 dUv=vOffset*(1.0-linearGradientMask(vUv2.y));vec4 sum=texture2D(inputBuffer,vec2(vUv.x-dUv.x,vUv.y+dUv.y));sum+=texture2D(inputBuffer,vec2(vUv.x+dUv.x,vUv.y+dUv.y));sum+=texture2D(inputBuffer,vec2(vUv.x+dUv.x,vUv.y-dUv.y));sum+=texture2D(inputBuffer,vec2(vUv.x-dUv.x,vUv.y-dUv.y));gl_FragColor=sum*0.25;\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.tilt-shift.vert\nvar convolution_tilt_shift_default2 = \"uniform vec4 texelSize;uniform float kernel;uniform float scale;uniform float aspect;uniform vec2 rotation;varying vec2 vUv;varying vec2 vUv2;varying vec2 vOffset;void main(){vec2 uv=position.xy*0.5+0.5;vUv=uv;vUv2=(uv-0.5)*2.0*vec2(aspect,1.0);vUv2=vec2(dot(rotation,vUv2),dot(rotation,vec2(vUv2.y,-vUv2.x)));vOffset=(texelSize.xy*vec2(kernel)+texelSize.zw)*scale;gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/TiltShiftBlurMaterial.js\nvar TiltShiftBlurMaterial = class extends KawaseBlurMaterial {\n /**\n * Constructs a new tilt shift blur material.\n *\n * @param {Object} [options] - The options.\n * @param {Number} [options.offset=0.0] - The relative offset of the focus area.\n * @param {Number} [options.rotation=0.0] - The rotation of the focus area in radians.\n * @param {Number} [options.focusArea=0.4] - The relative size of the focus area.\n * @param {Number} [options.feather=0.3] - The softness of the focus area edges.\n */\n constructor({\n kernelSize = KernelSize.MEDIUM,\n offset = 0,\n rotation = 0,\n focusArea = 0.4,\n feather = 0.3\n } = {}) {\n super();\n this.fragmentShader = convolution_tilt_shift_default;\n this.vertexShader = convolution_tilt_shift_default2;\n this.kernelSize = kernelSize;\n this.fragmentShader = updateFragmentShader(this.fragmentShader);\n this.uniforms.aspect = new Uniform21(1);\n this.uniforms.rotation = new Uniform21(new Vector213());\n this.uniforms.maskParams = new Uniform21(new Vector42());\n this._offset = offset;\n this._focusArea = focusArea;\n this._feather = feather;\n this.rotation = rotation;\n this.updateParams();\n }\n /**\n * The relative offset of the focus area.\n *\n * @private\n */\n updateParams() {\n const params = this.uniforms.maskParams.value;\n const a = Math.max(this.focusArea, 0);\n const b = Math.max(a - this.feather, 0);\n params.set(\n this.offset - a,\n this.offset - b,\n this.offset + a,\n this.offset + b\n );\n }\n /**\n * The rotation of the focus area in radians.\n *\n * @type {Number}\n */\n get rotation() {\n return Math.acos(this.uniforms.rotation.value.x);\n }\n set rotation(value) {\n this.uniforms.rotation.value.set(Math.cos(value), Math.sin(value));\n }\n /**\n * The relative offset of the focus area.\n *\n * @type {Number}\n */\n get offset() {\n return this._offset;\n }\n set offset(value) {\n this._offset = value;\n this.updateParams();\n }\n /**\n * The relative size of the focus area.\n *\n * @type {Number}\n */\n get focusArea() {\n return this._focusArea;\n }\n set focusArea(value) {\n this._focusArea = value;\n this.updateParams();\n }\n /**\n * The softness of the focus area edges.\n *\n * @type {Number}\n */\n get feather() {\n return this._feather;\n }\n set feather(value) {\n this._feather = value;\n this.updateParams();\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n super.setSize(width, height);\n this.uniforms.aspect.value = width / height;\n }\n};\n\n// src/materials/UpsamplingMaterial.js\nimport { NoBlending as NoBlending21, ShaderMaterial as ShaderMaterial21, Uniform as Uniform22, Vector2 as Vector214 } from \"three\";\n\n// src/materials/glsl/convolution.upsampling.frag\nvar convolution_upsampling_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D inputBuffer;uniform mediump sampler2D supportBuffer;\\n#else\\nuniform lowp sampler2D inputBuffer;uniform lowp sampler2D supportBuffer;\\n#endif\\nuniform float radius;varying vec2 vUv;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;varying vec2 vUv4;varying vec2 vUv5;varying vec2 vUv6;varying vec2 vUv7;void main(){vec4 c=vec4(0.0);c+=texture2D(inputBuffer,vUv0)*0.0625;c+=texture2D(inputBuffer,vUv1)*0.125;c+=texture2D(inputBuffer,vUv2)*0.0625;c+=texture2D(inputBuffer,vUv3)*0.125;c+=texture2D(inputBuffer,vUv)*0.25;c+=texture2D(inputBuffer,vUv4)*0.125;c+=texture2D(inputBuffer,vUv5)*0.0625;c+=texture2D(inputBuffer,vUv6)*0.125;c+=texture2D(inputBuffer,vUv7)*0.0625;vec4 baseColor=texture2D(supportBuffer,vUv);gl_FragColor=mix(baseColor,c,radius);\\n#include <colorspace_fragment>\\n}\";\n\n// src/materials/glsl/convolution.upsampling.vert\nvar convolution_upsampling_default2 = \"uniform vec2 texelSize;varying vec2 vUv;varying vec2 vUv0;varying vec2 vUv1;varying vec2 vUv2;varying vec2 vUv3;varying vec2 vUv4;varying vec2 vUv5;varying vec2 vUv6;varying vec2 vUv7;void main(){vUv=position.xy*0.5+0.5;vUv0=vUv+texelSize*vec2(-1.0,1.0);vUv1=vUv+texelSize*vec2(0.0,1.0);vUv2=vUv+texelSize*vec2(1.0,1.0);vUv3=vUv+texelSize*vec2(-1.0,0.0);vUv4=vUv+texelSize*vec2(1.0,0.0);vUv5=vUv+texelSize*vec2(-1.0,-1.0);vUv6=vUv+texelSize*vec2(0.0,-1.0);vUv7=vUv+texelSize*vec2(1.0,-1.0);gl_Position=vec4(position.xy,1.0,1.0);}\";\n\n// src/materials/UpsamplingMaterial.js\nvar UpsamplingMaterial = class extends ShaderMaterial21 {\n /**\n * Constructs a new upsampling material.\n */\n constructor() {\n super({\n name: \"UpsamplingMaterial\",\n uniforms: {\n inputBuffer: new Uniform22(null),\n supportBuffer: new Uniform22(null),\n texelSize: new Uniform22(new Vector214()),\n radius: new Uniform22(0.85)\n },\n blending: NoBlending21,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n fragmentShader: convolution_upsampling_default,\n vertexShader: convolution_upsampling_default2\n });\n this.fragmentShader = updateFragmentShader(this.fragmentShader);\n }\n /**\n * The input buffer.\n *\n * @type {Texture}\n */\n set inputBuffer(value) {\n this.uniforms.inputBuffer.value = value;\n }\n /**\n * A support buffer.\n *\n * @type {Texture}\n */\n set supportBuffer(value) {\n this.uniforms.supportBuffer.value = value;\n }\n /**\n * The blur radius.\n *\n * @type {Number}\n */\n get radius() {\n return this.uniforms.radius.value;\n }\n set radius(value) {\n this.uniforms.radius.value = value;\n }\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.uniforms.texelSize.value.set(1 / width, 1 / height);\n }\n};\n\n// src/passes/CopyPass.js\nimport { LinearFilter, UnsignedByteType as UnsignedByteType2, WebGLRenderTarget as WebGLRenderTarget2 } from \"three\";\n\n// src/passes/Pass.js\nimport {\n BasicDepthPacking as BasicDepthPacking8,\n BufferAttribute,\n BufferGeometry,\n Camera,\n Material,\n Mesh,\n Scene,\n Texture,\n WebGLRenderTarget\n} from \"three\";\nvar dummyCamera = /* @__PURE__ */ new Camera();\nvar geometry = null;\nfunction getFullscreenTriangle() {\n if (geometry === null) {\n const vertices = new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]);\n const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);\n geometry = new BufferGeometry();\n if (geometry.setAttribute !== void 0) {\n geometry.setAttribute(\"position\", new BufferAttribute(vertices, 3));\n geometry.setAttribute(\"uv\", new BufferAttribute(uvs, 2));\n } else {\n geometry.addAttribute(\"position\", new BufferAttribute(vertices, 3));\n geometry.addAttribute(\"uv\", new BufferAttribute(uvs, 2));\n }\n }\n return geometry;\n}\nvar Pass = class _Pass {\n /**\n * Constructs a new pass.\n *\n * @param {String} [name] - The name of this pass. Does not have to be unique.\n * @param {Scene} [scene] - The scene to render. The default scene contains a single mesh that fills the screen.\n * @param {Camera} [camera] - A camera. Fullscreen effect passes don't require a camera.\n */\n constructor(name = \"Pass\", scene = new Scene(), camera = dummyCamera) {\n this.name = name;\n this.renderer = null;\n this.scene = scene;\n this.camera = camera;\n this.screen = null;\n this.rtt = true;\n this.needsSwap = true;\n this.needsDepthTexture = false;\n this.enabled = true;\n }\n /**\n * Sets the render to screen flag.\n *\n * If this flag is changed, the fullscreen material will be updated as well.\n *\n * @type {Boolean}\n */\n get renderToScreen() {\n return !this.rtt;\n }\n set renderToScreen(value) {\n if (this.rtt === value) {\n const material = this.fullscreenMaterial;\n if (material !== null) {\n material.needsUpdate = true;\n }\n this.rtt = !value;\n }\n }\n /**\n * Sets the main scene.\n *\n * @type {Scene}\n */\n set mainScene(value) {\n }\n /**\n * Sets the main camera.\n *\n * @type {Camera}\n */\n set mainCamera(value) {\n }\n /**\n * Sets the renderer\n *\n * @deprecated\n * @param {WebGLRenderer} renderer - The renderer.\n */\n setRenderer(renderer) {\n this.renderer = renderer;\n }\n /**\n * Indicates whether this pass is enabled.\n *\n * @deprecated Use enabled instead.\n * @return {Boolean} Whether this pass is enabled.\n */\n isEnabled() {\n return this.enabled;\n }\n /**\n * Enables or disables this pass.\n *\n * @deprecated Use enabled instead.\n * @param {Boolean} value - Whether the pass should be enabled.\n */\n setEnabled(value) {\n this.enabled = value;\n }\n /**\n * The fullscreen material.\n *\n * @type {Material}\n */\n get fullscreenMaterial() {\n return this.screen !== null ? this.screen.material : null;\n }\n set fullscreenMaterial(value) {\n let screen = this.screen;\n if (screen !== null) {\n screen.material = value;\n } else {\n screen = new Mesh(getFullscreenTriangle(), value);\n screen.frustumCulled = false;\n if (this.scene === null) {\n this.scene = new Scene();\n }\n this.scene.add(screen);\n this.screen = screen;\n }\n }\n /**\n * Returns the current fullscreen material.\n *\n * @deprecated Use fullscreenMaterial instead.\n * @return {Material} The current fullscreen material, or null if there is none.\n */\n getFullscreenMaterial() {\n return this.fullscreenMaterial;\n }\n /**\n * Sets the fullscreen material.\n *\n * @deprecated Use fullscreenMaterial instead.\n * @protected\n * @param {Material} value - A fullscreen material.\n */\n setFullscreenMaterial(value) {\n this.fullscreenMaterial = value;\n }\n /**\n * Returns the current depth texture.\n *\n * @return {Texture} The current depth texture, or null if there is none.\n */\n getDepthTexture() {\n return null;\n }\n /**\n * Sets the depth texture.\n *\n * This method will be called automatically by the {@link EffectComposer}.\n * You may override this method if your pass relies on the depth information of a preceding {@link RenderPass}.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategy} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking8) {\n }\n /**\n * Renders this pass.\n *\n * This is an abstract method that must be overridden.\n *\n * @abstract\n * @throws {Error} An error is thrown if the method is not overridden.\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n throw new Error(\"Render method not implemented!\");\n }\n /**\n * Sets the size.\n *\n * You may override this method if you want to be informed about the size of the backbuffer/canvas.\n * This method is called before {@link initialize} and every time the size of the {@link EffectComposer} changes.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n }\n /**\n * Performs initialization tasks.\n *\n * This method is called when this pass is added to an {@link EffectComposer}.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n }\n /**\n * Performs a shallow search for disposable properties and deletes them.\n *\n * The {@link EffectComposer} calls this method when it is being destroyed. You can use it independently to free\n * memory when you're certain that you don't need this pass anymore.\n */\n dispose() {\n for (const key of Object.keys(this)) {\n const property = this[key];\n const isDisposable = property instanceof WebGLRenderTarget || property instanceof Material || property instanceof Texture || property instanceof _Pass;\n if (isDisposable) {\n this[key].dispose();\n }\n }\n }\n};\n\n// src/passes/CopyPass.js\nvar CopyPass = class extends Pass {\n /**\n * Constructs a new save pass.\n *\n * @param {WebGLRenderTarget} [renderTarget] - A render target.\n * @param {Boolean} [autoResize=true] - Whether the render target size should be updated automatically.\n */\n constructor(renderTarget, autoResize = true) {\n super(\"CopyPass\");\n this.fullscreenMaterial = new CopyMaterial();\n this.needsSwap = false;\n this.renderTarget = renderTarget;\n if (renderTarget === void 0) {\n this.renderTarget = new WebGLRenderTarget2(1, 1, {\n minFilter: LinearFilter,\n magFilter: LinearFilter,\n stencilBuffer: false,\n depthBuffer: false\n });\n this.renderTarget.texture.name = \"CopyPass.Target\";\n }\n this.autoResize = autoResize;\n }\n /**\n * Enables or disables auto resizing of the render target.\n *\n * @deprecated Use autoResize instead.\n * @type {Boolean}\n */\n get resize() {\n return this.autoResize;\n }\n set resize(value) {\n this.autoResize = value;\n }\n /**\n * The output texture.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the output texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.renderTarget.texture;\n }\n /**\n * Enables or disables auto resizing of the render target.\n *\n * @deprecated Use autoResize instead.\n * @param {Boolean} value - Whether the render target size should be updated automatically.\n */\n setAutoResizeEnabled(value) {\n this.autoResize = value;\n }\n /**\n * Saves the input buffer.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n this.fullscreenMaterial.inputBuffer = inputBuffer.texture;\n renderer.setRenderTarget(this.renderToScreen ? null : this.renderTarget);\n renderer.render(this.scene, this.camera);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n if (this.autoResize) {\n this.renderTarget.setSize(width, height);\n }\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - A renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n if (frameBufferType !== void 0) {\n this.renderTarget.texture.type = frameBufferType;\n if (frameBufferType !== UnsignedByteType2) {\n this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n } else if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTarget.texture, SRGBColorSpace);\n }\n }\n }\n};\n\n// src/passes/AdaptiveLuminancePass.js\nvar AdaptiveLuminancePass = class extends Pass {\n /**\n * Constructs a new adaptive luminance pass.\n *\n * @param {Texture} luminanceBuffer - A buffer that contains the current scene luminance.\n * @param {Object} [options] - The options.\n * @param {Number} [options.minLuminance=0.01] - The minimum luminance.\n * @param {Number} [options.adaptationRate=1.0] - The luminance adaptation rate.\n */\n constructor(luminanceBuffer, { minLuminance = 0.01, adaptationRate = 1 } = {}) {\n super(\"AdaptiveLuminancePass\");\n this.fullscreenMaterial = new AdaptiveLuminanceMaterial();\n this.needsSwap = false;\n this.renderTargetPrevious = new WebGLRenderTarget3(1, 1, {\n minFilter: NearestFilter,\n magFilter: NearestFilter,\n depthBuffer: false\n });\n this.renderTargetPrevious.texture.name = \"Luminance.Previous\";\n const material = this.fullscreenMaterial;\n material.luminanceBuffer0 = this.renderTargetPrevious.texture;\n material.luminanceBuffer1 = luminanceBuffer;\n material.minLuminance = minLuminance;\n material.adaptationRate = adaptationRate;\n this.renderTargetAdapted = this.renderTargetPrevious.clone();\n this.renderTargetAdapted.texture.name = \"Luminance.Adapted\";\n this.copyPass = new CopyPass(this.renderTargetPrevious, false);\n }\n /**\n * The adaptive luminance texture.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTargetAdapted.texture;\n }\n /**\n * Returns the adaptive 1x1 luminance texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.renderTargetAdapted.texture;\n }\n /**\n * Sets the 1x1 mipmap level.\n *\n * This level is used to identify the smallest mipmap of the main luminance texture which contains the downsampled\n * average scene luminance.\n *\n * @type {Number}\n * @deprecated Use fullscreenMaterial.mipLevel1x1 instead.\n */\n set mipLevel1x1(value) {\n this.fullscreenMaterial.mipLevel1x1 = value;\n }\n /**\n * The luminance adaptation rate.\n *\n * @type {Number}\n * @deprecated Use fullscreenMaterial.adaptationRate instead.\n */\n get adaptationRate() {\n return this.fullscreenMaterial.adaptationRate;\n }\n /**\n * @type {Number}\n * @deprecated Use fullscreenMaterial.adaptationRate instead.\n */\n set adaptationRate(value) {\n this.fullscreenMaterial.adaptationRate = value;\n }\n /**\n * Renders the scene normals.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n this.fullscreenMaterial.deltaTime = deltaTime;\n renderer.setRenderTarget(this.renderToScreen ? null : this.renderTargetAdapted);\n renderer.render(this.scene, this.camera);\n this.copyPass.render(renderer, this.renderTargetAdapted);\n }\n};\n\n// src/passes/BoxBlurPass.js\nimport { BasicDepthPacking as BasicDepthPacking9, UnsignedByteType as UnsignedByteType3, WebGLRenderTarget as WebGLRenderTarget4 } from \"three\";\nvar BoxBlurPass = class extends Pass {\n /**\n * Constructs a new box blur pass.\n *\n * @param {Object} [options] - The options.\n * @param {Number} [options.kernelSize=5] - Must be an odd number. The sizes 3 and 5 use optimized code paths.\n * @param {Number} [options.iterations=1] - The amount of times the blur should be applied.\n * @param {Number} [options.bilateral=false] - Enables or disables bilateral blurring.\n * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n */\n constructor({\n kernelSize = 5,\n iterations = 1,\n bilateral = false,\n resolutionScale = 1,\n resolutionX = Resolution.AUTO_SIZE,\n resolutionY = Resolution.AUTO_SIZE\n } = {}) {\n super(\"BoxBlurPass\");\n this.needsDepthTexture = bilateral;\n this.renderTargetA = new WebGLRenderTarget4(1, 1, { depthBuffer: false });\n this.renderTargetA.texture.name = \"Blur.Target.A\";\n this.renderTargetB = new WebGLRenderTarget4(1, 1, { depthBuffer: false });\n this.renderTargetB.texture.name = \"Blur.Target.B\";\n this.blurMaterial = new BoxBlurMaterial({ bilateral, kernelSize });\n this.copyMaterial = new CopyMaterial();\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n this.iterations = iterations;\n }\n set mainCamera(value) {\n this.blurMaterial.copyCameraSettings(value);\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking9) {\n this.blurMaterial.depthBuffer = depthTexture;\n this.blurMaterial.depthPacking = depthPacking;\n }\n /**\n * Renders the blur.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const scene = this.scene;\n const camera = this.camera;\n const renderTargetA = this.renderTargetA;\n const renderTargetB = this.renderTargetB;\n const blurMaterial = this.blurMaterial;\n this.fullscreenMaterial = blurMaterial;\n let previousBuffer = inputBuffer;\n for (let i = 0, l = Math.max(this.iterations, 1); i < l; ++i) {\n const buffer = (i & 1) === 0 ? renderTargetA : renderTargetB;\n blurMaterial.inputBuffer = previousBuffer.texture;\n renderer.setRenderTarget(buffer);\n renderer.render(scene, camera);\n previousBuffer = buffer;\n }\n this.copyMaterial.inputBuffer = previousBuffer.texture;\n this.fullscreenMaterial = this.copyMaterial;\n renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n renderer.render(scene, camera);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n const w = resolution.width, h = resolution.height;\n this.renderTargetA.setSize(w, h);\n this.renderTargetB.setSize(w, h);\n this.blurMaterial.setSize(width, height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n this.blurMaterial.maxVaryingVectors = renderer.capabilities.maxVaryings;\n if (frameBufferType !== void 0) {\n this.renderTargetA.texture.type = frameBufferType;\n this.renderTargetB.texture.type = frameBufferType;\n if (frameBufferType !== UnsignedByteType3) {\n this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n } else if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTargetA.texture, SRGBColorSpace);\n setTextureColorSpace(this.renderTargetB.texture, SRGBColorSpace);\n }\n }\n }\n};\n\n// src/passes/ClearMaskPass.js\nvar ClearMaskPass = class extends Pass {\n /**\n * Constructs a new clear mask pass.\n */\n constructor() {\n super(\"ClearMaskPass\", null, null);\n this.needsSwap = false;\n }\n /**\n * Disables the global stencil test.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const stencil = renderer.state.buffers.stencil;\n stencil.setLocked(false);\n stencil.setTest(false);\n }\n};\n\n// src/passes/ClearPass.js\nimport { Color } from \"three\";\nvar color = /* @__PURE__ */ new Color();\nvar ClearPass = class extends Pass {\n /**\n * Constructs a new clear pass.\n *\n * @param {Boolean} [color=true] - Determines whether the color buffer should be cleared.\n * @param {Boolean} [depth=true] - Determines whether the depth buffer should be cleared.\n * @param {Boolean} [stencil=false] - Determines whether the stencil buffer should be cleared.\n */\n constructor(color2 = true, depth = true, stencil = false) {\n super(\"ClearPass\", null, null);\n this.needsSwap = false;\n this.color = color2;\n this.depth = depth;\n this.stencil = stencil;\n this.overrideClearColor = null;\n this.overrideClearAlpha = -1;\n }\n /**\n * Sets the clear flags.\n *\n * @param {Boolean} color - Whether the color buffer should be cleared.\n * @param {Boolean} depth - Whether the depth buffer should be cleared.\n * @param {Boolean} stencil - Whether the stencil buffer should be cleared.\n */\n setClearFlags(color2, depth, stencil) {\n this.color = color2;\n this.depth = depth;\n this.stencil = stencil;\n }\n /**\n * Returns the override clear color. Default is null.\n *\n * @deprecated Use overrideClearColor instead.\n * @return {Color} The clear color.\n */\n getOverrideClearColor() {\n return this.overrideClearColor;\n }\n /**\n * Sets the override clear color.\n *\n * @deprecated Use overrideClearColor instead.\n * @param {Color} value - The clear color.\n */\n setOverrideClearColor(value) {\n this.overrideClearColor = value;\n }\n /**\n * Returns the override clear alpha. Default is -1.\n *\n * @deprecated Use overrideClearAlpha instead.\n * @return {Number} The clear alpha.\n */\n getOverrideClearAlpha() {\n return this.overrideClearAlpha;\n }\n /**\n * Sets the override clear alpha.\n *\n * @deprecated Use overrideClearAlpha instead.\n * @param {Number} value - The clear alpha.\n */\n setOverrideClearAlpha(value) {\n this.overrideClearAlpha = value;\n }\n /**\n * Clears the input buffer or the screen.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const overrideClearColor = this.overrideClearColor;\n const overrideClearAlpha = this.overrideClearAlpha;\n const clearAlpha = renderer.getClearAlpha();\n const hasOverrideClearColor = overrideClearColor !== null;\n const hasOverrideClearAlpha = overrideClearAlpha >= 0;\n if (hasOverrideClearColor) {\n renderer.getClearColor(color);\n renderer.setClearColor(overrideClearColor, hasOverrideClearAlpha ? overrideClearAlpha : clearAlpha);\n } else if (hasOverrideClearAlpha) {\n renderer.setClearAlpha(overrideClearAlpha);\n }\n renderer.setRenderTarget(this.renderToScreen ? null : inputBuffer);\n renderer.clear(this.color, this.depth, this.stencil);\n if (hasOverrideClearColor) {\n renderer.setClearColor(color, clearAlpha);\n } else if (hasOverrideClearAlpha) {\n renderer.setClearAlpha(clearAlpha);\n }\n }\n};\n\n// src/passes/DepthPass.js\nimport { Color as Color2, MeshDepthMaterial, NearestFilter as NearestFilter2, RGBADepthPacking as RGBADepthPacking2, WebGLRenderTarget as WebGLRenderTarget5 } from \"three\";\n\n// src/passes/RenderPass.js\nvar RenderPass = class extends Pass {\n /**\n * Constructs a new render pass.\n *\n * @param {Scene} scene - The scene to render.\n * @param {Camera} camera - The camera to use to render the scene.\n * @param {Material} [overrideMaterial=null] - An override material.\n */\n constructor(scene, camera, overrideMaterial = null) {\n super(\"RenderPass\", scene, camera);\n this.needsSwap = false;\n this.clearPass = new ClearPass();\n this.overrideMaterialManager = overrideMaterial === null ? null : new OverrideMaterialManager(overrideMaterial);\n this.ignoreBackground = false;\n this.skipShadowMapUpdate = false;\n this.selection = null;\n }\n set mainScene(value) {\n this.scene = value;\n }\n set mainCamera(value) {\n this.camera = value;\n }\n get renderToScreen() {\n return super.renderToScreen;\n }\n set renderToScreen(value) {\n super.renderToScreen = value;\n this.clearPass.renderToScreen = value;\n }\n /**\n * The current override material.\n *\n * @type {Material}\n */\n get overrideMaterial() {\n const manager = this.overrideMaterialManager;\n return manager !== null ? manager.material : null;\n }\n set overrideMaterial(value) {\n const manager = this.overrideMaterialManager;\n if (value !== null) {\n if (manager !== null) {\n manager.setMaterial(value);\n } else {\n this.overrideMaterialManager = new OverrideMaterialManager(value);\n }\n } else if (manager !== null) {\n manager.dispose();\n this.overrideMaterialManager = null;\n }\n }\n /**\n * Returns the current override material.\n *\n * @deprecated Use overrideMaterial instead.\n * @return {Material} The material.\n */\n getOverrideMaterial() {\n return this.overrideMaterial;\n }\n /**\n * Sets the override material.\n *\n * @deprecated Use overrideMaterial instead.\n * @return {Material} value - The material.\n */\n setOverrideMaterial(value) {\n this.overrideMaterial = value;\n }\n /**\n * Indicates whether the target buffer should be cleared before rendering.\n *\n * @type {Boolean}\n * @deprecated Use clearPass.enabled instead.\n */\n get clear() {\n return this.clearPass.enabled;\n }\n set clear(value) {\n this.clearPass.enabled = value;\n }\n /**\n * Returns the selection. Default is `null` (no restriction).\n *\n * @deprecated Use selection instead.\n * @return {Selection} The selection.\n */\n getSelection() {\n return this.selection;\n }\n /**\n * Sets the selection. Set to `null` to disable.\n *\n * @deprecated Use selection instead.\n * @param {Selection} value - The selection.\n */\n setSelection(value) {\n this.selection = value;\n }\n /**\n * Indicates whether the scene background is disabled.\n *\n * @deprecated Use ignoreBackground instead.\n * @return {Boolean} Whether the scene background is disabled.\n */\n isBackgroundDisabled() {\n return this.ignoreBackground;\n }\n /**\n * Enables or disables the scene background.\n *\n * @deprecated Use ignoreBackground instead.\n * @param {Boolean} value - Whether the scene background should be disabled.\n */\n setBackgroundDisabled(value) {\n this.ignoreBackground = value;\n }\n /**\n * Indicates whether the shadow map auto update is disabled.\n *\n * @deprecated Use skipShadowMapUpdate instead.\n * @return {Boolean} Whether the shadow map update is disabled.\n */\n isShadowMapDisabled() {\n return this.skipShadowMapUpdate;\n }\n /**\n * Enables or disables the shadow map auto update.\n *\n * @deprecated Use skipShadowMapUpdate instead.\n * @param {Boolean} value - Whether the shadow map auto update should be disabled.\n */\n setShadowMapDisabled(value) {\n this.skipShadowMapUpdate = value;\n }\n /**\n * Returns the clear pass.\n *\n * @deprecated Use clearPass.enabled instead.\n * @return {ClearPass} The clear pass.\n */\n getClearPass() {\n return this.clearPass;\n }\n /**\n * Renders the scene.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const scene = this.scene;\n const camera = this.camera;\n const selection = this.selection;\n const mask = camera.layers.mask;\n const background = scene.background;\n const shadowMapAutoUpdate = renderer.shadowMap.autoUpdate;\n const renderTarget = this.renderToScreen ? null : inputBuffer;\n if (selection !== null) {\n camera.layers.set(selection.getLayer());\n }\n if (this.skipShadowMapUpdate) {\n renderer.shadowMap.autoUpdate = false;\n }\n if (this.ignoreBackground || this.clearPass.overrideClearColor !== null) {\n scene.background = null;\n }\n if (this.clearPass.enabled) {\n this.clearPass.render(renderer, inputBuffer);\n }\n renderer.setRenderTarget(renderTarget);\n if (this.overrideMaterialManager !== null) {\n this.overrideMaterialManager.render(renderer, scene, camera);\n } else {\n renderer.render(scene, camera);\n }\n camera.layers.mask = mask;\n scene.background = background;\n renderer.shadowMap.autoUpdate = shadowMapAutoUpdate;\n }\n};\n\n// src/passes/DepthPass.js\nvar DepthPass = class extends Pass {\n /**\n * Constructs a new depth pass.\n *\n * @param {Scene} scene - The scene to render.\n * @param {Camera} camera - The camera to use to render the scene.\n * @param {Object} [options] - The options.\n * @param {WebGLRenderTarget} [options.renderTarget] - A custom render target.\n * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n */\n constructor(scene, camera, {\n renderTarget,\n resolutionScale = 1,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"DepthPass\");\n this.needsSwap = false;\n this.renderPass = new RenderPass(scene, camera, new MeshDepthMaterial({\n depthPacking: RGBADepthPacking2\n }));\n const renderPass = this.renderPass;\n renderPass.skipShadowMapUpdate = true;\n renderPass.ignoreBackground = true;\n const clearPass = renderPass.clearPass;\n clearPass.overrideClearColor = new Color2(16777215);\n clearPass.overrideClearAlpha = 1;\n this.renderTarget = renderTarget;\n if (this.renderTarget === void 0) {\n this.renderTarget = new WebGLRenderTarget5(1, 1, {\n minFilter: NearestFilter2,\n magFilter: NearestFilter2\n });\n this.renderTarget.texture.name = \"DepthPass.Target\";\n }\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n }\n set mainScene(value) {\n this.renderPass.mainScene = value;\n }\n set mainCamera(value) {\n this.renderPass.mainCamera = value;\n }\n /**\n * The depth texture.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the depth texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the resolution settings.\n *\n * @deprecated Use resolution instead.\n * @return {Resolution} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * Returns the current resolution scale.\n *\n * @return {Number} The resolution scale.\n * @deprecated Use resolution instead.\n */\n getResolutionScale() {\n return this.resolution.scale;\n }\n /**\n * Sets the resolution scale.\n *\n * @param {Number} scale - The new resolution scale.\n * @deprecated Use resolution instead.\n */\n setResolutionScale(scale) {\n this.resolution.scale = scale;\n }\n /**\n * Renders the scene depth.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const renderTarget = this.renderToScreen ? null : this.renderTarget;\n this.renderPass.render(renderer, renderTarget);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n this.renderTarget.setSize(resolution.width, resolution.height);\n }\n};\n\n// src/passes/DepthDownsamplingPass.js\nimport { BasicDepthPacking as BasicDepthPacking10, FloatType, NearestFilter as NearestFilter3, WebGLRenderTarget as WebGLRenderTarget6 } from \"three\";\nvar DepthDownsamplingPass = class extends Pass {\n /**\n * Constructs a new depth downsampling pass.\n *\n * @param {Object} [options] - The options.\n * @param {Texture} [options.normalBuffer=null] - A texture that contains view space normals. See {@link NormalPass}.\n * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n */\n constructor({\n normalBuffer = null,\n resolutionScale = 0.5,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"DepthDownsamplingPass\");\n const material = new DepthDownsamplingMaterial();\n material.normalBuffer = normalBuffer;\n this.fullscreenMaterial = material;\n this.needsDepthTexture = true;\n this.needsSwap = false;\n this.renderTarget = new WebGLRenderTarget6(1, 1, {\n minFilter: NearestFilter3,\n magFilter: NearestFilter3,\n depthBuffer: false,\n type: FloatType\n });\n this.renderTarget.texture.name = \"DepthDownsamplingPass.Target\";\n this.renderTarget.texture.generateMipmaps = false;\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n }\n /**\n * The normal(RGB) + depth(A) texture.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the normal(RGB) + depth(A) texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the resolution settings.\n *\n * @deprecated Use resolution instead.\n * @return {Resolution} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing strategy.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking10) {\n this.fullscreenMaterial.depthBuffer = depthTexture;\n this.fullscreenMaterial.depthPacking = depthPacking;\n }\n /**\n * Downsamples depth and scene normals.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n renderer.setRenderTarget(this.renderToScreen ? null : this.renderTarget);\n renderer.render(this.scene, this.camera);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n this.renderTarget.setSize(resolution.width, resolution.height);\n this.fullscreenMaterial.setSize(width, height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n const gl = renderer.getContext();\n const renderable = gl.getExtension(\"EXT_color_buffer_float\") || gl.getExtension(\"EXT_color_buffer_half_float\");\n if (!renderable) {\n throw new Error(\"Rendering to float texture is not supported.\");\n }\n }\n};\n\n// src/passes/DepthPickingPass.js\nimport { FloatType as FloatType3, RGBADepthPacking as RGBADepthPacking4 } from \"three\";\n\n// src/passes/DepthCopyPass.js\nimport {\n BasicDepthPacking as BasicDepthPacking11,\n FloatType as FloatType2,\n NearestFilter as NearestFilter4,\n RGBADepthPacking as RGBADepthPacking3,\n UnsignedByteType as UnsignedByteType4,\n WebGLRenderTarget as WebGLRenderTarget7\n} from \"three\";\nvar DepthCopyPass = class extends Pass {\n /**\n * Constructs a new depth save pass.\n *\n * @param {Object} [options] - The options.\n * @param {DepthPackingStrategies} [options.depthPacking=RGBADepthPacking] - The output depth packing.\n */\n constructor({ depthPacking = RGBADepthPacking3 } = {}) {\n super(\"DepthCopyPass\");\n const material = new DepthCopyMaterial();\n material.outputDepthPacking = depthPacking;\n this.fullscreenMaterial = material;\n this.needsDepthTexture = true;\n this.needsSwap = false;\n this.renderTarget = new WebGLRenderTarget7(1, 1, {\n type: depthPacking === RGBADepthPacking3 ? UnsignedByteType4 : FloatType2,\n minFilter: NearestFilter4,\n magFilter: NearestFilter4,\n depthBuffer: false\n });\n this.renderTarget.texture.name = \"DepthCopyPass.Target\";\n }\n /**\n * The output depth texture.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the output depth texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.renderTarget.texture;\n }\n /**\n * The output depth packing.\n *\n * @type {DepthPackingStrategies}\n */\n get depthPacking() {\n return this.fullscreenMaterial.outputDepthPacking;\n }\n /**\n * Returns the output depth packing.\n *\n * @deprecated Use depthPacking instead.\n * @return {DepthPackingStrategies} The depth packing.\n */\n getDepthPacking() {\n return this.fullscreenMaterial.outputDepthPacking;\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking11) {\n this.fullscreenMaterial.depthBuffer = depthTexture;\n this.fullscreenMaterial.inputDepthPacking = depthPacking;\n }\n /**\n * Copies depth from a depth texture.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n renderer.setRenderTarget(this.renderToScreen ? null : this.renderTarget);\n renderer.render(this.scene, this.camera);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.renderTarget.setSize(width, height);\n }\n};\n\n// src/passes/DepthPickingPass.js\nvar unpackFactors = new Float32Array([\n 255 / 256 / 256 ** 3,\n 255 / 256 / 256 ** 2,\n 255 / 256 / 256,\n 255 / 256\n]);\nfunction unpackRGBAToDepth(packedDepth) {\n return (packedDepth[0] * unpackFactors[0] + packedDepth[1] * unpackFactors[1] + packedDepth[2] * unpackFactors[2] + packedDepth[3] * unpackFactors[3]) / 255;\n}\nvar DepthPickingPass = class extends DepthCopyPass {\n /**\n * Constructs a new depth picking pass.\n *\n * @param {Object} [options] - The options.\n * @param {DepthPackingStrategies} [options.depthPacking=RGBADepthPacking] - The depth packing.\n * @param {Number} [options.mode=DepthCopyMode.SINGLE] - The depth copy mode.\n */\n constructor({ depthPacking = RGBADepthPacking4, mode = DepthCopyMode.SINGLE } = {}) {\n super({ depthPacking });\n this.name = \"DepthPickingPass\";\n this.fullscreenMaterial.mode = mode;\n this.pixelBuffer = depthPacking === RGBADepthPacking4 ? new Uint8Array(4) : new Float32Array(4);\n this.callback = null;\n }\n /**\n * Reads depth at a specific screen position.\n *\n * Only one depth value can be picked per frame. Calling this method multiple times per frame will overwrite the\n * picking coordinates. Unresolved promises will be abandoned.\n *\n * @example\n * const ndc = new Vector3();\n * const clientRect = myViewport.getBoundingClientRect();\n * const clientX = pointerEvent.clientX - clientRect.left;\n * const clientY = pointerEvent.clientY - clientRect.top;\n * ndc.x = (clientX / myViewport.clientWidth) * 2.0 - 1.0;\n * ndc.y = -(clientY / myViewport.clientHeight) * 2.0 + 1.0;\n * const depth = await depthPickingPass.readDepth(ndc);\n * ndc.z = depth * 2.0 - 1.0;\n *\n * const worldPosition = ndc.unproject(camera);\n *\n * @param {Vector2|Vector3} ndc - Normalized device coordinates. Only X and Y are relevant.\n * @return {Promise<Number>} A promise that returns the depth on the next frame.\n */\n readDepth(ndc) {\n this.fullscreenMaterial.texelPosition.set(ndc.x * 0.5 + 0.5, ndc.y * 0.5 + 0.5);\n return new Promise((resolve) => {\n this.callback = resolve;\n });\n }\n /**\n * Copies depth and resolves depth picking promises.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const material = this.fullscreenMaterial;\n const mode = material.mode;\n if (mode === DepthCopyMode.FULL) {\n super.render(renderer);\n }\n if (this.callback !== null) {\n const renderTarget = this.renderTarget;\n const pixelBuffer = this.pixelBuffer;\n const packed = renderTarget.texture.type !== FloatType3;\n let x = 0, y = 0;\n if (mode === DepthCopyMode.SINGLE) {\n super.render(renderer);\n } else {\n const texelPosition = material.texelPosition;\n x = Math.round(texelPosition.x * renderTarget.width);\n y = Math.round(texelPosition.y * renderTarget.height);\n }\n renderer.readRenderTargetPixels(renderTarget, x, y, 1, 1, pixelBuffer);\n this.callback(packed ? unpackRGBAToDepth(pixelBuffer) : pixelBuffer[0]);\n this.callback = null;\n }\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n if (this.fullscreenMaterial.mode === DepthCopyMode.FULL) {\n super.setSize(width, height);\n }\n }\n};\n\n// src/passes/EffectPass.js\nimport { BasicDepthPacking as BasicDepthPacking12, UnsignedByteType as UnsignedByteType5 } from \"three\";\nfunction prefixSubstrings(prefix, substrings, strings) {\n for (const substring of substrings) {\n const prefixed = \"$1\" + prefix + substring.charAt(0).toUpperCase() + substring.slice(1);\n const regExp = new RegExp(\"([^\\\\.])(\\\\b\" + substring + \"\\\\b)\", \"g\");\n for (const entry of strings.entries()) {\n if (entry[1] !== null) {\n strings.set(entry[0], entry[1].replace(regExp, prefixed));\n }\n }\n }\n}\nfunction integrateEffect(prefix, effect, data) {\n let fragmentShader = effect.getFragmentShader();\n let vertexShader = effect.getVertexShader();\n const mainImageExists = fragmentShader !== void 0 && /mainImage/.test(fragmentShader);\n const mainUvExists = fragmentShader !== void 0 && /mainUv/.test(fragmentShader);\n data.attributes |= effect.getAttributes();\n if (fragmentShader === void 0) {\n throw new Error(`Missing fragment shader (${effect.name})`);\n } else if (mainUvExists && (data.attributes & EffectAttribute.CONVOLUTION) !== 0) {\n throw new Error(`Effects that transform UVs are incompatible with convolution effects (${effect.name})`);\n } else if (!mainImageExists && !mainUvExists) {\n throw new Error(`Could not find mainImage or mainUv function (${effect.name})`);\n } else {\n const functionRegExp = /\\w+\\s+(\\w+)\\([\\w\\s,]*\\)\\s*{/g;\n const shaderParts = data.shaderParts;\n let fragmentHead = shaderParts.get(EffectShaderSection.FRAGMENT_HEAD) || \"\";\n let fragmentMainUv = shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_UV) || \"\";\n let fragmentMainImage = shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_IMAGE) || \"\";\n let vertexHead = shaderParts.get(EffectShaderSection.VERTEX_HEAD) || \"\";\n let vertexMainSupport = shaderParts.get(EffectShaderSection.VERTEX_MAIN_SUPPORT) || \"\";\n const varyings = /* @__PURE__ */ new Set();\n const names = /* @__PURE__ */ new Set();\n if (mainUvExists) {\n fragmentMainUv += `\t${prefix}MainUv(UV);\n`;\n data.uvTransformation = true;\n }\n if (vertexShader !== null && /mainSupport/.test(vertexShader)) {\n const needsUv = /mainSupport *\\([\\w\\s]*?uv\\s*?\\)/.test(vertexShader);\n vertexMainSupport += `\t${prefix}MainSupport(`;\n vertexMainSupport += needsUv ? \"vUv);\\n\" : \");\\n\";\n for (const m2 of vertexShader.matchAll(/(?:varying\\s+\\w+\\s+([\\S\\s]*?);)/g)) {\n for (const n of m2[1].split(/\\s*,\\s*/)) {\n data.varyings.add(n);\n varyings.add(n);\n names.add(n);\n }\n }\n for (const m2 of vertexShader.matchAll(functionRegExp)) {\n names.add(m2[1]);\n }\n }\n for (const m2 of fragmentShader.matchAll(functionRegExp)) {\n names.add(m2[1]);\n }\n for (const d of effect.defines.keys()) {\n names.add(d.replace(/\\([\\w\\s,]*\\)/g, \"\"));\n }\n for (const u of effect.uniforms.keys()) {\n names.add(u);\n }\n names.delete(\"while\");\n names.delete(\"for\");\n names.delete(\"if\");\n effect.uniforms.forEach((val, key) => data.uniforms.set(prefix + key.charAt(0).toUpperCase() + key.slice(1), val));\n effect.defines.forEach((val, key) => data.defines.set(prefix + key.charAt(0).toUpperCase() + key.slice(1), val));\n const shaders = /* @__PURE__ */ new Map([[\"fragment\", fragmentShader], [\"vertex\", vertexShader]]);\n prefixSubstrings(prefix, names, data.defines);\n prefixSubstrings(prefix, names, shaders);\n fragmentShader = shaders.get(\"fragment\");\n vertexShader = shaders.get(\"vertex\");\n const blendMode = effect.blendMode;\n data.blendModes.set(blendMode.blendFunction, blendMode);\n if (mainImageExists) {\n if (effect.inputColorSpace !== null && effect.inputColorSpace !== data.colorSpace) {\n fragmentMainImage += effect.inputColorSpace === SRGBColorSpace ? \"color0 = LinearTosRGB(color0);\\n\t\" : \"color0 = sRGBToLinear(color0);\\n\t\";\n }\n if (effect.outputColorSpace !== NoColorSpace) {\n data.colorSpace = effect.outputColorSpace;\n } else if (effect.inputColorSpace !== null) {\n data.colorSpace = effect.inputColorSpace;\n }\n const depthParamRegExp = /MainImage *\\([\\w\\s,]*?depth[\\w\\s,]*?\\)/;\n fragmentMainImage += `${prefix}MainImage(color0, UV, `;\n if ((data.attributes & EffectAttribute.DEPTH) !== 0 && depthParamRegExp.test(fragmentShader)) {\n fragmentMainImage += \"depth, \";\n data.readDepth = true;\n }\n fragmentMainImage += \"color1);\\n\t\";\n const blendOpacity = prefix + \"BlendOpacity\";\n data.uniforms.set(blendOpacity, blendMode.opacity);\n fragmentMainImage += `color0 = blend${blendMode.blendFunction}(color0, color1, ${blendOpacity});\n\n\t`;\n fragmentHead += `uniform float ${blendOpacity};\n\n`;\n }\n fragmentHead += fragmentShader + \"\\n\";\n if (vertexShader !== null) {\n vertexHead += vertexShader + \"\\n\";\n }\n shaderParts.set(EffectShaderSection.FRAGMENT_HEAD, fragmentHead);\n shaderParts.set(EffectShaderSection.FRAGMENT_MAIN_UV, fragmentMainUv);\n shaderParts.set(EffectShaderSection.FRAGMENT_MAIN_IMAGE, fragmentMainImage);\n shaderParts.set(EffectShaderSection.VERTEX_HEAD, vertexHead);\n shaderParts.set(EffectShaderSection.VERTEX_MAIN_SUPPORT, vertexMainSupport);\n if (effect.extensions !== null) {\n for (const extension of effect.extensions) {\n data.extensions.add(extension);\n }\n }\n }\n}\nvar EffectPass = class extends Pass {\n /**\n * Constructs a new effect pass.\n *\n * @param {Camera} camera - The main camera.\n * @param {...Effect} effects - The effects that will be rendered by this pass.\n */\n constructor(camera, ...effects) {\n super(\"EffectPass\");\n this.fullscreenMaterial = new EffectMaterial(null, null, null, camera);\n this.listener = (event) => this.handleEvent(event);\n this.effects = [];\n this.setEffects(effects);\n this.skipRendering = false;\n this.minTime = 1;\n this.maxTime = Number.POSITIVE_INFINITY;\n this.timeScale = 1;\n }\n set mainScene(value) {\n for (const effect of this.effects) {\n effect.mainScene = value;\n }\n }\n set mainCamera(value) {\n this.fullscreenMaterial.copyCameraSettings(value);\n for (const effect of this.effects) {\n effect.mainCamera = value;\n }\n }\n /**\n * Indicates whether this pass encodes its output when rendering to screen.\n *\n * @type {Boolean}\n * @deprecated Use fullscreenMaterial.encodeOutput instead.\n */\n get encodeOutput() {\n return this.fullscreenMaterial.encodeOutput;\n }\n set encodeOutput(value) {\n this.fullscreenMaterial.encodeOutput = value;\n }\n /**\n * Indicates whether dithering is enabled.\n *\n * @type {Boolean}\n */\n get dithering() {\n return this.fullscreenMaterial.dithering;\n }\n set dithering(value) {\n const material = this.fullscreenMaterial;\n material.dithering = value;\n material.needsUpdate = true;\n }\n /**\n * Sets the effects.\n *\n * @param {Effect[]} effects - The effects.\n * @protected\n */\n setEffects(effects) {\n for (const effect of this.effects) {\n effect.removeEventListener(\"change\", this.listener);\n }\n this.effects = effects.sort((a, b) => b.attributes - a.attributes);\n for (const effect of this.effects) {\n effect.addEventListener(\"change\", this.listener);\n }\n }\n /**\n * Updates the compound shader material.\n *\n * @protected\n */\n updateMaterial() {\n const data = new EffectShaderData();\n let id = 0;\n for (const effect of this.effects) {\n if (effect.blendMode.blendFunction === BlendFunction.DST) {\n data.attributes |= effect.getAttributes() & EffectAttribute.DEPTH;\n } else if ((data.attributes & effect.getAttributes() & EffectAttribute.CONVOLUTION) !== 0) {\n throw new Error(`Convolution effects cannot be merged (${effect.name})`);\n } else {\n integrateEffect(\"e\" + id++, effect, data);\n }\n }\n let fragmentHead = data.shaderParts.get(EffectShaderSection.FRAGMENT_HEAD);\n let fragmentMainImage = data.shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_IMAGE);\n let fragmentMainUv = data.shaderParts.get(EffectShaderSection.FRAGMENT_MAIN_UV);\n const blendRegExp = /\\bblend\\b/g;\n for (const blendMode of data.blendModes.values()) {\n fragmentHead += blendMode.getShaderCode().replace(blendRegExp, `blend${blendMode.blendFunction}`) + \"\\n\";\n }\n if ((data.attributes & EffectAttribute.DEPTH) !== 0) {\n if (data.readDepth) {\n fragmentMainImage = \"float depth = readDepth(UV);\\n\\n\t\" + fragmentMainImage;\n }\n this.needsDepthTexture = this.getDepthTexture() === null;\n } else {\n this.needsDepthTexture = false;\n }\n if (data.colorSpace === SRGBColorSpace) {\n fragmentMainImage += \"color0 = sRGBToLinear(color0);\\n\t\";\n }\n if (data.uvTransformation) {\n fragmentMainUv = \"vec2 transformedUv = vUv;\\n\" + fragmentMainUv;\n data.defines.set(\"UV\", \"transformedUv\");\n } else {\n data.defines.set(\"UV\", \"vUv\");\n }\n data.shaderParts.set(EffectShaderSection.FRAGMENT_HEAD, fragmentHead);\n data.shaderParts.set(EffectShaderSection.FRAGMENT_MAIN_IMAGE, fragmentMainImage);\n data.shaderParts.set(EffectShaderSection.FRAGMENT_MAIN_UV, fragmentMainUv);\n for (const [key, value] of data.shaderParts) {\n if (value !== null) {\n data.shaderParts.set(key, value.trim().replace(/^#/, \"\\n#\"));\n }\n }\n this.skipRendering = id === 0;\n this.needsSwap = !this.skipRendering;\n this.fullscreenMaterial.setShaderData(data);\n }\n /**\n * Rebuilds the shader material.\n */\n recompile() {\n this.updateMaterial();\n }\n /**\n * Returns the current depth texture.\n *\n * @return {Texture} The current depth texture, or null if there is none.\n */\n getDepthTexture() {\n return this.fullscreenMaterial.depthBuffer;\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking12) {\n this.fullscreenMaterial.depthBuffer = depthTexture;\n this.fullscreenMaterial.depthPacking = depthPacking;\n for (const effect of this.effects) {\n effect.setDepthTexture(depthTexture, depthPacking);\n }\n }\n /**\n * Renders the effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n for (const effect of this.effects) {\n effect.update(renderer, inputBuffer, deltaTime);\n }\n if (!this.skipRendering || this.renderToScreen) {\n const material = this.fullscreenMaterial;\n material.inputBuffer = inputBuffer.texture;\n material.time += deltaTime * this.timeScale;\n renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n renderer.render(this.scene, this.camera);\n }\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.fullscreenMaterial.setSize(width, height);\n for (const effect of this.effects) {\n effect.setSize(width, height);\n }\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n this.renderer = renderer;\n for (const effect of this.effects) {\n effect.initialize(renderer, alpha, frameBufferType);\n }\n this.updateMaterial();\n if (frameBufferType !== void 0 && frameBufferType !== UnsignedByteType5) {\n this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n }\n }\n /**\n * Deletes disposable objects.\n */\n dispose() {\n super.dispose();\n for (const effect of this.effects) {\n effect.removeEventListener(\"change\", this.listener);\n effect.dispose();\n }\n }\n /**\n * Handles events.\n *\n * @param {Event} event - An event.\n */\n handleEvent(event) {\n switch (event.type) {\n case \"change\":\n this.recompile();\n break;\n }\n }\n};\n\n// src/passes/GaussianBlurPass.js\nimport { UnsignedByteType as UnsignedByteType6, WebGLRenderTarget as WebGLRenderTarget8 } from \"three\";\nvar GaussianBlurPass = class extends Pass {\n /**\n * Constructs a new Gaussian blur pass.\n *\n * @param {Object} [options] - The options.\n * @param {Number} [options.kernelSize=35] - The kernel size. Should be an odd number in the range [3, 1020].\n * @param {Number} [options.iterations=1] - The amount of times the blur should be applied.\n * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n */\n constructor({\n kernelSize = 35,\n iterations = 1,\n resolutionScale = 1,\n resolutionX = Resolution.AUTO_SIZE,\n resolutionY = Resolution.AUTO_SIZE\n } = {}) {\n super(\"GaussianBlurPass\");\n this.renderTargetA = new WebGLRenderTarget8(1, 1, { depthBuffer: false });\n this.renderTargetA.texture.name = \"Blur.Target.A\";\n this.renderTargetB = this.renderTargetA.clone();\n this.renderTargetB.texture.name = \"Blur.Target.B\";\n this.blurMaterial = new GaussianBlurMaterial({ kernelSize });\n this.copyMaterial = new CopyMaterial();\n this.copyMaterial.inputBuffer = this.renderTargetB.texture;\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n this.iterations = iterations;\n }\n /**\n * Renders the blur.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const scene = this.scene;\n const camera = this.camera;\n const renderTargetA = this.renderTargetA;\n const renderTargetB = this.renderTargetB;\n const blurMaterial = this.blurMaterial;\n this.fullscreenMaterial = blurMaterial;\n let previousBuffer = inputBuffer;\n for (let i = 0, l = Math.max(this.iterations, 1); i < l; ++i) {\n blurMaterial.direction.set(1, 0);\n blurMaterial.inputBuffer = previousBuffer.texture;\n renderer.setRenderTarget(renderTargetA);\n renderer.render(scene, camera);\n blurMaterial.direction.set(0, 1);\n blurMaterial.inputBuffer = renderTargetA.texture;\n renderer.setRenderTarget(renderTargetB);\n renderer.render(scene, camera);\n if (i === 0 && l > 1) {\n previousBuffer = renderTargetB;\n }\n }\n this.fullscreenMaterial = this.copyMaterial;\n renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n renderer.render(scene, camera);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n const w = resolution.width, h = resolution.height;\n this.renderTargetA.setSize(w, h);\n this.renderTargetB.setSize(w, h);\n this.blurMaterial.setSize(width, height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n if (frameBufferType !== void 0) {\n this.renderTargetA.texture.type = frameBufferType;\n this.renderTargetB.texture.type = frameBufferType;\n if (frameBufferType !== UnsignedByteType6) {\n this.blurMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n this.copyMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n } else if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTargetA.texture, SRGBColorSpace);\n setTextureColorSpace(this.renderTargetB.texture, SRGBColorSpace);\n }\n }\n }\n};\n\n// src/passes/KawaseBlurPass.js\nimport { UnsignedByteType as UnsignedByteType7, WebGLRenderTarget as WebGLRenderTarget9 } from \"three\";\nvar KawaseBlurPass = class extends Pass {\n /**\n * Constructs a new Kawase blur pass.\n *\n * @param {Object} [options] - The options.\n * @param {KernelSize} [options.kernelSize=KernelSize.MEDIUM] - The blur kernel size.\n * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n */\n constructor({\n kernelSize = KernelSize.MEDIUM,\n resolutionScale = 0.5,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"KawaseBlurPass\");\n this.renderTargetA = new WebGLRenderTarget9(1, 1, { depthBuffer: false });\n this.renderTargetA.texture.name = \"Blur.Target.A\";\n this.renderTargetB = this.renderTargetA.clone();\n this.renderTargetB.texture.name = \"Blur.Target.B\";\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n this._blurMaterial = new KawaseBlurMaterial();\n this._blurMaterial.kernelSize = kernelSize;\n this.copyMaterial = new CopyMaterial();\n }\n /**\n * Returns the resolution settings.\n *\n * @deprecated Use resolution instead.\n * @return {Resolution} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * The blur material.\n *\n * @type {KawaseBlurMaterial}\n */\n get blurMaterial() {\n return this._blurMaterial;\n }\n /**\n * The blur material.\n *\n * @type {KawaseBlurMaterial}\n * @protected\n */\n set blurMaterial(value) {\n this._blurMaterial = value;\n }\n /**\n * Indicates whether dithering is enabled.\n *\n * @type {Boolean}\n * @deprecated Use copyMaterial.dithering instead.\n */\n get dithering() {\n return this.copyMaterial.dithering;\n }\n set dithering(value) {\n this.copyMaterial.dithering = value;\n }\n /**\n * The kernel size.\n *\n * @type {KernelSize}\n * @deprecated Use blurMaterial.kernelSize instead.\n */\n get kernelSize() {\n return this.blurMaterial.kernelSize;\n }\n set kernelSize(value) {\n this.blurMaterial.kernelSize = value;\n }\n /**\n * The current width of the internal render targets.\n *\n * @type {Number}\n * @deprecated Use resolution.width instead.\n */\n get width() {\n return this.resolution.width;\n }\n /**\n * Sets the render width.\n *\n * @type {Number}\n * @deprecated Use resolution.preferredWidth instead.\n */\n set width(value) {\n this.resolution.preferredWidth = value;\n }\n /**\n * The current height of the internal render targets.\n *\n * @type {Number}\n * @deprecated Use resolution.height instead.\n */\n get height() {\n return this.resolution.height;\n }\n /**\n * Sets the render height.\n *\n * @type {Number}\n * @deprecated Use resolution.preferredHeight instead.\n */\n set height(value) {\n this.resolution.preferredHeight = value;\n }\n /**\n * The current blur scale.\n *\n * @type {Number}\n * @deprecated Use blurMaterial.scale instead.\n */\n get scale() {\n return this.blurMaterial.scale;\n }\n set scale(value) {\n this.blurMaterial.scale = value;\n }\n /**\n * Returns the current blur scale.\n *\n * @deprecated Use blurMaterial.scale instead.\n * @return {Number} The scale.\n */\n getScale() {\n return this.blurMaterial.scale;\n }\n /**\n * Sets the blur scale.\n *\n * @deprecated Use blurMaterial.scale instead.\n * @param {Number} value - The scale.\n */\n setScale(value) {\n this.blurMaterial.scale = value;\n }\n /**\n * Returns the kernel size.\n *\n * @deprecated Use blurMaterial.kernelSize instead.\n * @return {KernelSize} The kernel size.\n */\n getKernelSize() {\n return this.kernelSize;\n }\n /**\n * Sets the kernel size.\n *\n * Larger kernels require more processing power but scale well with larger render resolutions.\n *\n * @deprecated Use blurMaterial.kernelSize instead.\n * @param {KernelSize} value - The kernel size.\n */\n setKernelSize(value) {\n this.kernelSize = value;\n }\n /**\n * Returns the current resolution scale.\n *\n * @return {Number} The resolution scale.\n * @deprecated Use resolution instead.\n */\n getResolutionScale() {\n return this.resolution.scale;\n }\n /**\n * Sets the resolution scale.\n *\n * @param {Number} scale - The new resolution scale.\n * @deprecated Use resolution instead.\n */\n setResolutionScale(scale) {\n this.resolution.scale = scale;\n }\n /**\n * Renders the blur.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const scene = this.scene;\n const camera = this.camera;\n const renderTargetA = this.renderTargetA;\n const renderTargetB = this.renderTargetB;\n const material = this.blurMaterial;\n const kernelSequence = material.kernelSequence;\n let previousBuffer = inputBuffer;\n this.fullscreenMaterial = material;\n for (let i = 0, l = kernelSequence.length; i < l; ++i) {\n const buffer = (i & 1) === 0 ? renderTargetA : renderTargetB;\n material.kernel = kernelSequence[i];\n material.inputBuffer = previousBuffer.texture;\n renderer.setRenderTarget(buffer);\n renderer.render(scene, camera);\n previousBuffer = buffer;\n }\n this.fullscreenMaterial = this.copyMaterial;\n this.copyMaterial.inputBuffer = previousBuffer.texture;\n renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n renderer.render(scene, camera);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n const w = resolution.width, h = resolution.height;\n this.renderTargetA.setSize(w, h);\n this.renderTargetB.setSize(w, h);\n this.blurMaterial.setSize(width, height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n if (frameBufferType !== void 0) {\n this.renderTargetA.texture.type = frameBufferType;\n this.renderTargetB.texture.type = frameBufferType;\n if (frameBufferType !== UnsignedByteType7) {\n this.blurMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n this.copyMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n } else if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTargetA.texture, SRGBColorSpace);\n setTextureColorSpace(this.renderTargetB.texture, SRGBColorSpace);\n }\n }\n }\n /**\n * An auto sizing flag.\n *\n * @type {Number}\n * @deprecated Use {@link Resolution.AUTO_SIZE} instead.\n */\n static get AUTO_SIZE() {\n return Resolution.AUTO_SIZE;\n }\n};\n\n// src/passes/LambdaPass.js\nvar LambdaPass = class extends Pass {\n /**\n * Constructs a new lambda pass.\n *\n * @param {Function} f - A function.\n */\n constructor(f) {\n super(\"LambdaPass\", null, null);\n this.needsSwap = false;\n this.f = f;\n }\n /**\n * Executes the function.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n this.f();\n }\n};\n\n// src/passes/LuminancePass.js\nimport { UnsignedByteType as UnsignedByteType8, WebGLRenderTarget as WebGLRenderTarget10 } from \"three\";\nvar LuminancePass = class extends Pass {\n /**\n * Constructs a new luminance pass.\n *\n * @param {Object} [options] - The options. See {@link LuminanceMaterial} for additional options.\n * @param {WebGLRenderTarget} [options.renderTarget] - A custom render target.\n * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n */\n constructor({\n renderTarget,\n luminanceRange,\n colorOutput,\n resolutionScale = 1,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"LuminancePass\");\n this.fullscreenMaterial = new LuminanceMaterial(colorOutput, luminanceRange);\n this.needsSwap = false;\n this.renderTarget = renderTarget;\n if (this.renderTarget === void 0) {\n this.renderTarget = new WebGLRenderTarget10(1, 1, { depthBuffer: false });\n this.renderTarget.texture.name = \"LuminancePass.Target\";\n }\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n }\n /**\n * The luminance texture.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the luminance texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the resolution settings.\n *\n * @deprecated Use resolution instead.\n * @return {Resolution} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * Renders the luminance.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const material = this.fullscreenMaterial;\n material.inputBuffer = inputBuffer.texture;\n renderer.setRenderTarget(this.renderToScreen ? null : this.renderTarget);\n renderer.render(this.scene, this.camera);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n this.renderTarget.setSize(resolution.width, resolution.height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - A renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n if (frameBufferType !== void 0 && frameBufferType !== UnsignedByteType8) {\n this.renderTarget.texture.type = frameBufferType;\n this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n }\n }\n};\n\n// src/passes/MaskPass.js\nvar MaskPass = class extends Pass {\n /**\n * Constructs a new mask pass.\n *\n * @param {Scene} scene - The scene to render.\n * @param {Camera} camera - The camera to use.\n */\n constructor(scene, camera) {\n super(\"MaskPass\", scene, camera);\n this.needsSwap = false;\n this.clearPass = new ClearPass(false, false, true);\n this.inverse = false;\n }\n set mainScene(value) {\n this.scene = value;\n }\n set mainCamera(value) {\n this.camera = value;\n }\n /**\n * Indicates whether the mask should be inverted.\n *\n * @type {Boolean}\n */\n get inverted() {\n return this.inverse;\n }\n set inverted(value) {\n this.inverse = value;\n }\n /**\n * Indicates whether this pass should clear the stencil buffer.\n *\n * @type {Boolean}\n * @deprecated Use clearPass.enabled instead.\n */\n get clear() {\n return this.clearPass.enabled;\n }\n set clear(value) {\n this.clearPass.enabled = value;\n }\n /**\n * Returns the internal clear pass.\n *\n * @deprecated Use clearPass.enabled instead.\n * @return {ClearPass} The clear pass.\n */\n getClearPass() {\n return this.clearPass;\n }\n /**\n * Indicates whether the mask is inverted.\n *\n * @deprecated Use inverted instead.\n * @return {Boolean} Whether the mask is inverted.\n */\n isInverted() {\n return this.inverted;\n }\n /**\n * Enables or disable mask inversion.\n *\n * @deprecated Use inverted instead.\n * @param {Boolean} value - Whether the mask should be inverted.\n */\n setInverted(value) {\n this.inverted = value;\n }\n /**\n * Renders the effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const context = renderer.getContext();\n const buffers = renderer.state.buffers;\n const scene = this.scene;\n const camera = this.camera;\n const clearPass = this.clearPass;\n const writeValue = this.inverted ? 0 : 1;\n const clearValue = 1 - writeValue;\n buffers.color.setMask(false);\n buffers.depth.setMask(false);\n buffers.color.setLocked(true);\n buffers.depth.setLocked(true);\n buffers.stencil.setTest(true);\n buffers.stencil.setOp(context.REPLACE, context.REPLACE, context.REPLACE);\n buffers.stencil.setFunc(context.ALWAYS, writeValue, 4294967295);\n buffers.stencil.setClear(clearValue);\n buffers.stencil.setLocked(true);\n if (this.clearPass.enabled) {\n if (this.renderToScreen) {\n clearPass.render(renderer, null);\n } else {\n clearPass.render(renderer, inputBuffer);\n clearPass.render(renderer, outputBuffer);\n }\n }\n if (this.renderToScreen) {\n renderer.setRenderTarget(null);\n renderer.render(scene, camera);\n } else {\n renderer.setRenderTarget(inputBuffer);\n renderer.render(scene, camera);\n renderer.setRenderTarget(outputBuffer);\n renderer.render(scene, camera);\n }\n buffers.color.setLocked(false);\n buffers.depth.setLocked(false);\n buffers.stencil.setLocked(false);\n buffers.stencil.setFunc(context.EQUAL, 1, 4294967295);\n buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP);\n buffers.stencil.setLocked(true);\n }\n};\n\n// src/passes/MipmapBlurPass.js\nimport { UnsignedByteType as UnsignedByteType9, Vector2 as Vector215, WebGLRenderTarget as WebGLRenderTarget11 } from \"three\";\nvar MipmapBlurPass = class extends Pass {\n /**\n * Constructs a new mipmap blur pass.\n *\n * @param {Object} [options] - The options.\n */\n constructor() {\n super(\"MipmapBlurPass\");\n this.needsSwap = false;\n this.renderTarget = new WebGLRenderTarget11(1, 1, { depthBuffer: false });\n this.renderTarget.texture.name = \"Upsampling.Mipmap0\";\n this.downsamplingMipmaps = [];\n this.upsamplingMipmaps = [];\n this.downsamplingMaterial = new DownsamplingMaterial();\n this.upsamplingMaterial = new UpsamplingMaterial();\n this.resolution = new Vector215();\n }\n /**\n * A texture that contains the blurred result.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTarget.texture;\n }\n /**\n * The MIP levels. Default is 8.\n *\n * @type {Number}\n */\n get levels() {\n return this.downsamplingMipmaps.length;\n }\n set levels(value) {\n if (this.levels !== value) {\n const renderTarget = this.renderTarget;\n this.dispose();\n this.downsamplingMipmaps = [];\n this.upsamplingMipmaps = [];\n for (let i = 0; i < value; ++i) {\n const mipmap = renderTarget.clone();\n mipmap.texture.name = \"Downsampling.Mipmap\" + i;\n this.downsamplingMipmaps.push(mipmap);\n }\n this.upsamplingMipmaps.push(renderTarget);\n for (let i = 1, l = value - 1; i < l; ++i) {\n const mipmap = renderTarget.clone();\n mipmap.texture.name = \"Upsampling.Mipmap\" + i;\n this.upsamplingMipmaps.push(mipmap);\n }\n this.setSize(this.resolution.x, this.resolution.y);\n }\n }\n /**\n * The blur radius.\n *\n * @type {Number}\n */\n get radius() {\n return this.upsamplingMaterial.radius;\n }\n set radius(value) {\n this.upsamplingMaterial.radius = value;\n }\n /**\n * Renders the blur.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const { scene, camera } = this;\n const { downsamplingMaterial, upsamplingMaterial } = this;\n const { downsamplingMipmaps, upsamplingMipmaps } = this;\n let previousBuffer = inputBuffer;\n this.fullscreenMaterial = downsamplingMaterial;\n for (let i = 0, l = downsamplingMipmaps.length; i < l; ++i) {\n const mipmap = downsamplingMipmaps[i];\n downsamplingMaterial.setSize(previousBuffer.width, previousBuffer.height);\n downsamplingMaterial.inputBuffer = previousBuffer.texture;\n renderer.setRenderTarget(mipmap);\n renderer.render(scene, camera);\n previousBuffer = mipmap;\n }\n this.fullscreenMaterial = upsamplingMaterial;\n for (let i = upsamplingMipmaps.length - 1; i >= 0; --i) {\n const mipmap = upsamplingMipmaps[i];\n upsamplingMaterial.setSize(previousBuffer.width, previousBuffer.height);\n upsamplingMaterial.inputBuffer = previousBuffer.texture;\n upsamplingMaterial.supportBuffer = downsamplingMipmaps[i].texture;\n renderer.setRenderTarget(mipmap);\n renderer.render(scene, camera);\n previousBuffer = mipmap;\n }\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.set(width, height);\n let w = resolution.width, h = resolution.height;\n for (let i = 0, l = this.downsamplingMipmaps.length; i < l; ++i) {\n w = Math.round(w * 0.5);\n h = Math.round(h * 0.5);\n this.downsamplingMipmaps[i].setSize(w, h);\n if (i < this.upsamplingMipmaps.length) {\n this.upsamplingMipmaps[i].setSize(w, h);\n }\n }\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n if (frameBufferType !== void 0) {\n const mipmaps = this.downsamplingMipmaps.concat(this.upsamplingMipmaps);\n for (const mipmap of mipmaps) {\n mipmap.texture.type = frameBufferType;\n }\n if (frameBufferType !== UnsignedByteType9) {\n this.downsamplingMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n this.upsamplingMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n } else if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n for (const mipmap of mipmaps) {\n setTextureColorSpace(mipmap.texture, SRGBColorSpace);\n }\n }\n }\n }\n /**\n * Deletes internal render targets and textures.\n */\n dispose() {\n super.dispose();\n for (const mipmap of this.downsamplingMipmaps.concat(this.upsamplingMipmaps)) {\n mipmap.dispose();\n }\n }\n};\n\n// src/passes/NormalPass.js\nimport { Color as Color3, MeshNormalMaterial, NearestFilter as NearestFilter5, WebGLRenderTarget as WebGLRenderTarget12 } from \"three\";\nvar NormalPass = class extends Pass {\n /**\n * Constructs a new normal pass.\n *\n * @param {Scene} scene - The scene to render.\n * @param {Camera} camera - The camera to use to render the scene.\n * @param {Object} [options] - The options.\n * @param {WebGLRenderTarget} [options.renderTarget] - A custom render target.\n * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n */\n constructor(scene, camera, {\n renderTarget,\n resolutionScale = 1,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"NormalPass\");\n this.needsSwap = false;\n this.renderPass = new RenderPass(scene, camera, new MeshNormalMaterial());\n const renderPass = this.renderPass;\n renderPass.ignoreBackground = true;\n renderPass.skipShadowMapUpdate = true;\n const clearPass = renderPass.getClearPass();\n clearPass.overrideClearColor = new Color3(7829503);\n clearPass.overrideClearAlpha = 1;\n this.renderTarget = renderTarget;\n if (this.renderTarget === void 0) {\n this.renderTarget = new WebGLRenderTarget12(1, 1, {\n minFilter: NearestFilter5,\n magFilter: NearestFilter5\n });\n this.renderTarget.texture.name = \"NormalPass.Target\";\n }\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n }\n set mainScene(value) {\n this.renderPass.mainScene = value;\n }\n set mainCamera(value) {\n this.renderPass.mainCamera = value;\n }\n /**\n * The normal texture.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTarget.texture;\n }\n /**\n * The normal texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.renderTarget.texture;\n }\n /**\n * Returns the resolution settings.\n *\n * @deprecated Use resolution instead.\n * @return {Resolution} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * Returns the current resolution scale.\n *\n * @return {Number} The resolution scale.\n * @deprecated Use resolution.preferredWidth or resolution.preferredHeight instead.\n */\n getResolutionScale() {\n return this.resolution.scale;\n }\n /**\n * Sets the resolution scale.\n *\n * @param {Number} scale - The new resolution scale.\n * @deprecated Use resolution.preferredWidth or resolution.preferredHeight instead.\n */\n setResolutionScale(scale) {\n this.resolution.scale = scale;\n }\n /**\n * Renders the scene normals.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const renderTarget = this.renderToScreen ? null : this.renderTarget;\n this.renderPass.render(renderer, renderTarget, renderTarget);\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n this.renderTarget.setSize(resolution.width, resolution.height);\n }\n};\n\n// src/passes/ShaderPass.js\nimport { UnsignedByteType as UnsignedByteType10 } from \"three\";\nvar ShaderPass = class extends Pass {\n /**\n * Constructs a new shader pass.\n *\n * @param {ShaderMaterial} material - A shader material.\n * @param {String} [input=\"inputBuffer\"] - The name of the input buffer uniform.\n */\n constructor(material, input = \"inputBuffer\") {\n super(\"ShaderPass\");\n this.fullscreenMaterial = material;\n this.input = input;\n }\n /**\n * Sets the name of the input buffer uniform.\n *\n * @param {String} input - The name of the input buffer uniform.\n * @deprecated Use input instead.\n */\n setInput(input) {\n this.input = input;\n }\n /**\n * Renders the effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.\n */\n render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) {\n const uniforms = this.fullscreenMaterial.uniforms;\n if (inputBuffer !== null && uniforms !== void 0 && uniforms[this.input] !== void 0) {\n uniforms[this.input].value = inputBuffer.texture;\n }\n renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n renderer.render(this.scene, this.camera);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - A renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n if (frameBufferType !== void 0 && frameBufferType !== UnsignedByteType10) {\n this.fullscreenMaterial.defines.FRAMEBUFFER_PRECISION_HIGH = \"1\";\n }\n }\n};\n\n// src/passes/TiltShiftBlurPass.js\nvar TiltShiftBlurPass = class extends KawaseBlurPass {\n /**\n * Constructs a new Kawase blur pass.\n *\n * @param {Object} [options] - The options.\n * @param {Number} [options.offset=0.0] - The relative offset of the focus area.\n * @param {Number} [options.rotation=0.0] - The rotation of the focus area in radians.\n * @param {Number} [options.focusArea=0.4] - The relative size of the focus area.\n * @param {Number} [options.feather=0.3] - The softness of the focus area edges.\n * @param {KernelSize} [options.kernelSize=KernelSize.MEDIUM] - The blur kernel size.\n * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n */\n constructor({\n offset = 0,\n rotation = 0,\n focusArea = 0.4,\n feather = 0.3,\n kernelSize = KernelSize.MEDIUM,\n resolutionScale = 0.5,\n resolutionX = Resolution.AUTO_SIZE,\n resolutionY = Resolution.AUTO_SIZE\n } = {}) {\n super({ kernelSize, resolutionScale, resolutionX, resolutionY });\n this.blurMaterial = new TiltShiftBlurMaterial({ kernelSize, offset, rotation, focusArea, feather });\n }\n};\n\n// src/core/Timer.js\nvar MILLISECONDS_TO_SECONDS = 1 / 1e3;\nvar SECONDS_TO_MILLISECONDS = 1e3;\nvar Timer = class {\n /**\n * Constructs a new timer.\n */\n constructor() {\n this.startTime = performance.now();\n this.previousTime = 0;\n this.currentTime = 0;\n this._delta = 0;\n this._elapsed = 0;\n this._fixedDelta = 1e3 / 60;\n this.timescale = 1;\n this.useFixedDelta = false;\n this._autoReset = false;\n }\n /**\n * Enables or disables auto reset based on page visibility.\n *\n * If enabled, the timer will be reset when the page becomes visible. This effectively pauses the timer when the page\n * is hidden. Has no effect if the API is not supported.\n *\n * @type {Boolean}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API\n */\n get autoReset() {\n return this._autoReset;\n }\n set autoReset(value) {\n if (typeof document !== \"undefined\" && document.hidden !== void 0) {\n if (value) {\n document.addEventListener(\"visibilitychange\", this);\n } else {\n document.removeEventListener(\"visibilitychange\", this);\n }\n this._autoReset = value;\n }\n }\n get delta() {\n return this._delta * MILLISECONDS_TO_SECONDS;\n }\n get fixedDelta() {\n return this._fixedDelta * MILLISECONDS_TO_SECONDS;\n }\n set fixedDelta(value) {\n this._fixedDelta = value * SECONDS_TO_MILLISECONDS;\n }\n get elapsed() {\n return this._elapsed * MILLISECONDS_TO_SECONDS;\n }\n /**\n * Updates this timer.\n *\n * @param {Boolean} [timestamp] - The current time in milliseconds.\n */\n update(timestamp) {\n if (this.useFixedDelta) {\n this._delta = this.fixedDelta;\n } else {\n this.previousTime = this.currentTime;\n this.currentTime = (timestamp !== void 0 ? timestamp : performance.now()) - this.startTime;\n this._delta = this.currentTime - this.previousTime;\n }\n this._delta *= this.timescale;\n this._elapsed += this._delta;\n }\n /**\n * Resets this timer.\n */\n reset() {\n this._delta = 0;\n this._elapsed = 0;\n this.currentTime = performance.now() - this.startTime;\n }\n handleEvent(e) {\n if (!document.hidden) {\n this.currentTime = performance.now() - this.startTime;\n }\n }\n dispose() {\n this.autoReset = false;\n }\n};\n\n// src/core/EffectComposer.js\nvar EffectComposer = class {\n /**\n * Constructs a new effect composer.\n *\n * @param {WebGLRenderer} renderer - The renderer that should be used.\n * @param {Object} [options] - The options.\n * @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer.\n * @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer.\n * @param {Boolean} [options.alpha] - Deprecated. Buffers are always RGBA since three r137.\n * @param {Number} [options.multisampling=0] - The number of samples used for multisample antialiasing. Requires WebGL 2.\n * @param {Number} [options.frameBufferType] - The type of the internal frame buffers. It's recommended to use HalfFloatType if possible.\n */\n constructor(renderer = null, {\n depthBuffer = true,\n stencilBuffer = false,\n multisampling = 0,\n frameBufferType\n } = {}) {\n this.renderer = null;\n this.inputBuffer = this.createBuffer(depthBuffer, stencilBuffer, frameBufferType, multisampling);\n this.outputBuffer = this.inputBuffer.clone();\n this.copyPass = new CopyPass();\n this.depthTexture = null;\n this.passes = [];\n this.timer = new Timer();\n this.autoRenderToScreen = true;\n this.setRenderer(renderer);\n }\n /**\n * The current amount of samples used for multisample anti-aliasing.\n *\n * @type {Number}\n */\n get multisampling() {\n return this.inputBuffer.samples || 0;\n }\n /**\n * Sets the amount of MSAA samples.\n *\n * Requires WebGL 2. Set to zero to disable multisampling.\n *\n * @type {Number}\n */\n set multisampling(value) {\n const buffer = this.inputBuffer;\n const multisampling = this.multisampling;\n if (multisampling > 0 && value > 0) {\n this.inputBuffer.samples = value;\n this.outputBuffer.samples = value;\n this.inputBuffer.dispose();\n this.outputBuffer.dispose();\n } else if (multisampling !== value) {\n this.inputBuffer.dispose();\n this.outputBuffer.dispose();\n this.inputBuffer = this.createBuffer(\n buffer.depthBuffer,\n buffer.stencilBuffer,\n buffer.texture.type,\n value\n );\n this.inputBuffer.depthTexture = this.depthTexture;\n this.outputBuffer = this.inputBuffer.clone();\n }\n }\n /**\n * Returns the internal timer.\n *\n * @return {Timer} The timer.\n */\n getTimer() {\n return this.timer;\n }\n /**\n * Returns the renderer.\n *\n * @return {WebGLRenderer} The renderer.\n */\n getRenderer() {\n return this.renderer;\n }\n /**\n * Sets the renderer.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n */\n setRenderer(renderer) {\n this.renderer = renderer;\n if (renderer !== null) {\n const size = renderer.getSize(new Vector216());\n const alpha = renderer.getContext().getContextAttributes().alpha;\n const frameBufferType = this.inputBuffer.texture.type;\n if (frameBufferType === UnsignedByteType11 && getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.inputBuffer.texture, SRGBColorSpace);\n setTextureColorSpace(this.outputBuffer.texture, SRGBColorSpace);\n this.inputBuffer.dispose();\n this.outputBuffer.dispose();\n }\n renderer.autoClear = false;\n this.setSize(size.width, size.height);\n for (const pass of this.passes) {\n pass.initialize(renderer, alpha, frameBufferType);\n }\n }\n }\n /**\n * Replaces the current renderer with the given one.\n *\n * The auto clear mechanism of the provided renderer will be disabled. If the new render size differs from the\n * previous one, all passes will be updated.\n *\n * By default, the DOM element of the current renderer will automatically be removed from its parent node and the DOM\n * element of the new renderer will take its place.\n *\n * @deprecated Use setRenderer instead.\n * @param {WebGLRenderer} renderer - The new renderer.\n * @param {Boolean} updateDOM - Indicates whether the old canvas should be replaced by the new one in the DOM.\n * @return {WebGLRenderer} The old renderer.\n */\n replaceRenderer(renderer, updateDOM = true) {\n const oldRenderer = this.renderer;\n const parent = oldRenderer.domElement.parentNode;\n this.setRenderer(renderer);\n if (updateDOM && parent !== null) {\n parent.removeChild(oldRenderer.domElement);\n parent.appendChild(renderer.domElement);\n }\n return oldRenderer;\n }\n /**\n * Creates a depth texture attachment that will be provided to all passes.\n *\n * Note: When a shader reads from a depth texture and writes to a render target that uses the same depth texture\n * attachment, the depth information will be lost. This happens even if `depthWrite` is disabled.\n *\n * @private\n * @return {DepthTexture} The depth texture.\n */\n createDepthTexture() {\n const depthTexture = this.depthTexture = new DepthTexture();\n this.inputBuffer.depthTexture = depthTexture;\n this.inputBuffer.dispose();\n if (this.inputBuffer.stencilBuffer) {\n depthTexture.format = DepthStencilFormat;\n depthTexture.type = UnsignedInt248Type;\n } else {\n depthTexture.type = UnsignedIntType;\n }\n return depthTexture;\n }\n /**\n * Deletes the current depth texture.\n *\n * @private\n */\n deleteDepthTexture() {\n if (this.depthTexture !== null) {\n this.depthTexture.dispose();\n this.depthTexture = null;\n this.inputBuffer.depthTexture = null;\n this.inputBuffer.dispose();\n for (const pass of this.passes) {\n pass.setDepthTexture(null);\n }\n }\n }\n /**\n * Creates a new render target.\n *\n * @deprecated Create buffers manually via WebGLRenderTarget instead.\n * @param {Boolean} depthBuffer - Whether the render target should have a depth buffer.\n * @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer.\n * @param {Number} type - The frame buffer type.\n * @param {Number} multisampling - The number of samples to use for antialiasing.\n * @return {WebGLRenderTarget} A new render target that equals the renderer's canvas.\n */\n createBuffer(depthBuffer, stencilBuffer, type, multisampling) {\n const renderer = this.renderer;\n const size = renderer === null ? new Vector216() : renderer.getDrawingBufferSize(new Vector216());\n const options = {\n minFilter: LinearFilter2,\n magFilter: LinearFilter2,\n stencilBuffer,\n depthBuffer,\n type\n };\n const renderTarget = new WebGLRenderTarget13(size.width, size.height, options);\n if (multisampling > 0) {\n renderTarget.ignoreDepthForMultisampleCopy = false;\n renderTarget.samples = multisampling;\n }\n if (type === UnsignedByteType11 && getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(renderTarget.texture, SRGBColorSpace);\n }\n renderTarget.texture.name = \"EffectComposer.Buffer\";\n renderTarget.texture.generateMipmaps = false;\n return renderTarget;\n }\n /**\n * Can be used to change the main scene for all registered passes and effects.\n *\n * @param {Scene} scene - The scene.\n */\n setMainScene(scene) {\n for (const pass of this.passes) {\n pass.mainScene = scene;\n }\n }\n /**\n * Can be used to change the main camera for all registered passes and effects.\n *\n * @param {Camera} camera - The camera.\n */\n setMainCamera(camera) {\n for (const pass of this.passes) {\n pass.mainCamera = camera;\n }\n }\n /**\n * Adds a pass, optionally at a specific index.\n *\n * @param {Pass} pass - A new pass.\n * @param {Number} [index] - An index at which the pass should be inserted.\n */\n addPass(pass, index) {\n const passes = this.passes;\n const renderer = this.renderer;\n const drawingBufferSize = renderer.getDrawingBufferSize(new Vector216());\n const alpha = renderer.getContext().getContextAttributes().alpha;\n const frameBufferType = this.inputBuffer.texture.type;\n pass.setRenderer(renderer);\n pass.setSize(drawingBufferSize.width, drawingBufferSize.height);\n pass.initialize(renderer, alpha, frameBufferType);\n if (this.autoRenderToScreen) {\n if (passes.length > 0) {\n passes[passes.length - 1].renderToScreen = false;\n }\n if (pass.renderToScreen) {\n this.autoRenderToScreen = false;\n }\n }\n if (index !== void 0) {\n passes.splice(index, 0, pass);\n } else {\n passes.push(pass);\n }\n if (this.autoRenderToScreen) {\n passes[passes.length - 1].renderToScreen = true;\n }\n if (pass.needsDepthTexture || this.depthTexture !== null) {\n if (this.depthTexture === null) {\n const depthTexture = this.createDepthTexture();\n for (pass of passes) {\n pass.setDepthTexture(depthTexture);\n }\n } else {\n pass.setDepthTexture(this.depthTexture);\n }\n }\n }\n /**\n * Removes a pass.\n *\n * @param {Pass} pass - The pass.\n */\n removePass(pass) {\n const passes = this.passes;\n const index = passes.indexOf(pass);\n const exists = index !== -1;\n const removed = exists && passes.splice(index, 1).length > 0;\n if (removed) {\n if (this.depthTexture !== null) {\n const reducer = (a, b) => a || b.needsDepthTexture;\n const depthTextureRequired = passes.reduce(reducer, false);\n if (!depthTextureRequired) {\n if (pass.getDepthTexture() === this.depthTexture) {\n pass.setDepthTexture(null);\n }\n this.deleteDepthTexture();\n }\n }\n if (this.autoRenderToScreen) {\n if (index === passes.length) {\n pass.renderToScreen = false;\n if (passes.length > 0) {\n passes[passes.length - 1].renderToScreen = true;\n }\n }\n }\n }\n }\n /**\n * Removes all passes.\n */\n removeAllPasses() {\n const passes = this.passes;\n this.deleteDepthTexture();\n if (passes.length > 0) {\n if (this.autoRenderToScreen) {\n passes[passes.length - 1].renderToScreen = false;\n }\n this.passes = [];\n }\n }\n /**\n * Renders all enabled passes in the order in which they were added.\n *\n * @param {Number} [deltaTime] - The time since the last frame in seconds.\n */\n render(deltaTime) {\n const renderer = this.renderer;\n const copyPass = this.copyPass;\n let inputBuffer = this.inputBuffer;\n let outputBuffer = this.outputBuffer;\n let stencilTest = false;\n let context, stencil, buffer;\n if (deltaTime === void 0) {\n this.timer.update();\n deltaTime = this.timer.delta;\n }\n for (const pass of this.passes) {\n if (pass.enabled) {\n pass.render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest);\n if (pass.needsSwap) {\n if (stencilTest) {\n copyPass.renderToScreen = pass.renderToScreen;\n context = renderer.getContext();\n stencil = renderer.state.buffers.stencil;\n stencil.setFunc(context.NOTEQUAL, 1, 4294967295);\n copyPass.render(renderer, inputBuffer, outputBuffer, deltaTime, stencilTest);\n stencil.setFunc(context.EQUAL, 1, 4294967295);\n }\n buffer = inputBuffer;\n inputBuffer = outputBuffer;\n outputBuffer = buffer;\n }\n if (pass instanceof MaskPass) {\n stencilTest = true;\n } else if (pass instanceof ClearMaskPass) {\n stencilTest = false;\n }\n }\n }\n }\n /**\n * Sets the size of the buffers, passes and the renderer.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n * @param {Boolean} [updateStyle] - Determines whether the style of the canvas should be updated.\n */\n setSize(width, height, updateStyle) {\n const renderer = this.renderer;\n const currentSize = renderer.getSize(new Vector216());\n if (width === void 0 || height === void 0) {\n width = currentSize.width;\n height = currentSize.height;\n }\n if (currentSize.width !== width || currentSize.height !== height) {\n renderer.setSize(width, height, updateStyle);\n }\n const drawingBufferSize = renderer.getDrawingBufferSize(new Vector216());\n this.inputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);\n this.outputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);\n for (const pass of this.passes) {\n pass.setSize(drawingBufferSize.width, drawingBufferSize.height);\n }\n }\n /**\n * Resets this composer by deleting all passes and creating new buffers.\n */\n reset() {\n const autoReset = this.timer.autoReset;\n this.dispose();\n this.autoRenderToScreen = true;\n this.timer.autoReset = autoReset;\n }\n /**\n * Disposes this composer and all passes.\n */\n dispose() {\n for (const pass of this.passes) {\n pass.dispose();\n }\n this.passes = [];\n if (this.inputBuffer !== null) {\n this.inputBuffer.dispose();\n }\n if (this.outputBuffer !== null) {\n this.outputBuffer.dispose();\n }\n this.deleteDepthTexture();\n this.copyPass.dispose();\n this.timer.dispose();\n }\n};\n\n// src/core/EffectShaderData.js\nvar EffectShaderData = class {\n /**\n * Constructs new shader data.\n */\n constructor() {\n this.shaderParts = /* @__PURE__ */ new Map([\n [EffectShaderSection.FRAGMENT_HEAD, null],\n [EffectShaderSection.FRAGMENT_MAIN_UV, null],\n [EffectShaderSection.FRAGMENT_MAIN_IMAGE, null],\n [EffectShaderSection.VERTEX_HEAD, null],\n [EffectShaderSection.VERTEX_MAIN_SUPPORT, null]\n ]);\n this.defines = /* @__PURE__ */ new Map();\n this.uniforms = /* @__PURE__ */ new Map();\n this.blendModes = /* @__PURE__ */ new Map();\n this.extensions = /* @__PURE__ */ new Set();\n this.attributes = EffectAttribute.NONE;\n this.varyings = /* @__PURE__ */ new Set();\n this.uvTransformation = false;\n this.readDepth = false;\n this.colorSpace = LinearSRGBColorSpace;\n }\n};\n\n// src/core/GaussKernel.js\nfunction getCoefficients(n) {\n let result;\n if (n === 0) {\n result = new Float64Array(0);\n } else if (n === 1) {\n result = new Float64Array([1]);\n } else if (n > 1) {\n let row0 = new Float64Array(n);\n let row1 = new Float64Array(n);\n for (let y = 1; y <= n; ++y) {\n for (let x = 0; x < y; ++x) {\n row1[x] = x === 0 || x === y - 1 ? 1 : row0[x - 1] + row0[x];\n }\n result = row1;\n row1 = row0;\n row0 = result;\n }\n }\n return result;\n}\nvar GaussKernel = class {\n /**\n * Constructs a new Gauss kernel.\n *\n * @param {Number} kernelSize - The kernel size. Should be an odd number in the range [3, 1020].\n * @param {Number} [edgeBias=2] - Determines how many edge coefficients should be cut off for increased accuracy.\n */\n constructor(kernelSize, edgeBias = 2) {\n this.weights = null;\n this.offsets = null;\n this.linearWeights = null;\n this.linearOffsets = null;\n this.generate(kernelSize, edgeBias);\n }\n /**\n * The number of steps for discrete sampling.\n *\n * @type {Number}\n */\n get steps() {\n return this.offsets === null ? 0 : this.offsets.length;\n }\n /**\n * The number of steps for linear sampling.\n *\n * @type {Number}\n */\n get linearSteps() {\n return this.linearOffsets === null ? 0 : this.linearOffsets.length;\n }\n /**\n * Generates the kernel.\n *\n * @private\n * @param {Number} kernelSize - The kernel size.\n * @param {Number} edgeBias - The amount of edge coefficients to ignore.\n */\n generate(kernelSize, edgeBias) {\n if (kernelSize < 3 || kernelSize > 1020) {\n throw new Error(\"The kernel size must be in the range [3, 1020]\");\n }\n const n = kernelSize + edgeBias * 2;\n const coefficients = edgeBias > 0 ? getCoefficients(n).slice(edgeBias, -edgeBias) : getCoefficients(n);\n const mid = Math.floor((coefficients.length - 1) / 2);\n const sum = coefficients.reduce((a, b) => a + b, 0);\n const weights = coefficients.slice(mid);\n const offsets = [...Array(mid + 1).keys()];\n const linearWeights = new Float64Array(Math.floor(offsets.length / 2));\n const linearOffsets = new Float64Array(linearWeights.length);\n linearWeights[0] = weights[0] / sum;\n for (let i = 1, j = 1, l = offsets.length - 1; i < l; i += 2, ++j) {\n const offset0 = offsets[i], offset1 = offsets[i + 1];\n const weight0 = weights[i], weight1 = weights[i + 1];\n const w = weight0 + weight1;\n const o = (offset0 * weight0 + offset1 * weight1) / w;\n linearWeights[j] = w / sum;\n linearOffsets[j] = o;\n }\n for (let i = 0, l = weights.length, s = 1 / sum; i < l; ++i) {\n weights[i] *= s;\n }\n const linearWeightSum = (linearWeights.reduce((a, b) => a + b, 0) - linearWeights[0] * 0.5) * 2;\n if (linearWeightSum !== 0) {\n for (let i = 0, l = linearWeights.length, s = 1 / linearWeightSum; i < l; ++i) {\n linearWeights[i] *= s;\n }\n }\n this.offsets = offsets;\n this.weights = weights;\n this.linearOffsets = linearOffsets;\n this.linearWeights = linearWeights;\n }\n};\n\n// src/core/ImmutableTimer.js\nvar ImmutableTimer = class {\n /**\n * The current delta time in seconds.\n *\n * @type {Number}\n */\n get delta() {\n return NaN;\n }\n /**\n * The fixed delta time in seconds.\n *\n * @type {Number}\n */\n get fixedDelta() {\n return NaN;\n }\n /**\n * The elapsed time in seconds.\n *\n * @type {Number}\n */\n get elapsed() {\n return NaN;\n }\n};\n\n// src/core/Initializable.js\nvar Initializable = class {\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - A renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n }\n};\n\n// src/core/OverrideMaterialManager.js\nimport { BackSide, DoubleSide, FrontSide, ShaderMaterial as ShaderMaterial22 } from \"three\";\nvar workaroundEnabled = false;\nvar OverrideMaterialManager = class {\n /**\n * Constructs a new override material manager.\n *\n * @param {Material} [material=null] - An override material.\n */\n constructor(material = null) {\n this.originalMaterials = /* @__PURE__ */ new Map();\n this.material = null;\n this.materials = null;\n this.materialsBackSide = null;\n this.materialsDoubleSide = null;\n this.materialsFlatShaded = null;\n this.materialsFlatShadedBackSide = null;\n this.materialsFlatShadedDoubleSide = null;\n this.setMaterial(material);\n this.meshCount = 0;\n this.replaceMaterial = (node) => {\n if (node.isMesh) {\n let materials;\n if (node.material.flatShading) {\n switch (node.material.side) {\n case DoubleSide:\n materials = this.materialsFlatShadedDoubleSide;\n break;\n case BackSide:\n materials = this.materialsFlatShadedBackSide;\n break;\n default:\n materials = this.materialsFlatShaded;\n break;\n }\n } else {\n switch (node.material.side) {\n case DoubleSide:\n materials = this.materialsDoubleSide;\n break;\n case BackSide:\n materials = this.materialsBackSide;\n break;\n default:\n materials = this.materials;\n break;\n }\n }\n this.originalMaterials.set(node, node.material);\n if (node.isSkinnedMesh) {\n node.material = materials[2];\n } else if (node.isInstancedMesh) {\n node.material = materials[1];\n } else {\n node.material = materials[0];\n }\n ++this.meshCount;\n }\n };\n }\n /**\n * Clones the given material.\n *\n * @private\n * @param {Material} material - The material.\n * @return {Material} The cloned material.\n */\n cloneMaterial(material) {\n if (!(material instanceof ShaderMaterial22)) {\n return material.clone();\n }\n const uniforms = material.uniforms;\n const textureUniforms = /* @__PURE__ */ new Map();\n for (const key in uniforms) {\n const value = uniforms[key].value;\n if (value.isRenderTargetTexture) {\n uniforms[key].value = null;\n textureUniforms.set(key, value);\n }\n }\n const clone = material.clone();\n for (const entry of textureUniforms) {\n uniforms[entry[0]].value = entry[1];\n clone.uniforms[entry[0]].value = entry[1];\n }\n return clone;\n }\n /**\n * Sets the override material.\n *\n * @param {Material} material - The material.\n */\n setMaterial(material) {\n this.disposeMaterials();\n this.material = material;\n if (material !== null) {\n const materials = this.materials = [\n this.cloneMaterial(material),\n this.cloneMaterial(material),\n this.cloneMaterial(material)\n ];\n for (const m2 of materials) {\n m2.uniforms = Object.assign({}, material.uniforms);\n m2.side = FrontSide;\n }\n materials[2].skinning = true;\n this.materialsBackSide = materials.map((m2) => {\n const c2 = this.cloneMaterial(m2);\n c2.uniforms = Object.assign({}, material.uniforms);\n c2.side = BackSide;\n return c2;\n });\n this.materialsDoubleSide = materials.map((m2) => {\n const c2 = this.cloneMaterial(m2);\n c2.uniforms = Object.assign({}, material.uniforms);\n c2.side = DoubleSide;\n return c2;\n });\n this.materialsFlatShaded = materials.map((m2) => {\n const c2 = this.cloneMaterial(m2);\n c2.uniforms = Object.assign({}, material.uniforms);\n c2.flatShading = true;\n return c2;\n });\n this.materialsFlatShadedBackSide = materials.map((m2) => {\n const c2 = this.cloneMaterial(m2);\n c2.uniforms = Object.assign({}, material.uniforms);\n c2.flatShading = true;\n c2.side = BackSide;\n return c2;\n });\n this.materialsFlatShadedDoubleSide = materials.map((m2) => {\n const c2 = this.cloneMaterial(m2);\n c2.uniforms = Object.assign({}, material.uniforms);\n c2.flatShading = true;\n c2.side = DoubleSide;\n return c2;\n });\n }\n }\n /**\n * Renders the scene with the override material.\n *\n * @private\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Scene} scene - A scene.\n * @param {Camera} camera - A camera.\n */\n render(renderer, scene, camera) {\n const shadowMapEnabled = renderer.shadowMap.enabled;\n renderer.shadowMap.enabled = false;\n if (workaroundEnabled) {\n const originalMaterials = this.originalMaterials;\n this.meshCount = 0;\n scene.traverse(this.replaceMaterial);\n renderer.render(scene, camera);\n for (const entry of originalMaterials) {\n entry[0].material = entry[1];\n }\n if (this.meshCount !== originalMaterials.size) {\n originalMaterials.clear();\n }\n } else {\n const overrideMaterial = scene.overrideMaterial;\n scene.overrideMaterial = this.material;\n renderer.render(scene, camera);\n scene.overrideMaterial = overrideMaterial;\n }\n renderer.shadowMap.enabled = shadowMapEnabled;\n }\n /**\n * Deletes cloned override materials.\n *\n * @private\n */\n disposeMaterials() {\n if (this.material !== null) {\n const materials = this.materials.concat(this.materialsBackSide).concat(this.materialsDoubleSide).concat(this.materialsFlatShaded).concat(this.materialsFlatShadedBackSide).concat(this.materialsFlatShadedDoubleSide);\n for (const m2 of materials) {\n m2.dispose();\n }\n }\n }\n /**\n * Performs cleanup tasks.\n */\n dispose() {\n this.originalMaterials.clear();\n this.disposeMaterials();\n }\n /**\n * Indicates whether the override material workaround is enabled.\n *\n * @type {Boolean}\n */\n static get workaroundEnabled() {\n return workaroundEnabled;\n }\n /**\n * Enables or disables the override material workaround globally.\n *\n * This only affects post processing passes and effects.\n *\n * @type {Boolean}\n */\n static set workaroundEnabled(value) {\n workaroundEnabled = value;\n }\n};\n\n// src/core/Resizable.js\nvar Resizable = class {\n /**\n * Sets the size of this object.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n }\n};\n\n// src/core/Resolution.js\nimport { EventDispatcher, Vector2 as Vector217 } from \"three\";\nvar AUTO_SIZE = -1;\nvar Resolution = class extends EventDispatcher {\n /**\n * Constructs a new resolution.\n *\n * TODO Remove resizable param.\n * @param {Resizable} resizable - A resizable object.\n * @param {Number} [width=Resolution.AUTO_SIZE] - The preferred width.\n * @param {Number} [height=Resolution.AUTO_SIZE] - The preferred height.\n * @param {Number} [scale=1.0] - A resolution scale.\n */\n constructor(resizable, width = AUTO_SIZE, height = AUTO_SIZE, scale = 1) {\n super();\n this.resizable = resizable;\n this.baseSize = new Vector217(1, 1);\n this.preferredSize = new Vector217(width, height);\n this.target = this.preferredSize;\n this.s = scale;\n this.effectiveSize = new Vector217();\n this.addEventListener(\"change\", () => this.updateEffectiveSize());\n this.updateEffectiveSize();\n }\n /**\n * Calculates the effective size.\n *\n * @private\n */\n updateEffectiveSize() {\n const base = this.baseSize;\n const preferred = this.preferredSize;\n const effective = this.effectiveSize;\n const scale = this.scale;\n if (preferred.width !== AUTO_SIZE) {\n effective.width = preferred.width;\n } else if (preferred.height !== AUTO_SIZE) {\n effective.width = Math.round(preferred.height * (base.width / Math.max(base.height, 1)));\n } else {\n effective.width = Math.round(base.width * scale);\n }\n if (preferred.height !== AUTO_SIZE) {\n effective.height = preferred.height;\n } else if (preferred.width !== AUTO_SIZE) {\n effective.height = Math.round(preferred.width / Math.max(base.width / Math.max(base.height, 1), 1));\n } else {\n effective.height = Math.round(base.height * scale);\n }\n }\n /**\n * The effective width.\n *\n * If the preferred width and height are set to {@link Resizer.AUTO_SIZE}, the base width will be returned.\n *\n * @type {Number}\n */\n get width() {\n return this.effectiveSize.width;\n }\n set width(value) {\n this.preferredWidth = value;\n }\n /**\n * The effective height.\n *\n * If the preferred width and height are set to {@link Resizer.AUTO_SIZE}, the base height will be returned.\n *\n * @type {Number}\n */\n get height() {\n return this.effectiveSize.height;\n }\n set height(value) {\n this.preferredHeight = value;\n }\n /**\n * Returns the effective width.\n *\n * If the preferred width and height are set to {@link Resizer.AUTO_SIZE}, the base width will be returned.\n *\n * @deprecated Use width instead.\n * @return {Number} The effective width.\n */\n getWidth() {\n return this.width;\n }\n /**\n * Returns the effective height.\n *\n * If the preferred width and height are set to {@link Resizer.AUTO_SIZE}, the base height will be returned.\n *\n * @deprecated Use height instead.\n * @return {Number} The effective height.\n */\n getHeight() {\n return this.height;\n }\n /**\n * The resolution scale.\n *\n * @type {Number}\n */\n get scale() {\n return this.s;\n }\n set scale(value) {\n if (this.s !== value) {\n this.s = value;\n this.preferredSize.setScalar(AUTO_SIZE);\n this.dispatchEvent({ type: \"change\" });\n this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n }\n }\n /**\n * Returns the current resolution scale.\n *\n * @deprecated Use scale instead.\n * @return {Number} The scale.\n */\n getScale() {\n return this.scale;\n }\n /**\n * Sets the resolution scale.\n *\n * Also sets the preferred resolution to {@link Resizer.AUTO_SIZE}.\n *\n * @deprecated Use scale instead.\n * @param {Number} value - The scale.\n */\n setScale(value) {\n this.scale = value;\n }\n /**\n * The base width.\n *\n * @type {Number}\n */\n get baseWidth() {\n return this.baseSize.width;\n }\n set baseWidth(value) {\n if (this.baseSize.width !== value) {\n this.baseSize.width = value;\n this.dispatchEvent({ type: \"change\" });\n this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n }\n }\n /**\n * Returns the base width.\n *\n * @deprecated Use baseWidth instead.\n * @return {Number} The base width.\n */\n getBaseWidth() {\n return this.baseWidth;\n }\n /**\n * Sets the base width.\n *\n * @deprecated Use baseWidth instead.\n * @param {Number} value - The width.\n */\n setBaseWidth(value) {\n this.baseWidth = value;\n }\n /**\n * The base height.\n *\n * @type {Number}\n */\n get baseHeight() {\n return this.baseSize.height;\n }\n set baseHeight(value) {\n if (this.baseSize.height !== value) {\n this.baseSize.height = value;\n this.dispatchEvent({ type: \"change\" });\n this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n }\n }\n /**\n * Returns the base height.\n *\n * @deprecated Use baseHeight instead.\n * @return {Number} The base height.\n */\n getBaseHeight() {\n return this.baseHeight;\n }\n /**\n * Sets the base height.\n *\n * @deprecated Use baseHeight instead.\n * @param {Number} value - The height.\n */\n setBaseHeight(value) {\n this.baseHeight = value;\n }\n /**\n * Sets the base size.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setBaseSize(width, height) {\n if (this.baseSize.width !== width || this.baseSize.height !== height) {\n this.baseSize.set(width, height);\n this.dispatchEvent({ type: \"change\" });\n this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n }\n }\n /**\n * The preferred width.\n *\n * @type {Number}\n */\n get preferredWidth() {\n return this.preferredSize.width;\n }\n set preferredWidth(value) {\n if (this.preferredSize.width !== value) {\n this.preferredSize.width = value;\n this.dispatchEvent({ type: \"change\" });\n this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n }\n }\n /**\n * Returns the preferred width.\n *\n * @deprecated Use preferredWidth instead.\n * @return {Number} The preferred width.\n */\n getPreferredWidth() {\n return this.preferredWidth;\n }\n /**\n * Sets the preferred width.\n *\n * Use {@link Resizer.AUTO_SIZE} to automatically calculate the width based on the height and aspect ratio.\n *\n * @deprecated Use preferredWidth instead.\n * @param {Number} value - The width.\n */\n setPreferredWidth(value) {\n this.preferredWidth = value;\n }\n /**\n * The preferred height.\n *\n * @type {Number}\n */\n get preferredHeight() {\n return this.preferredSize.height;\n }\n set preferredHeight(value) {\n if (this.preferredSize.height !== value) {\n this.preferredSize.height = value;\n this.dispatchEvent({ type: \"change\" });\n this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n }\n }\n /**\n * Returns the preferred height.\n *\n * @deprecated Use preferredHeight instead.\n * @return {Number} The preferred height.\n */\n getPreferredHeight() {\n return this.preferredHeight;\n }\n /**\n * Sets the preferred height.\n *\n * Use {@link Resizer.AUTO_SIZE} to automatically calculate the height based on the width and aspect ratio.\n *\n * @deprecated Use preferredHeight instead.\n * @param {Number} value - The height.\n */\n setPreferredHeight(value) {\n this.preferredHeight = value;\n }\n /**\n * Sets the preferred size.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setPreferredSize(width, height) {\n if (this.preferredSize.width !== width || this.preferredSize.height !== height) {\n this.preferredSize.set(width, height);\n this.dispatchEvent({ type: \"change\" });\n this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n }\n }\n /**\n * Copies the given resolution.\n *\n * @param {Resolution} resolution - The resolution.\n */\n copy(resolution) {\n this.s = resolution.scale;\n this.baseSize.set(resolution.baseWidth, resolution.baseHeight);\n this.preferredSize.set(resolution.preferredWidth, resolution.preferredHeight);\n this.dispatchEvent({ type: \"change\" });\n this.resizable.setSize(this.baseSize.width, this.baseSize.height);\n }\n /**\n * An auto sizing constant.\n *\n * Can be used to automatically calculate the width or height based on the original aspect ratio.\n *\n * @type {Number}\n */\n static get AUTO_SIZE() {\n return AUTO_SIZE;\n }\n};\n\n// src/core/Selection.js\nvar Selection = class extends Set {\n /**\n * Constructs a new selection.\n *\n * @param {Iterable<Object3D>} [iterable] - A collection of objects that should be added to this selection.\n * @param {Number} [layer=10] - A dedicated render layer for selected objects.\n */\n constructor(iterable, layer = 10) {\n super();\n this.l = layer;\n this.exclusive = false;\n if (iterable !== void 0) {\n this.set(iterable);\n }\n }\n /**\n * The render layer for selected objects.\n *\n * @type {Number}\n */\n get layer() {\n return this.l;\n }\n set layer(value) {\n const currentLayer = this.l;\n for (const object of this) {\n object.layers.disable(currentLayer);\n object.layers.enable(value);\n }\n this.l = value;\n }\n /**\n * Returns the current render layer for selected objects.\n *\n * The default layer is 10. If this collides with your own custom layers, please change it before rendering!\n *\n * @deprecated Use layer instead.\n * @return {Number} The layer.\n */\n getLayer() {\n return this.layer;\n }\n /**\n * Sets the render layer for selected objects.\n *\n * The current selection will be updated accordingly.\n *\n * @deprecated Use layer instead.\n * @param {Number} value - The layer. Range is [0, 31].\n */\n setLayer(value) {\n this.layer = value;\n }\n /**\n * Indicates whether objects that are added to this selection will be removed from all other layers.\n *\n * @deprecated Use exclusive instead.\n * @return {Number} Whether this selection is exclusive. Default is false.\n */\n isExclusive() {\n return this.exclusive;\n }\n /**\n * Controls whether objects that are added to this selection should be removed from all other layers.\n *\n * @deprecated Use exclusive instead.\n * @param {Number} value - Whether this selection should be exclusive.\n */\n setExclusive(value) {\n this.exclusive = value;\n }\n /**\n * Clears this selection.\n *\n * @return {Selection} This selection.\n */\n clear() {\n const layer = this.layer;\n for (const object of this) {\n object.layers.disable(layer);\n }\n return super.clear();\n }\n /**\n * Clears this selection and adds the given objects.\n *\n * @param {Iterable<Object3D>} objects - The objects that should be selected.\n * @return {Selection} This selection.\n */\n set(objects) {\n this.clear();\n for (const object of objects) {\n this.add(object);\n }\n return this;\n }\n /**\n * An alias for {@link has}.\n *\n * @param {Object3D} object - An object.\n * @return {Number} Returns 0 if the given object is currently selected, or -1 otherwise.\n * @deprecated Added for backward-compatibility.\n */\n indexOf(object) {\n return this.has(object) ? 0 : -1;\n }\n /**\n * Adds an object to this selection.\n *\n * If {@link exclusive} is set to `true`, the object will also be removed from all other layers.\n *\n * @param {Object3D} object - The object that should be selected.\n * @return {Selection} This selection.\n */\n add(object) {\n if (this.exclusive) {\n object.layers.set(this.layer);\n } else {\n object.layers.enable(this.layer);\n }\n return super.add(object);\n }\n /**\n * Removes an object from this selection.\n *\n * @param {Object3D} object - The object that should be deselected.\n * @return {Boolean} Returns true if an object has successfully been removed from this selection; otherwise false.\n */\n delete(object) {\n if (this.has(object)) {\n object.layers.disable(this.layer);\n }\n return super.delete(object);\n }\n /**\n * Removes an existing object from the selection. If the object doesn't exist it's added instead.\n *\n * @param {Object3D} object - The object.\n * @return {Boolean} Returns true if the object is added, false otherwise.\n */\n toggle(object) {\n let result;\n if (this.has(object)) {\n this.delete(object);\n result = false;\n } else {\n this.add(object);\n result = true;\n }\n return result;\n }\n /**\n * Sets the visibility of all selected objects.\n *\n * This method enables or disables render layer 0 of all selected objects.\n *\n * @param {Boolean} visible - Whether the selected objects should be visible.\n * @return {Selection} This selection.\n */\n setVisible(visible) {\n for (const object of this) {\n if (visible) {\n object.layers.enable(0);\n } else {\n object.layers.disable(0);\n }\n }\n return this;\n }\n};\n\n// src/effects/blending/BlendMode.js\nimport { EventDispatcher as EventDispatcher2, Uniform as Uniform23 } from \"three\";\n\n// src/effects/blending/glsl/add.frag\nvar add_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,x+y,opacity);}\";\n\n// src/effects/blending/glsl/alpha.frag\nvar alpha_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,y,min(y.a,opacity));}\";\n\n// src/effects/blending/glsl/average.frag\nvar average_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,(x+y)*0.5,opacity);}\";\n\n// src/effects/blending/glsl/color.frag\nvar color_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec3 xHSL=RGBToHSL(x.rgb);vec3 yHSL=RGBToHSL(y.rgb);vec3 z=HSLToRGB(vec3(yHSL.rg,xHSL.b));return vec4(mix(x.rgb,z,opacity),y.a);}\";\n\n// src/effects/blending/glsl/color-burn.frag\nvar color_burn_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=mix(step(0.0,y)*(1.0-min(vec4(1.0),(1.0-x)/y)),vec4(1.0),step(1.0,x));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/color-dodge.frag\nvar color_dodge_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=step(0.0,x)*mix(min(vec4(1.0),x/max(1.0-y,1e-9)),vec4(1.0),step(1.0,y));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/darken.frag\nvar darken_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,min(x,y),opacity);}\";\n\n// src/effects/blending/glsl/difference.frag\nvar difference_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,abs(x-y),opacity);}\";\n\n// src/effects/blending/glsl/divide.frag\nvar divide_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,x/max(y,1e-12),opacity);}\";\n\n// src/effects/blending/glsl/exclusion.frag\nvar exclusion_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,(x+y-2.0*x*y),opacity);}\";\n\n// src/effects/blending/glsl/hard-light.frag\nvar hard_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 a=min(x,1.0),b=min(y,1.0);vec4 z=mix(2.0*a*b,1.0-2.0*(1.0-a)*(1.0-b),step(0.5,y));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/hard-mix.frag\nvar hard_mix_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,step(1.0,x+y),opacity);}\";\n\n// src/effects/blending/glsl/hue.frag\nvar hue_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec3 xHSL=RGBToHSL(x.rgb);vec3 yHSL=RGBToHSL(y.rgb);vec3 z=HSLToRGB(vec3(yHSL.r,xHSL.gb));return vec4(mix(x.rgb,z,opacity),y.a);}\";\n\n// src/effects/blending/glsl/invert.frag\nvar invert_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,1.0-y,opacity);}\";\n\n// src/effects/blending/glsl/invert-rgb.frag\nvar invert_rgb_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,y*(1.0-x),opacity);}\";\n\n// src/effects/blending/glsl/lighten.frag\nvar lighten_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,max(x,y),opacity);}\";\n\n// src/effects/blending/glsl/linear-burn.frag\nvar linear_burn_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,clamp(y+x-1.0,0.0,1.0),opacity);}\";\n\n// src/effects/blending/glsl/linear-dodge.frag\nvar linear_dodge_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,min(x+y,1.0),opacity);}\";\n\n// src/effects/blending/glsl/linear-light.frag\nvar linear_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,clamp(2.0*y+x-1.0,0.0,1.0),opacity);}\";\n\n// src/effects/blending/glsl/luminosity.frag\nvar luminosity_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec3 xHSL=RGBToHSL(x.rgb);vec3 yHSL=RGBToHSL(y.rgb);vec3 z=HSLToRGB(vec3(xHSL.rg,yHSL.b));return vec4(mix(x.rgb,z,opacity),y.a);}\";\n\n// src/effects/blending/glsl/multiply.frag\nvar multiply_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,x*y,opacity);}\";\n\n// src/effects/blending/glsl/negation.frag\nvar negation_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,1.0-abs(1.0-x-y),opacity);}\";\n\n// src/effects/blending/glsl/normal.frag\nvar normal_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,y,opacity);}\";\n\n// src/effects/blending/glsl/overlay.frag\nvar overlay_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=mix(2.0*y*x,1.0-2.0*(1.0-y)*(1.0-x),step(0.5,x));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/pin-light.frag\nvar pin_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 y2=2.0*y;vec4 z=mix(mix(y2,x,step(0.5*x,y)),max(vec4(0.0),y2-1.0),step(x,(y2-1.0)));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/reflect.frag\nvar reflect_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=mix(min(x*x/max(1.0-y,1e-12),1.0),y,step(1.0,y));return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/saturation.frag\nvar saturation_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec3 xHSL=RGBToHSL(x.rgb);vec3 yHSL=RGBToHSL(y.rgb);vec3 z=HSLToRGB(vec3(xHSL.r,yHSL.g,xHSL.b));return vec4(mix(x.rgb,z,opacity),y.a);}\";\n\n// src/effects/blending/glsl/screen.frag\nvar screen_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,x+y-min(x*y,1.0),opacity);}\";\n\n// src/effects/blending/glsl/soft-light.frag\nvar soft_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 y2=2.0*y;vec4 w=step(0.5,y);vec4 z=mix(x-(1.0-y2)*x*(1.0-x),mix(x+(y2-1.0)*(sqrt(x)-x),x+(y2-1.0)*x*((16.0*x-12.0)*x+3.0),w*(1.0-step(0.25,x))),w);return mix(x,z,opacity);}\";\n\n// src/effects/blending/glsl/src.frag\nvar src_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return y;}\";\n\n// src/effects/blending/glsl/subtract.frag\nvar subtract_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){return mix(x,max(x+y-1.0,0.0),opacity);}\";\n\n// src/effects/blending/glsl/vivid-light.frag\nvar vivid_light_default = \"vec4 blend(const in vec4 x,const in vec4 y,const in float opacity){vec4 z=mix(max(1.0-min((1.0-x)/(2.0*y),1.0),0.0),min(x/(2.0*(1.0-y)),1.0),step(0.5,y));return mix(x,z,opacity);}\";\n\n// src/effects/blending/BlendMode.js\nvar blendFunctions = /* @__PURE__ */ new Map([\n [BlendFunction.ADD, add_default],\n [BlendFunction.ALPHA, alpha_default],\n [BlendFunction.AVERAGE, average_default],\n [BlendFunction.COLOR, color_default],\n [BlendFunction.COLOR_BURN, color_burn_default],\n [BlendFunction.COLOR_DODGE, color_dodge_default],\n [BlendFunction.DARKEN, darken_default],\n [BlendFunction.DIFFERENCE, difference_default],\n [BlendFunction.DIVIDE, divide_default],\n [BlendFunction.DST, null],\n [BlendFunction.EXCLUSION, exclusion_default],\n [BlendFunction.HARD_LIGHT, hard_light_default],\n [BlendFunction.HARD_MIX, hard_mix_default],\n [BlendFunction.HUE, hue_default],\n [BlendFunction.INVERT, invert_default],\n [BlendFunction.INVERT_RGB, invert_rgb_default],\n [BlendFunction.LIGHTEN, lighten_default],\n [BlendFunction.LINEAR_BURN, linear_burn_default],\n [BlendFunction.LINEAR_DODGE, linear_dodge_default],\n [BlendFunction.LINEAR_LIGHT, linear_light_default],\n [BlendFunction.LUMINOSITY, luminosity_default],\n [BlendFunction.MULTIPLY, multiply_default],\n [BlendFunction.NEGATION, negation_default],\n [BlendFunction.NORMAL, normal_default],\n [BlendFunction.OVERLAY, overlay_default],\n [BlendFunction.PIN_LIGHT, pin_light_default],\n [BlendFunction.REFLECT, reflect_default],\n [BlendFunction.SATURATION, saturation_default],\n [BlendFunction.SCREEN, screen_default],\n [BlendFunction.SOFT_LIGHT, soft_light_default],\n [BlendFunction.SRC, src_default],\n [BlendFunction.SUBTRACT, subtract_default],\n [BlendFunction.VIVID_LIGHT, vivid_light_default]\n]);\nvar BlendMode = class extends EventDispatcher2 {\n /**\n * Constructs a new blend mode.\n *\n * @param {BlendFunction} blendFunction - The blend function.\n * @param {Number} opacity - The opacity of the color that will be blended with the base color.\n */\n constructor(blendFunction, opacity = 1) {\n super();\n this._blendFunction = blendFunction;\n this.opacity = new Uniform23(opacity);\n }\n /**\n * Returns the opacity.\n *\n * @return {Number} The opacity.\n */\n getOpacity() {\n return this.opacity.value;\n }\n /**\n * Sets the opacity.\n *\n * @param {Number} value - The opacity.\n */\n setOpacity(value) {\n this.opacity.value = value;\n }\n /**\n * The blend function.\n *\n * @type {BlendFunction}\n */\n get blendFunction() {\n return this._blendFunction;\n }\n set blendFunction(value) {\n this._blendFunction = value;\n this.dispatchEvent({ type: \"change\" });\n }\n /**\n * Returns the blend function.\n *\n * @deprecated Use blendFunction instead.\n * @return {BlendFunction} The blend function.\n */\n getBlendFunction() {\n return this.blendFunction;\n }\n /**\n * Sets the blend function.\n *\n * @deprecated Use blendFunction instead.\n * @param {BlendFunction} value - The blend function.\n */\n setBlendFunction(value) {\n this.blendFunction = value;\n }\n /**\n * Returns the blend function shader code.\n *\n * @return {String} The blend function shader code.\n */\n getShaderCode() {\n return blendFunctions.get(this.blendFunction);\n }\n};\n\n// src/effects/BloomEffect.js\nimport { Uniform as Uniform24, WebGLRenderTarget as WebGLRenderTarget15 } from \"three\";\n\n// src/effects/Effect.js\nimport { BasicDepthPacking as BasicDepthPacking13, EventDispatcher as EventDispatcher3, Material as Material2, Texture as Texture2, WebGLRenderTarget as WebGLRenderTarget14 } from \"three\";\nvar Effect = class extends EventDispatcher3 {\n /**\n * Constructs a new effect.\n *\n * @param {String} name - The name of this effect. Doesn't have to be unique.\n * @param {String} fragmentShader - The fragment shader. This shader is required.\n * @param {Object} [options] - Additional options.\n * @param {EffectAttribute} [options.attributes=EffectAttribute.NONE] - The effect attributes that determine the execution priority and resource requirements.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.NORMAL] - The blend function of this effect.\n * @param {Map<String, String>} [options.defines] - Custom preprocessor macro definitions. Keys are names and values are code.\n * @param {Map<String, Uniform>} [options.uniforms] - Custom shader uniforms. Keys are names and values are uniforms.\n * @param {Set<WebGLExtension>} [options.extensions] - WebGL extensions.\n * @param {String} [options.vertexShader=null] - The vertex shader. Most effects don't need one.\n */\n constructor(name, fragmentShader, {\n attributes = EffectAttribute.NONE,\n blendFunction = BlendFunction.NORMAL,\n defines = /* @__PURE__ */ new Map(),\n uniforms = /* @__PURE__ */ new Map(),\n extensions = null,\n vertexShader = null\n } = {}) {\n super();\n this.name = name;\n this.renderer = null;\n this.attributes = attributes;\n this.fragmentShader = fragmentShader;\n this.vertexShader = vertexShader;\n this.defines = defines;\n this.uniforms = uniforms;\n this.extensions = extensions;\n this.blendMode = new BlendMode(blendFunction);\n this.blendMode.addEventListener(\"change\", (event) => this.setChanged());\n this._inputColorSpace = LinearSRGBColorSpace;\n this._outputColorSpace = NoColorSpace;\n }\n /**\n * The input color space.\n *\n * @type {ColorSpace}\n * @experimental\n */\n get inputColorSpace() {\n return this._inputColorSpace;\n }\n /**\n * @type {ColorSpace}\n * @protected\n * @experimental\n */\n set inputColorSpace(value) {\n this._inputColorSpace = value;\n this.setChanged();\n }\n /**\n * The output color space.\n *\n * Should only be changed if this effect converts the input colors to a different color space.\n *\n * @type {ColorSpace}\n * @experimental\n */\n get outputColorSpace() {\n return this._outputColorSpace;\n }\n /**\n * @type {ColorSpace}\n * @protected\n * @experimental\n */\n set outputColorSpace(value) {\n this._outputColorSpace = value;\n this.setChanged();\n }\n /**\n * Sets the main scene.\n *\n * @type {Scene}\n */\n set mainScene(value) {\n }\n /**\n * Sets the main camera.\n *\n * @type {Camera}\n */\n set mainCamera(value) {\n }\n /**\n * Returns the name of this effect.\n *\n * @deprecated Use name instead.\n * @return {String} The name.\n */\n getName() {\n return this.name;\n }\n /**\n * Sets the renderer.\n *\n * @deprecated\n * @param {WebGLRenderer} renderer - The renderer.\n */\n setRenderer(renderer) {\n this.renderer = renderer;\n }\n /**\n * Returns the preprocessor macro definitions.\n *\n * @deprecated Use defines instead.\n * @return {Map<String, String>} The extensions.\n */\n getDefines() {\n return this.defines;\n }\n /**\n * Returns the uniforms of this effect.\n *\n * @deprecated Use uniforms instead.\n * @return {Map<String, Uniform>} The extensions.\n */\n getUniforms() {\n return this.uniforms;\n }\n /**\n * Returns the WebGL extensions that are required by this effect.\n *\n * @deprecated Use extensions instead.\n * @return {Set<WebGLExtension>} The extensions.\n */\n getExtensions() {\n return this.extensions;\n }\n /**\n * Returns the blend mode.\n *\n * The result of this effect will be blended with the result of the previous effect using this blend mode.\n *\n * @deprecated Use blendMode instead.\n * @return {BlendMode} The blend mode.\n */\n getBlendMode() {\n return this.blendMode;\n }\n /**\n * Returns the effect attributes.\n *\n * @return {EffectAttribute} The attributes.\n */\n getAttributes() {\n return this.attributes;\n }\n /**\n * Sets the effect attributes.\n *\n * Effects that have the same attributes will be executed in the order in which they were registered. Some attributes\n * imply a higher priority.\n *\n * @protected\n * @param {EffectAttribute} attributes - The attributes.\n */\n setAttributes(attributes) {\n this.attributes = attributes;\n this.setChanged();\n }\n /**\n * Returns the fragment shader.\n *\n * @return {String} The fragment shader.\n */\n getFragmentShader() {\n return this.fragmentShader;\n }\n /**\n * Sets the fragment shader.\n *\n * @protected\n * @param {String} fragmentShader - The fragment shader.\n */\n setFragmentShader(fragmentShader) {\n this.fragmentShader = fragmentShader;\n this.setChanged();\n }\n /**\n * Returns the vertex shader.\n *\n * @return {String} The vertex shader.\n */\n getVertexShader() {\n return this.vertexShader;\n }\n /**\n * Sets the vertex shader.\n *\n * @protected\n * @param {String} vertexShader - The vertex shader.\n */\n setVertexShader(vertexShader) {\n this.vertexShader = vertexShader;\n this.setChanged();\n }\n /**\n * Informs the associated {@link EffectPass} that this effect requires a shader recompilation.\n *\n * Should be called after changing macros or extensions and after adding/removing uniforms.\n *\n * @protected\n */\n setChanged() {\n this.dispatchEvent({ type: \"change\" });\n }\n /**\n * Sets the depth texture.\n *\n * You may override this method if your effect requires direct access to the depth texture that is bound to the\n * associated {@link EffectPass}.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking13) {\n }\n /**\n * Updates this effect by performing supporting operations.\n *\n * This method is called by the {@link EffectPass} right before the main fullscreen render operation, even if the\n * blend function is set to `SKIP`.\n *\n * You may override this method if you need to update custom uniforms or render additional off-screen textures.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n }\n /**\n * Updates the size of this effect.\n *\n * You may override this method if you want to be informed about the size of the backbuffer/canvas.\n * This method is called before {@link initialize} and every time the size of the {@link EffectComposer} changes.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n }\n /**\n * Performs initialization tasks.\n *\n * This method is called when the associated {@link EffectPass} is added to an {@link EffectComposer}.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n * @example if(!alpha && frameBufferType === UnsignedByteType) { this.myRenderTarget.texture.format = RGBFormat; }\n */\n initialize(renderer, alpha, frameBufferType) {\n }\n /**\n * Performs a shallow search for properties that define a dispose method and deletes them.\n *\n * The {@link EffectComposer} calls this method when it is being destroyed.\n */\n dispose() {\n for (const key of Object.keys(this)) {\n const property = this[key];\n const isDisposable = property instanceof WebGLRenderTarget14 || property instanceof Material2 || property instanceof Texture2 || property instanceof Pass;\n if (isDisposable) {\n this[key].dispose();\n }\n }\n }\n};\n\n// src/effects/glsl/bloom.frag\nvar bloom_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D map;\\n#else\\nuniform lowp sampler2D map;\\n#endif\\nuniform float intensity;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=texture2D(map,uv)*intensity;}\";\n\n// src/effects/BloomEffect.js\nvar BloomEffect = class extends Effect {\n /**\n * Constructs a new bloom effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SCREEN] - The blend function of this effect.\n * @param {Number} [options.luminanceThreshold=0.9] - The luminance threshold. Raise this value to mask out darker elements in the scene.\n * @param {Number} [options.luminanceSmoothing=0.025] - Controls the smoothness of the luminance threshold.\n * @param {Boolean} [options.mipmapBlur=false] - Enables or disables mipmap blur.\n * @param {Number} [options.intensity=1.0] - The bloom intensity.\n * @param {Number} [options.radius=0.85] - The blur radius. Only applies to mipmap blur.\n * @param {Number} [options.levels=8] - The amount of MIP levels. Only applies to mipmap blur.\n * @param {KernelSize} [options.kernelSize=KernelSize.LARGE] - Deprecated. Use mipmapBlur instead.\n * @param {Number} [options.resolutionScale=0.5] - Deprecated. Use mipmapBlur instead.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - Deprecated. Use mipmapBlur instead.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - Deprecated. Use mipmapBlur instead.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use mipmapBlur instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use mipmapBlur instead.\n */\n constructor({\n blendFunction = BlendFunction.SCREEN,\n luminanceThreshold = 0.9,\n luminanceSmoothing = 0.025,\n mipmapBlur = false,\n intensity = 1,\n radius = 0.85,\n levels = 8,\n kernelSize = KernelSize.LARGE,\n resolutionScale = 0.5,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"BloomEffect\", bloom_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"map\", new Uniform24(null)],\n [\"intensity\", new Uniform24(intensity)]\n ])\n });\n this.renderTarget = new WebGLRenderTarget15(1, 1, { depthBuffer: false });\n this.renderTarget.texture.name = \"Bloom.Target\";\n this.blurPass = new KawaseBlurPass({ kernelSize });\n this.luminancePass = new LuminancePass({ colorOutput: true });\n this.luminanceMaterial.threshold = luminanceThreshold;\n this.luminanceMaterial.smoothing = luminanceSmoothing;\n this.mipmapBlurPass = new MipmapBlurPass();\n this.mipmapBlurPass.enabled = mipmapBlur;\n this.mipmapBlurPass.radius = radius;\n this.mipmapBlurPass.levels = levels;\n this.uniforms.get(\"map\").value = mipmapBlur ? this.mipmapBlurPass.texture : this.renderTarget.texture;\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n }\n /**\n * A texture that contains the intermediate result of this effect.\n *\n * @type {Texture}\n */\n get texture() {\n return this.mipmapBlurPass.enabled ? this.mipmapBlurPass.texture : this.renderTarget.texture;\n }\n /**\n * Returns the generated bloom texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.texture;\n }\n /**\n * Returns the resolution settings.\n *\n * @deprecated Use resolution instead.\n * @return {Resolution} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * Returns the blur pass.\n *\n * @deprecated\n * @return {KawaseBlurPass} The blur pass.\n */\n getBlurPass() {\n return this.blurPass;\n }\n /**\n * Returns the luminance pass.\n *\n * @deprecated Use luminancePass instead.\n * @return {LuminancePass} The luminance pass.\n */\n getLuminancePass() {\n return this.luminancePass;\n }\n /**\n * The luminance material.\n *\n * @type {LuminanceMaterial}\n */\n get luminanceMaterial() {\n return this.luminancePass.fullscreenMaterial;\n }\n /**\n * Returns the luminance material.\n *\n * @deprecated Use luminanceMaterial instead.\n * @return {LuminanceMaterial} The material.\n */\n getLuminanceMaterial() {\n return this.luminancePass.fullscreenMaterial;\n }\n /**\n * The current width of the internal render targets.\n *\n * @type {Number}\n * @deprecated\n */\n get width() {\n return this.resolution.width;\n }\n set width(value) {\n this.resolution.preferredWidth = value;\n }\n /**\n * The current height of the internal render targets.\n *\n * @type {Number}\n * @deprecated\n */\n get height() {\n return this.resolution.height;\n }\n set height(value) {\n this.resolution.preferredHeight = value;\n }\n /**\n * Indicates whether dithering is enabled.\n *\n * @type {Boolean}\n * @deprecated Use EffectPass.dithering instead.\n */\n get dithering() {\n return this.blurPass.dithering;\n }\n set dithering(value) {\n this.blurPass.dithering = value;\n }\n /**\n * The blur kernel size.\n *\n * @type {KernelSize}\n * @deprecated\n */\n get kernelSize() {\n return this.blurPass.kernelSize;\n }\n set kernelSize(value) {\n this.blurPass.kernelSize = value;\n }\n /**\n * @type {Number}\n * @deprecated\n */\n get distinction() {\n console.warn(this.name, \"distinction was removed\");\n return 1;\n }\n set distinction(value) {\n console.warn(this.name, \"distinction was removed\");\n }\n /**\n * The bloom intensity.\n *\n * @type {Number}\n */\n get intensity() {\n return this.uniforms.get(\"intensity\").value;\n }\n set intensity(value) {\n this.uniforms.get(\"intensity\").value = value;\n }\n /**\n * The bloom intensity.\n *\n * @deprecated Use intensity instead.\n * @return {Number} The intensity.\n */\n getIntensity() {\n return this.intensity;\n }\n /**\n * Sets the bloom intensity.\n *\n * @deprecated Use intensity instead.\n * @param {Number} value - The intensity.\n */\n setIntensity(value) {\n this.intensity = value;\n }\n /**\n * Returns the current resolution scale.\n *\n * @return {Number} The resolution scale.\n * @deprecated\n */\n getResolutionScale() {\n return this.resolution.scale;\n }\n /**\n * Sets the resolution scale.\n *\n * @param {Number} scale - The new resolution scale.\n * @deprecated\n */\n setResolutionScale(scale) {\n this.resolution.scale = scale;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n const renderTarget = this.renderTarget;\n const luminancePass = this.luminancePass;\n if (luminancePass.enabled) {\n luminancePass.render(renderer, inputBuffer);\n if (this.mipmapBlurPass.enabled) {\n this.mipmapBlurPass.render(renderer, luminancePass.renderTarget);\n } else {\n this.blurPass.render(renderer, luminancePass.renderTarget, renderTarget);\n }\n } else {\n if (this.mipmapBlurPass.enabled) {\n this.mipmapBlurPass.render(renderer, inputBuffer);\n } else {\n this.blurPass.render(renderer, inputBuffer, renderTarget);\n }\n }\n }\n /**\n * Updates the size of internal render targets.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n this.renderTarget.setSize(resolution.width, resolution.height);\n this.blurPass.resolution.copy(resolution);\n this.luminancePass.setSize(width, height);\n this.mipmapBlurPass.setSize(width, height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n this.blurPass.initialize(renderer, alpha, frameBufferType);\n this.luminancePass.initialize(renderer, alpha, frameBufferType);\n this.mipmapBlurPass.initialize(renderer, alpha, frameBufferType);\n if (frameBufferType !== void 0) {\n this.renderTarget.texture.type = frameBufferType;\n if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTarget.texture, SRGBColorSpace);\n }\n }\n }\n};\n\n// src/effects/BokehEffect.js\nimport { Uniform as Uniform25 } from \"three\";\n\n// src/effects/glsl/bokeh.frag\nvar bokeh_default = \"uniform float focus;uniform float dof;uniform float aperture;uniform float maxBlur;void mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){vec2 aspectCorrection=vec2(1.0,aspect);\\n#ifdef PERSPECTIVE_CAMERA\\nfloat viewZ=perspectiveDepthToViewZ(depth,cameraNear,cameraFar);float linearDepth=viewZToOrthographicDepth(viewZ,cameraNear,cameraFar);\\n#else\\nfloat linearDepth=depth;\\n#endif\\nfloat focusNear=clamp(focus-dof,0.0,1.0);float focusFar=clamp(focus+dof,0.0,1.0);float low=step(linearDepth,focusNear);float high=step(focusFar,linearDepth);float factor=(linearDepth-focusNear)*low+(linearDepth-focusFar)*high;vec2 dofBlur=vec2(clamp(factor*aperture,-maxBlur,maxBlur));vec2 dofblur9=dofBlur*0.9;vec2 dofblur7=dofBlur*0.7;vec2 dofblur4=dofBlur*0.4;vec4 color=inputColor;color+=texture2D(inputBuffer,uv+(vec2(0.0,0.4)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.15,0.37)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.29,0.29)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.37,0.15)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.40,0.0)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.37,-0.15)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.29,-0.29)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.15,-0.37)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.0,-0.4)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.15,0.37)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.29,0.29)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.37,0.15)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.4,0.0)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.37,-0.15)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(-0.29,-0.29)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.15,-0.37)*aspectCorrection)*dofBlur);color+=texture2D(inputBuffer,uv+(vec2(0.15,0.37)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(-0.37,0.15)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(0.37,-0.15)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(-0.15,-0.37)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(-0.15,0.37)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(0.37,0.15)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(-0.37,-0.15)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(0.15,-0.37)*aspectCorrection)*dofblur9);color+=texture2D(inputBuffer,uv+(vec2(0.29,0.29)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.40,0.0)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.29,-0.29)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.0,-0.4)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(-0.29,0.29)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(-0.4,0.0)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(-0.29,-0.29)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.0,0.4)*aspectCorrection)*dofblur7);color+=texture2D(inputBuffer,uv+(vec2(0.29,0.29)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(0.4,0.0)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(0.29,-0.29)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(0.0,-0.4)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(-0.29,0.29)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(-0.4,0.0)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(-0.29,-0.29)*aspectCorrection)*dofblur4);color+=texture2D(inputBuffer,uv+(vec2(0.0,0.4)*aspectCorrection)*dofblur4);outputColor=color/41.0;}\";\n\n// src/effects/BokehEffect.js\nvar BokehEffect = class extends Effect {\n /**\n * Constructs a new bokeh effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {Number} [options.focus=0.5] - The focus distance ratio, ranging from 0.0 to 1.0.\n * @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focal point that still appears sharp.\n * @param {Number} [options.aperture=0.015] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field.\n * @param {Number} [options.maxBlur=1.0] - The maximum blur strength.\n */\n constructor({\n blendFunction,\n focus = 0.5,\n dof = 0.02,\n aperture = 0.015,\n maxBlur = 1\n } = {}) {\n super(\"BokehEffect\", bokeh_default, {\n blendFunction,\n attributes: EffectAttribute.CONVOLUTION | EffectAttribute.DEPTH,\n uniforms: /* @__PURE__ */ new Map([\n [\"focus\", new Uniform25(focus)],\n [\"dof\", new Uniform25(dof)],\n [\"aperture\", new Uniform25(aperture)],\n [\"maxBlur\", new Uniform25(maxBlur)]\n ])\n });\n }\n};\n\n// src/effects/BrightnessContrastEffect.js\nimport { Uniform as Uniform26 } from \"three\";\n\n// src/effects/glsl/brightness-contrast.frag\nvar brightness_contrast_default = \"uniform float brightness;uniform float contrast;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 color=inputColor.rgb+vec3(brightness-0.5);if(contrast>0.0){color/=vec3(1.0-contrast);}else{color*=vec3(1.0+contrast);}outputColor=vec4(color+vec3(0.5),inputColor.a);}\";\n\n// src/effects/BrightnessContrastEffect.js\nvar BrightnessContrastEffect = class extends Effect {\n /**\n * Constructs a new brightness/contrast effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n * @param {Number} [options.brightness=0.0] - The brightness factor, ranging from -1 to 1, where 0 means no change.\n * @param {Number} [options.contrast=0.0] - The contrast factor, ranging from -1 to 1, where 0 means no change.\n */\n constructor({ blendFunction = BlendFunction.SRC, brightness = 0, contrast = 0 } = {}) {\n super(\"BrightnessContrastEffect\", brightness_contrast_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"brightness\", new Uniform26(brightness)],\n [\"contrast\", new Uniform26(contrast)]\n ])\n });\n this.inputColorSpace = SRGBColorSpace;\n }\n /**\n * The brightness.\n *\n * @type {Number}\n */\n get brightness() {\n return this.uniforms.get(\"brightness\").value;\n }\n set brightness(value) {\n this.uniforms.get(\"brightness\").value = value;\n }\n /**\n * Returns the brightness.\n *\n * @deprecated Use brightness instead.\n * @return {Number} The brightness.\n */\n getBrightness() {\n return this.brightness;\n }\n /**\n * Sets the brightness.\n *\n * @deprecated Use brightness instead.\n * @param {Number} value - The brightness.\n */\n setBrightness(value) {\n this.brightness = value;\n }\n /**\n * The contrast.\n *\n * @type {Number}\n */\n get contrast() {\n return this.uniforms.get(\"contrast\").value;\n }\n set contrast(value) {\n this.uniforms.get(\"contrast\").value = value;\n }\n /**\n * Returns the contrast.\n *\n * @deprecated Use contrast instead.\n * @return {Number} The contrast.\n */\n getContrast() {\n return this.contrast;\n }\n /**\n * Sets the contrast.\n *\n * @deprecated Use contrast instead.\n * @param {Number} value - The contrast.\n */\n setContrast(value) {\n this.contrast = value;\n }\n};\n\n// src/effects/glsl/color-average.frag\nvar color_average_default = \"void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=vec4(vec3(average(inputColor.rgb)),inputColor.a);}\";\n\n// src/effects/ColorAverageEffect.js\nvar ColorAverageEffect = class extends Effect {\n /**\n * Constructs a new color average effect.\n *\n * @param {BlendFunction} [blendFunction] - The blend function of this effect.\n */\n constructor(blendFunction) {\n super(\"ColorAverageEffect\", color_average_default, { blendFunction });\n }\n};\n\n// src/effects/ColorDepthEffect.js\nimport { Uniform as Uniform27 } from \"three\";\n\n// src/effects/glsl/color-depth.frag\nvar color_depth_default = \"uniform float factor;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=vec4(floor(inputColor.rgb*factor+0.5)/factor,inputColor.a);}\";\n\n// src/effects/ColorDepthEffect.js\nvar ColorDepthEffect = class extends Effect {\n /**\n * Constructs a new color depth effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {Number} [options.bits=16] - The color bit depth.\n */\n constructor({ blendFunction, bits = 16 } = {}) {\n super(\"ColorDepthEffect\", color_depth_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"factor\", new Uniform27(1)]\n ])\n });\n this.bits = 0;\n this.bitDepth = bits;\n }\n /**\n * The virtual amount of color bits.\n *\n * Each color channel effectively uses a fourth of the total amount of bits. Alpha remains unaffected.\n *\n * @type {Number}\n */\n get bitDepth() {\n return this.bits;\n }\n set bitDepth(value) {\n this.bits = value;\n this.uniforms.get(\"factor\").value = Math.pow(2, value / 3);\n }\n /**\n * Returns the current color bit depth.\n *\n * @return {Number} The bit depth.\n */\n getBitDepth() {\n return this.bitDepth;\n }\n /**\n * Sets the virtual amount of color bits.\n *\n * @param {Number} value - The bit depth.\n */\n setBitDepth(value) {\n this.bitDepth = value;\n }\n};\n\n// src/effects/ChromaticAberrationEffect.js\nimport { Uniform as Uniform28, Vector2 as Vector218 } from \"three\";\n\n// src/effects/glsl/chromatic-aberration.frag\nvar chromatic_aberration_default = \"#ifdef RADIAL_MODULATION\\nuniform float modulationOffset;\\n#endif\\nvarying float vActive;varying vec2 vUvR;varying vec2 vUvB;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec2 ra=inputColor.ra;vec2 ba=inputColor.ba;\\n#ifdef RADIAL_MODULATION\\nconst vec2 center=vec2(0.5);float d=distance(uv,center)*2.0;d=max(d-modulationOffset,0.0);if(vActive>0.0&&d>0.0){ra=texture2D(inputBuffer,mix(uv,vUvR,d)).ra;ba=texture2D(inputBuffer,mix(uv,vUvB,d)).ba;}\\n#else\\nif(vActive>0.0){ra=texture2D(inputBuffer,vUvR).ra;ba=texture2D(inputBuffer,vUvB).ba;}\\n#endif\\noutputColor=vec4(ra.x,inputColor.g,ba.x,max(max(ra.y,ba.y),inputColor.a));}\";\n\n// src/effects/glsl/chromatic-aberration.vert\nvar chromatic_aberration_default2 = \"uniform vec2 offset;varying float vActive;varying vec2 vUvR;varying vec2 vUvB;void mainSupport(const in vec2 uv){vec2 shift=offset*vec2(1.0,aspect);vActive=(shift.x!=0.0||shift.y!=0.0)?1.0:0.0;vUvR=uv+shift;vUvB=uv-shift;}\";\n\n// src/effects/ChromaticAberrationEffect.js\nvar ChromaticAberrationEffect = class extends Effect {\n /**\n * Constructs a new chromatic aberration effect.\n *\n * @param {Object} [options] - The options.\n * @param {Vector2} [options.offset] - The color offset.\n * @param {Boolean} [options.radialModulation=false] - Whether the effect should be modulated with a radial gradient.\n * @param {Number} [options.modulationOffset=0.15] - The modulation offset. Only applies if `radialModulation` is enabled.\n */\n constructor({\n offset = new Vector218(1e-3, 5e-4),\n radialModulation = false,\n modulationOffset = 0.15\n } = {}) {\n super(\"ChromaticAberrationEffect\", chromatic_aberration_default, {\n vertexShader: chromatic_aberration_default2,\n attributes: EffectAttribute.CONVOLUTION,\n uniforms: /* @__PURE__ */ new Map([\n [\"offset\", new Uniform28(offset)],\n [\"modulationOffset\", new Uniform28(modulationOffset)]\n ])\n });\n this.radialModulation = radialModulation;\n }\n /**\n * The color offset.\n *\n * @type {Vector2}\n */\n get offset() {\n return this.uniforms.get(\"offset\").value;\n }\n set offset(value) {\n this.uniforms.get(\"offset\").value = value;\n }\n /**\n * Indicates whether radial modulation is enabled.\n *\n * When enabled, the effect will be weaker in the middle and stronger towards the screen edges.\n *\n * @type {Boolean}\n */\n get radialModulation() {\n return this.defines.has(\"RADIAL_MODULATION\");\n }\n set radialModulation(value) {\n if (value) {\n this.defines.set(\"RADIAL_MODULATION\", \"1\");\n } else {\n this.defines.delete(\"RADIAL_MODULATION\");\n }\n this.setChanged();\n }\n /**\n * The modulation offset.\n *\n * @type {Number}\n */\n get modulationOffset() {\n return this.uniforms.get(\"modulationOffset\").value;\n }\n set modulationOffset(value) {\n this.uniforms.get(\"modulationOffset\").value = value;\n }\n /**\n * Returns the color offset vector.\n *\n * @deprecated Use offset instead.\n * @return {Vector2} The offset.\n */\n getOffset() {\n return this.offset;\n }\n /**\n * Sets the color offset vector.\n *\n * @deprecated Use offset instead.\n * @param {Vector2} value - The offset.\n */\n setOffset(value) {\n this.offset = value;\n }\n};\n\n// src/effects/glsl/depth.frag\nvar depth_default = \"void mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){\\n#ifdef INVERTED\\nvec3 color=vec3(1.0-depth);\\n#else\\nvec3 color=vec3(depth);\\n#endif\\noutputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/DepthEffect.js\nvar DepthEffect = class extends Effect {\n /**\n * Constructs a new depth effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n * @param {Boolean} [options.inverted=false] - Whether the depth should be inverted.\n */\n constructor({ blendFunction = BlendFunction.SRC, inverted = false } = {}) {\n super(\"DepthEffect\", depth_default, {\n blendFunction,\n attributes: EffectAttribute.DEPTH\n });\n this.inverted = inverted;\n }\n /**\n * Indicates whether depth should be inverted.\n *\n * @type {Boolean}\n */\n get inverted() {\n return this.defines.has(\"INVERTED\");\n }\n set inverted(value) {\n if (this.inverted !== value) {\n if (value) {\n this.defines.set(\"INVERTED\", \"1\");\n } else {\n this.defines.delete(\"INVERTED\");\n }\n this.setChanged();\n }\n }\n /**\n * Indicates whether the rendered depth is inverted.\n *\n * @deprecated Use inverted instead.\n * @return {Boolean} Whether the rendered depth is inverted.\n */\n isInverted() {\n return this.inverted;\n }\n /**\n * Enables or disables depth inversion.\n *\n * @deprecated Use inverted instead.\n * @param {Boolean} value - Whether depth should be inverted.\n */\n setInverted(value) {\n this.inverted = value;\n }\n};\n\n// src/effects/DepthOfFieldEffect.js\nimport { BasicDepthPacking as BasicDepthPacking14, Uniform as Uniform29, UnsignedByteType as UnsignedByteType12, WebGLRenderTarget as WebGLRenderTarget16 } from \"three\";\n\n// src/effects/glsl/depth-of-field.frag\nvar depth_of_field_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D nearColorBuffer;uniform mediump sampler2D farColorBuffer;\\n#else\\nuniform lowp sampler2D nearColorBuffer;uniform lowp sampler2D farColorBuffer;\\n#endif\\nuniform lowp sampler2D nearCoCBuffer;uniform float scale;void mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){vec4 colorNear=texture2D(nearColorBuffer,uv);vec4 colorFar=texture2D(farColorBuffer,uv);float cocNear=texture2D(nearCoCBuffer,uv).r;cocNear=min(cocNear*scale,1.0);vec4 result=inputColor*(1.0-colorFar.a)+colorFar;result=mix(result,colorNear,cocNear);outputColor=result;}\";\n\n// src/effects/DepthOfFieldEffect.js\nvar DepthOfFieldEffect = class extends Effect {\n /**\n * Constructs a new depth of field effect.\n *\n * @param {Camera} camera - The main camera.\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {Number} [options.worldFocusDistance] - The focus distance in world units.\n * @param {Number} [options.worldFocusRange] - The focus distance in world units.\n * @param {Number} [options.focusDistance=0.0] - The normalized focus distance. Range is [0.0, 1.0].\n * @param {Number} [options.focusRange=0.1] - The focus range. Range is [0.0, 1.0].\n * @param {Number} [options.focalLength=0.1] - Deprecated.\n * @param {Number} [options.bokehScale=1.0] - The scale of the bokeh blur.\n * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n */\n constructor(camera, {\n blendFunction,\n worldFocusDistance,\n worldFocusRange,\n focusDistance = 0,\n focalLength = 0.1,\n focusRange = focalLength,\n bokehScale = 1,\n resolutionScale = 1,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"DepthOfFieldEffect\", depth_of_field_default, {\n blendFunction,\n attributes: EffectAttribute.DEPTH,\n uniforms: /* @__PURE__ */ new Map([\n [\"nearColorBuffer\", new Uniform29(null)],\n [\"farColorBuffer\", new Uniform29(null)],\n [\"nearCoCBuffer\", new Uniform29(null)],\n [\"scale\", new Uniform29(1)]\n ])\n });\n this.camera = camera;\n this.renderTarget = new WebGLRenderTarget16(1, 1, { depthBuffer: false });\n this.renderTarget.texture.name = \"DoF.Intermediate\";\n this.renderTargetMasked = this.renderTarget.clone();\n this.renderTargetMasked.texture.name = \"DoF.Masked.Far\";\n this.renderTargetNear = this.renderTarget.clone();\n this.renderTargetNear.texture.name = \"DoF.Bokeh.Near\";\n this.uniforms.get(\"nearColorBuffer\").value = this.renderTargetNear.texture;\n this.renderTargetFar = this.renderTarget.clone();\n this.renderTargetFar.texture.name = \"DoF.Bokeh.Far\";\n this.uniforms.get(\"farColorBuffer\").value = this.renderTargetFar.texture;\n this.renderTargetCoC = this.renderTarget.clone();\n this.renderTargetCoC.texture.name = \"DoF.CoC\";\n this.renderTargetCoCBlurred = this.renderTargetCoC.clone();\n this.renderTargetCoCBlurred.texture.name = \"DoF.CoC.Blurred\";\n this.uniforms.get(\"nearCoCBuffer\").value = this.renderTargetCoCBlurred.texture;\n this.cocPass = new ShaderPass(new CircleOfConfusionMaterial(camera));\n const cocMaterial = this.cocMaterial;\n cocMaterial.focusDistance = focusDistance;\n cocMaterial.focusRange = focusRange;\n if (worldFocusDistance !== void 0) {\n cocMaterial.worldFocusDistance = worldFocusDistance;\n }\n if (worldFocusRange !== void 0) {\n cocMaterial.worldFocusRange = worldFocusRange;\n }\n this.blurPass = new KawaseBlurPass({ resolutionScale, resolutionX, resolutionY, kernelSize: KernelSize.MEDIUM });\n this.maskPass = new ShaderPass(new MaskMaterial(this.renderTargetCoC.texture));\n const maskMaterial = this.maskPass.fullscreenMaterial;\n maskMaterial.maskFunction = MaskFunction.MULTIPLY_RGB_SET_ALPHA;\n maskMaterial.colorChannel = ColorChannel.GREEN;\n this.bokehNearBasePass = new ShaderPass(new BokehMaterial(false, true));\n this.bokehNearBasePass.fullscreenMaterial.cocBuffer = this.renderTargetCoCBlurred.texture;\n this.bokehNearFillPass = new ShaderPass(new BokehMaterial(true, true));\n this.bokehNearFillPass.fullscreenMaterial.cocBuffer = this.renderTargetCoCBlurred.texture;\n this.bokehFarBasePass = new ShaderPass(new BokehMaterial(false, false));\n this.bokehFarBasePass.fullscreenMaterial.cocBuffer = this.renderTargetCoC.texture;\n this.bokehFarFillPass = new ShaderPass(new BokehMaterial(true, false));\n this.bokehFarFillPass.fullscreenMaterial.cocBuffer = this.renderTargetCoC.texture;\n this.target = null;\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n this.bokehScale = bokehScale;\n }\n set mainCamera(value) {\n this.camera = value;\n this.cocMaterial.copyCameraSettings(value);\n }\n /**\n * The circle of confusion texture.\n *\n * @type {Texture}\n */\n get cocTexture() {\n return this.renderTargetCoC.texture;\n }\n /**\n * The circle of confusion material.\n *\n * @type {CircleOfConfusionMaterial}\n */\n get cocMaterial() {\n return this.cocPass.fullscreenMaterial;\n }\n /**\n * The circle of confusion material.\n *\n * @deprecated Use cocMaterial instead.\n * @type {CircleOfConfusionMaterial}\n */\n get circleOfConfusionMaterial() {\n return this.cocMaterial;\n }\n /**\n * Returns the circle of confusion material.\n *\n * @deprecated Use cocMaterial instead.\n * @return {CircleOfConfusionMaterial} The material.\n */\n getCircleOfConfusionMaterial() {\n return this.circleOfConfusionMaterial;\n }\n /**\n * Returns the pass that blurs the foreground CoC buffer to soften edges.\n *\n * @deprecated Use blurPass instead.\n * @return {KawaseBlurPass} The blur pass.\n */\n getBlurPass() {\n return this.blurPass;\n }\n /**\n * Returns the resolution settings.\n *\n * @deprecated Use resolution instead.\n * @return {Resolution} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * The current bokeh scale.\n *\n * @type {Number}\n */\n get bokehScale() {\n return this.uniforms.get(\"scale\").value;\n }\n set bokehScale(value) {\n this.bokehNearBasePass.fullscreenMaterial.scale = value;\n this.bokehNearFillPass.fullscreenMaterial.scale = value;\n this.bokehFarBasePass.fullscreenMaterial.scale = value;\n this.bokehFarFillPass.fullscreenMaterial.scale = value;\n this.maskPass.fullscreenMaterial.strength = value;\n this.uniforms.get(\"scale\").value = value;\n }\n /**\n * Returns the current bokeh scale.\n *\n * @deprecated Use bokehScale instead.\n * @return {Number} The scale.\n */\n getBokehScale() {\n return this.bokehScale;\n }\n /**\n * Sets the bokeh scale.\n *\n * @deprecated Use bokehScale instead.\n * @param {Number} value - The scale.\n */\n setBokehScale(value) {\n this.bokehScale = value;\n }\n /**\n * Returns the current auto focus target.\n *\n * @deprecated Use target instead.\n * @return {Vector3} The target.\n */\n getTarget() {\n return this.target;\n }\n /**\n * Sets the auto focus target.\n *\n * @deprecated Use target instead.\n * @param {Vector3} value - The target.\n */\n setTarget(value) {\n this.target = value;\n }\n /**\n * Calculates the focus distance from the camera to the given position.\n *\n * @param {Vector3} target - The target.\n * @return {Number} The normalized focus distance.\n */\n calculateFocusDistance(target) {\n const camera = this.camera;\n const distance = camera.position.distanceTo(target);\n return viewZToOrthographicDepth(-distance, camera.near, camera.far);\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking14) {\n this.circleOfConfusionMaterial.depthBuffer = depthTexture;\n this.circleOfConfusionMaterial.depthPacking = depthPacking;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n const renderTarget = this.renderTarget;\n const renderTargetCoC = this.renderTargetCoC;\n const renderTargetCoCBlurred = this.renderTargetCoCBlurred;\n const renderTargetMasked = this.renderTargetMasked;\n if (this.target !== null) {\n const distance = this.calculateFocusDistance(this.target);\n this.cocMaterial.focusDistance = distance;\n }\n this.cocPass.render(renderer, null, renderTargetCoC);\n this.blurPass.render(renderer, renderTargetCoC, renderTargetCoCBlurred);\n this.maskPass.render(renderer, inputBuffer, renderTargetMasked);\n this.bokehFarBasePass.render(renderer, renderTargetMasked, renderTarget);\n this.bokehFarFillPass.render(renderer, renderTarget, this.renderTargetFar);\n this.bokehNearBasePass.render(renderer, inputBuffer, renderTarget);\n this.bokehNearFillPass.render(renderer, renderTarget, this.renderTargetNear);\n }\n /**\n * Updates the size of internal render targets.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n const w = resolution.width, h = resolution.height;\n this.cocPass.setSize(width, height);\n this.blurPass.setSize(width, height);\n this.maskPass.setSize(width, height);\n this.renderTargetCoC.setSize(width, height);\n this.renderTargetMasked.setSize(width, height);\n this.renderTarget.setSize(w, h);\n this.renderTargetNear.setSize(w, h);\n this.renderTargetFar.setSize(w, h);\n this.renderTargetCoCBlurred.setSize(w, h);\n this.bokehNearBasePass.fullscreenMaterial.setSize(width, height);\n this.bokehNearFillPass.fullscreenMaterial.setSize(width, height);\n this.bokehFarBasePass.fullscreenMaterial.setSize(width, height);\n this.bokehFarFillPass.fullscreenMaterial.setSize(width, height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n this.cocPass.initialize(renderer, alpha, frameBufferType);\n this.maskPass.initialize(renderer, alpha, frameBufferType);\n this.bokehNearBasePass.initialize(renderer, alpha, frameBufferType);\n this.bokehNearFillPass.initialize(renderer, alpha, frameBufferType);\n this.bokehFarBasePass.initialize(renderer, alpha, frameBufferType);\n this.bokehFarFillPass.initialize(renderer, alpha, frameBufferType);\n this.blurPass.initialize(renderer, alpha, UnsignedByteType12);\n if (renderer.capabilities.logarithmicDepthBuffer) {\n this.cocPass.fullscreenMaterial.defines.LOG_DEPTH = \"1\";\n }\n if (frameBufferType !== void 0) {\n this.renderTarget.texture.type = frameBufferType;\n this.renderTargetNear.texture.type = frameBufferType;\n this.renderTargetFar.texture.type = frameBufferType;\n this.renderTargetMasked.texture.type = frameBufferType;\n if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTarget.texture, SRGBColorSpace);\n setTextureColorSpace(this.renderTargetNear.texture, SRGBColorSpace);\n setTextureColorSpace(this.renderTargetFar.texture, SRGBColorSpace);\n setTextureColorSpace(this.renderTargetMasked.texture, SRGBColorSpace);\n }\n }\n }\n};\n\n// src/effects/DotScreenEffect.js\nimport { Uniform as Uniform30, Vector2 as Vector219 } from \"three\";\n\n// src/effects/glsl/dot-screen.frag\nvar dot_screen_default = \"uniform vec2 angle;uniform float scale;float pattern(const in vec2 uv){vec2 point=scale*vec2(dot(angle.yx,vec2(uv.x,-uv.y)),dot(angle,uv));return(sin(point.x)*sin(point.y))*4.0;}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 color=vec3(inputColor.rgb*10.0-5.0+pattern(uv*resolution));outputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/DotScreenEffect.js\nvar DotScreenEffect = class extends Effect {\n /**\n * Constructs a new dot screen effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {Number} [options.angle=1.57] - The angle of the dot pattern.\n * @param {Number} [options.scale=1.0] - The scale of the dot pattern.\n */\n constructor({ blendFunction, angle = Math.PI * 0.5, scale = 1 } = {}) {\n super(\"DotScreenEffect\", dot_screen_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"angle\", new Uniform30(new Vector219())],\n [\"scale\", new Uniform30(scale)]\n ])\n });\n this.angle = angle;\n }\n /**\n * The angle.\n *\n * @type {Number}\n */\n get angle() {\n return Math.acos(this.uniforms.get(\"angle\").value.y);\n }\n set angle(value) {\n this.uniforms.get(\"angle\").value.set(Math.sin(value), Math.cos(value));\n }\n /**\n * Returns the pattern angle.\n *\n * @deprecated Use angle instead.\n * @return {Number} The angle in radians.\n */\n getAngle() {\n return this.angle;\n }\n /**\n * Sets the pattern angle.\n *\n * @deprecated Use angle instead.\n * @param {Number} value - The angle in radians.\n */\n setAngle(value) {\n this.angle = value;\n }\n /**\n * The scale.\n *\n * @type {Number}\n */\n get scale() {\n return this.uniforms.get(\"scale\").value;\n }\n set scale(value) {\n this.uniforms.get(\"scale\").value = value;\n }\n};\n\n// src/effects/glsl/fxaa.frag\nvar fxaa_default = \"#if THREE_REVISION < 143\\n#define luminance(v) linearToRelativeLuminance(v)\\n#endif\\n#define QUALITY(q) ((q) < 5 ? 1.0 : ((q) > 5 ? ((q) < 10 ? 2.0 : ((q) < 11 ? 4.0 : 8.0)) : 1.5))\\n#define ONE_OVER_TWELVE 0.08333333333333333\\nvarying vec2 vUvDown;varying vec2 vUvUp;varying vec2 vUvLeft;varying vec2 vUvRight;varying vec2 vUvDownLeft;varying vec2 vUvUpRight;varying vec2 vUvUpLeft;varying vec2 vUvDownRight;vec4 fxaa(const in vec4 inputColor,const in vec2 uv){float lumaCenter=luminance(inputColor.rgb);float lumaDown=luminance(texture2D(inputBuffer,vUvDown).rgb);float lumaUp=luminance(texture2D(inputBuffer,vUvUp).rgb);float lumaLeft=luminance(texture2D(inputBuffer,vUvLeft).rgb);float lumaRight=luminance(texture2D(inputBuffer,vUvRight).rgb);float lumaMin=min(lumaCenter,min(min(lumaDown,lumaUp),min(lumaLeft,lumaRight)));float lumaMax=max(lumaCenter,max(max(lumaDown,lumaUp),max(lumaLeft,lumaRight)));float lumaRange=lumaMax-lumaMin;if(lumaRange<max(EDGE_THRESHOLD_MIN,lumaMax*EDGE_THRESHOLD_MAX)){return inputColor;}float lumaDownLeft=luminance(texture2D(inputBuffer,vUvDownLeft).rgb);float lumaUpRight=luminance(texture2D(inputBuffer,vUvUpRight).rgb);float lumaUpLeft=luminance(texture2D(inputBuffer,vUvUpLeft).rgb);float lumaDownRight=luminance(texture2D(inputBuffer,vUvDownRight).rgb);float lumaDownUp=lumaDown+lumaUp;float lumaLeftRight=lumaLeft+lumaRight;float lumaLeftCorners=lumaDownLeft+lumaUpLeft;float lumaDownCorners=lumaDownLeft+lumaDownRight;float lumaRightCorners=lumaDownRight+lumaUpRight;float lumaUpCorners=lumaUpRight+lumaUpLeft;float edgeHorizontal=(abs(-2.0*lumaLeft+lumaLeftCorners)+abs(-2.0*lumaCenter+lumaDownUp)*2.0+abs(-2.0*lumaRight+lumaRightCorners));float edgeVertical=(abs(-2.0*lumaUp+lumaUpCorners)+abs(-2.0*lumaCenter+lumaLeftRight)*2.0+abs(-2.0*lumaDown+lumaDownCorners));bool isHorizontal=(edgeHorizontal>=edgeVertical);float stepLength=isHorizontal?texelSize.y:texelSize.x;float luma1=isHorizontal?lumaDown:lumaLeft;float luma2=isHorizontal?lumaUp:lumaRight;float gradient1=abs(luma1-lumaCenter);float gradient2=abs(luma2-lumaCenter);bool is1Steepest=gradient1>=gradient2;float gradientScaled=0.25*max(gradient1,gradient2);float lumaLocalAverage=0.0;if(is1Steepest){stepLength=-stepLength;lumaLocalAverage=0.5*(luma1+lumaCenter);}else{lumaLocalAverage=0.5*(luma2+lumaCenter);}vec2 currentUv=uv;if(isHorizontal){currentUv.y+=stepLength*0.5;}else{currentUv.x+=stepLength*0.5;}vec2 offset=isHorizontal?vec2(texelSize.x,0.0):vec2(0.0,texelSize.y);vec2 uv1=currentUv-offset*QUALITY(0);vec2 uv2=currentUv+offset*QUALITY(0);float lumaEnd1=luminance(texture2D(inputBuffer,uv1).rgb);float lumaEnd2=luminance(texture2D(inputBuffer,uv2).rgb);lumaEnd1-=lumaLocalAverage;lumaEnd2-=lumaLocalAverage;bool reached1=abs(lumaEnd1)>=gradientScaled;bool reached2=abs(lumaEnd2)>=gradientScaled;bool reachedBoth=reached1&&reached2;if(!reached1){uv1-=offset*QUALITY(1);}if(!reached2){uv2+=offset*QUALITY(1);}if(!reachedBoth){for(int i=2;i<SAMPLES;++i){if(!reached1){lumaEnd1=luminance(texture2D(inputBuffer,uv1).rgb);lumaEnd1=lumaEnd1-lumaLocalAverage;}if(!reached2){lumaEnd2=luminance(texture2D(inputBuffer,uv2).rgb);lumaEnd2=lumaEnd2-lumaLocalAverage;}reached1=abs(lumaEnd1)>=gradientScaled;reached2=abs(lumaEnd2)>=gradientScaled;reachedBoth=reached1&&reached2;if(!reached1){uv1-=offset*QUALITY(i);}if(!reached2){uv2+=offset*QUALITY(i);}if(reachedBoth){break;}}}float distance1=isHorizontal?(uv.x-uv1.x):(uv.y-uv1.y);float distance2=isHorizontal?(uv2.x-uv.x):(uv2.y-uv.y);bool isDirection1=distance1<distance2;float distanceFinal=min(distance1,distance2);float edgeThickness=(distance1+distance2);bool isLumaCenterSmaller=lumaCenter<lumaLocalAverage;bool correctVariation1=(lumaEnd1<0.0)!=isLumaCenterSmaller;bool correctVariation2=(lumaEnd2<0.0)!=isLumaCenterSmaller;bool correctVariation=isDirection1?correctVariation1:correctVariation2;float pixelOffset=-distanceFinal/edgeThickness+0.5;float finalOffset=correctVariation?pixelOffset:0.0;float lumaAverage=ONE_OVER_TWELVE*(2.0*(lumaDownUp+lumaLeftRight)+lumaLeftCorners+lumaRightCorners);float subPixelOffset1=clamp(abs(lumaAverage-lumaCenter)/lumaRange,0.0,1.0);float subPixelOffset2=(-2.0*subPixelOffset1+3.0)*subPixelOffset1*subPixelOffset1;float subPixelOffsetFinal=subPixelOffset2*subPixelOffset2*SUBPIXEL_QUALITY;finalOffset=max(finalOffset,subPixelOffsetFinal);vec2 finalUv=uv;if(isHorizontal){finalUv.y+=finalOffset*stepLength;}else{finalUv.x+=finalOffset*stepLength;}return texture2D(inputBuffer,finalUv);}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=fxaa(inputColor,uv);}\";\n\n// src/effects/glsl/fxaa.vert\nvar fxaa_default2 = \"varying vec2 vUvDown;varying vec2 vUvUp;varying vec2 vUvLeft;varying vec2 vUvRight;varying vec2 vUvDownLeft;varying vec2 vUvUpRight;varying vec2 vUvUpLeft;varying vec2 vUvDownRight;void mainSupport(const in vec2 uv){vUvDown=uv+vec2(0.0,-1.0)*texelSize;vUvUp=uv+vec2(0.0,1.0)*texelSize;vUvRight=uv+vec2(1.0,0.0)*texelSize;vUvLeft=uv+vec2(-1.0,0.0)*texelSize;vUvDownLeft=uv+vec2(-1.0,-1.0)*texelSize;vUvUpRight=uv+vec2(1.0,1.0)*texelSize;vUvUpLeft=uv+vec2(-1.0,1.0)*texelSize;vUvDownRight=uv+vec2(1.0,-1.0)*texelSize;}\";\n\n// src/effects/FXAAEffect.js\nvar FXAAEffect = class extends Effect {\n /**\n * Constructs a new FXAA effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n */\n constructor({ blendFunction = BlendFunction.SRC } = {}) {\n super(\"FXAAEffect\", fxaa_default, {\n vertexShader: fxaa_default2,\n blendFunction,\n defines: /* @__PURE__ */ new Map([\n [\"EDGE_THRESHOLD_MIN\", \"0.0312\"],\n [\"EDGE_THRESHOLD_MAX\", \"0.125\"],\n [\"SUBPIXEL_QUALITY\", \"0.75\"],\n [\"SAMPLES\", \"12\"]\n ])\n });\n }\n /**\n * The minimum edge detection threshold. Range is [0.0, 1.0].\n *\n * @type {Number}\n */\n get minEdgeThreshold() {\n return Number(this.defines.get(\"EDGE_THRESHOLD_MIN\"));\n }\n set minEdgeThreshold(value) {\n this.defines.set(\"EDGE_THRESHOLD_MIN\", value.toFixed(12));\n this.setChanged();\n }\n /**\n * The maximum edge detection threshold. Range is [0.0, 1.0].\n *\n * @type {Number}\n */\n get maxEdgeThreshold() {\n return Number(this.defines.get(\"EDGE_THRESHOLD_MAX\"));\n }\n set maxEdgeThreshold(value) {\n this.defines.set(\"EDGE_THRESHOLD_MAX\", value.toFixed(12));\n this.setChanged();\n }\n /**\n * The subpixel blend quality. Range is [0.0, 1.0].\n *\n * @type {Number}\n */\n get subpixelQuality() {\n return Number(this.defines.get(\"SUBPIXEL_QUALITY\"));\n }\n set subpixelQuality(value) {\n this.defines.set(\"SUBPIXEL_QUALITY\", value.toFixed(12));\n this.setChanged();\n }\n /**\n * The maximum amount of edge detection samples.\n *\n * @type {Number}\n */\n get samples() {\n return Number(this.defines.get(\"SAMPLES\"));\n }\n set samples(value) {\n this.defines.set(\"SAMPLES\", value.toFixed(0));\n this.setChanged();\n }\n};\n\n// src/effects/GammaCorrectionEffect.js\nimport { Uniform as Uniform31 } from \"three\";\n\n// src/effects/glsl/gamma-correction.frag\nvar gamma_correction_default = \"uniform float gamma;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=LinearToGamma(max(inputColor,0.0),gamma);}\";\n\n// src/effects/GammaCorrectionEffect.js\nvar GammaCorrectionEffect = class extends Effect {\n /**\n * Constructs a new gamma correction effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n * @param {Number} [options.gamma=2.0] - The gamma factor.\n */\n constructor({ blendFunction = BlendFunction.SRC, gamma = 2 } = {}) {\n super(\"GammaCorrectionEffect\", gamma_correction_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"gamma\", new Uniform31(gamma)]\n ])\n });\n }\n};\n\n// src/effects/GlitchEffect.js\nimport { NearestFilter as NearestFilter6, RepeatWrapping, RGBAFormat as RGBAFormat3, Uniform as Uniform32, Vector2 as Vector220 } from \"three\";\n\n// src/textures/lut/LookupTexture.js\nimport {\n Color as Color4,\n ClampToEdgeWrapping,\n DataTexture,\n Data3DTexture,\n FloatType as FloatType4,\n LinearFilter as LinearFilter3,\n RGBAFormat,\n UnsignedByteType as UnsignedByteType13,\n Vector3\n} from \"three\";\n\n// src/textures/RawImageData.js\nfunction createCanvas(width, height, data) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n canvas.width = width;\n canvas.height = height;\n if (data instanceof Image) {\n context.drawImage(data, 0, 0);\n } else {\n const imageData = context.createImageData(width, height);\n imageData.data.set(data);\n context.putImageData(imageData, 0, 0);\n }\n return canvas;\n}\nvar RawImageData = class _RawImageData {\n /**\n * Constructs a new image data container.\n *\n * @param {Number} [width=0] - The width of the image.\n * @param {Number} [height=0] - The height of the image.\n * @param {Uint8ClampedArray} [data=null] - The image data.\n */\n constructor(width = 0, height = 0, data = null) {\n this.width = width;\n this.height = height;\n this.data = data;\n }\n /**\n * Creates a canvas from this image data.\n *\n * @return {Canvas} The canvas, or null if it couldn't be created.\n */\n toCanvas() {\n return typeof document === \"undefined\" ? null : createCanvas(this.width, this.height, this.data);\n }\n /**\n * Creates a new image data container.\n *\n * @param {ImageData|Image} image - An image or plain image data.\n * @return {RawImageData} The image data.\n */\n static from(image) {\n const { width, height } = image;\n let data;\n if (image instanceof Image) {\n const canvas = createCanvas(width, height, image);\n if (canvas !== null) {\n const context = canvas.getContext(\"2d\");\n data = context.getImageData(0, 0, width, height).data;\n }\n } else {\n data = image.data;\n }\n return new _RawImageData(width, height, data);\n }\n};\n\n// tmp/lut/worker.txt\nvar worker_default = '\"use strict\";(()=>{var O={SCALE_UP:\"lut.scaleup\"};var _=[new Float32Array(3),new Float32Array(3)],n=[new Float32Array(3),new Float32Array(3),new Float32Array(3),new Float32Array(3)],Z=[[new Float32Array([0,0,0]),new Float32Array([1,0,0]),new Float32Array([1,1,0]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([1,0,0]),new Float32Array([1,0,1]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([0,0,1]),new Float32Array([1,0,1]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([0,1,0]),new Float32Array([1,1,0]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([0,1,0]),new Float32Array([0,1,1]),new Float32Array([1,1,1])],[new Float32Array([0,0,0]),new Float32Array([0,0,1]),new Float32Array([0,1,1]),new Float32Array([1,1,1])]];function d(a,t,r,m){let i=r[0]-t[0],e=r[1]-t[1],y=r[2]-t[2],h=a[0]-t[0],A=a[1]-t[1],w=a[2]-t[2],c=e*w-y*A,l=y*h-i*w,x=i*A-e*h,u=Math.sqrt(c*c+l*l+x*x),b=u*.5,s=c/u,F=l/u,f=x/u,p=-(a[0]*s+a[1]*F+a[2]*f),M=m[0]*s+m[1]*F+m[2]*f;return Math.abs(M+p)*b/3}function V(a,t,r,m,i,e){let y=(r+m*t+i*t*t)*4;e[0]=a[y+0],e[1]=a[y+1],e[2]=a[y+2]}function k(a,t,r,m,i,e){let y=r*(t-1),h=m*(t-1),A=i*(t-1),w=Math.floor(y),c=Math.floor(h),l=Math.floor(A),x=Math.ceil(y),u=Math.ceil(h),b=Math.ceil(A),s=y-w,F=h-c,f=A-l;if(w===y&&c===h&&l===A)V(a,t,y,h,A,e);else{let p;s>=F&&F>=f?p=Z[0]:s>=f&&f>=F?p=Z[1]:f>=s&&s>=F?p=Z[2]:F>=s&&s>=f?p=Z[3]:F>=f&&f>=s?p=Z[4]:f>=F&&F>=s&&(p=Z[5]);let[M,g,X,Y]=p,P=_[0];P[0]=s,P[1]=F,P[2]=f;let o=_[1],L=x-w,S=u-c,U=b-l;o[0]=L*M[0]+w,o[1]=S*M[1]+c,o[2]=U*M[2]+l,V(a,t,o[0],o[1],o[2],n[0]),o[0]=L*g[0]+w,o[1]=S*g[1]+c,o[2]=U*g[2]+l,V(a,t,o[0],o[1],o[2],n[1]),o[0]=L*X[0]+w,o[1]=S*X[1]+c,o[2]=U*X[2]+l,V(a,t,o[0],o[1],o[2],n[2]),o[0]=L*Y[0]+w,o[1]=S*Y[1]+c,o[2]=U*Y[2]+l,V(a,t,o[0],o[1],o[2],n[3]);let T=d(g,X,Y,P)*6,q=d(M,X,Y,P)*6,C=d(M,g,Y,P)*6,E=d(M,g,X,P)*6;n[0][0]*=T,n[0][1]*=T,n[0][2]*=T,n[1][0]*=q,n[1][1]*=q,n[1][2]*=q,n[2][0]*=C,n[2][1]*=C,n[2][2]*=C,n[3][0]*=E,n[3][1]*=E,n[3][2]*=E,e[0]=n[0][0]+n[1][0]+n[2][0]+n[3][0],e[1]=n[0][1]+n[1][1]+n[2][1]+n[3][1],e[2]=n[0][2]+n[1][2]+n[2][2]+n[3][2]}}var v=class{static expand(t,r){let m=Math.cbrt(t.length/4),i=new Float32Array(3),e=new t.constructor(r**3*4),y=t instanceof Uint8Array?255:1,h=r**2,A=1/(r-1);for(let w=0;w<r;++w)for(let c=0;c<r;++c)for(let l=0;l<r;++l){let x=l*A,u=c*A,b=w*A,s=Math.round(l+c*r+w*h)*4;k(t,m,x,u,b,i),e[s+0]=i[0],e[s+1]=i[1],e[s+2]=i[2],e[s+3]=y}return e}};self.addEventListener(\"message\",a=>{let t=a.data,r=t.data;switch(t.operation){case O.SCALE_UP:r=v.expand(r,t.size);break}postMessage(r,[r.buffer]),close()});})();\\n';\n\n// src/textures/lut/LookupTexture.js\nvar c = /* @__PURE__ */ new Color4();\nvar LookupTexture = class _LookupTexture extends Data3DTexture {\n /**\n * Constructs a cubic 3D lookup texture.\n *\n * @param {TypedArray} data - The pixel data. The default format is RGBA.\n * @param {Number} size - The sidelength.\n */\n constructor(data, size) {\n super(data, size, size, size);\n this.type = FloatType4;\n this.format = RGBAFormat;\n this.minFilter = LinearFilter3;\n this.magFilter = LinearFilter3;\n this.wrapS = ClampToEdgeWrapping;\n this.wrapT = ClampToEdgeWrapping;\n this.wrapR = ClampToEdgeWrapping;\n this.unpackAlignment = 1;\n this.needsUpdate = true;\n setTextureColorSpace(this, LinearSRGBColorSpace);\n this.domainMin = new Vector3(0, 0, 0);\n this.domainMax = new Vector3(1, 1, 1);\n }\n /**\n * Indicates that this is an instance of LookupTexture3D.\n *\n * @type {Boolean}\n * @deprecated\n */\n get isLookupTexture3D() {\n return true;\n }\n /**\n * Scales this LUT up to a given target size using tetrahedral interpolation.\n *\n * @param {Number} size - The target sidelength.\n * @param {Boolean} [transferData=true] - Extra fast mode. Set to false to keep the original data intact.\n * @return {Promise<LookupTexture>} A promise that resolves with a new LUT upon completion.\n */\n scaleUp(size, transferData = true) {\n const image = this.image;\n let promise;\n if (size <= image.width) {\n promise = Promise.reject(new Error(\"The target size must be greater than the current size\"));\n } else {\n promise = new Promise((resolve, reject) => {\n const workerURL = URL.createObjectURL(new Blob([worker_default], {\n type: \"text/javascript\"\n }));\n const worker = new Worker(workerURL);\n worker.addEventListener(\"error\", (event) => reject(event.error));\n worker.addEventListener(\"message\", (event) => {\n const lut = new _LookupTexture(event.data, size);\n copyTextureColorSpace(this, lut);\n lut.type = this.type;\n lut.name = this.name;\n URL.revokeObjectURL(workerURL);\n resolve(lut);\n });\n const transferList = transferData ? [image.data.buffer] : [];\n worker.postMessage({\n operation: LUTOperation.SCALE_UP,\n data: image.data,\n size\n }, transferList);\n });\n }\n return promise;\n }\n /**\n * Applies the given LUT to this one.\n *\n * @param {LookupTexture} lut - A LUT. Must have the same dimensions, type and format as this LUT.\n * @return {LookupTexture} This texture.\n */\n applyLUT(lut) {\n const img0 = this.image;\n const img1 = lut.image;\n const size0 = Math.min(img0.width, img0.height, img0.depth);\n const size1 = Math.min(img1.width, img1.height, img1.depth);\n if (size0 !== size1) {\n console.error(\"Size mismatch\");\n } else if (lut.type !== FloatType4 || this.type !== FloatType4) {\n console.error(\"Both LUTs must be FloatType textures\");\n } else if (lut.format !== RGBAFormat || this.format !== RGBAFormat) {\n console.error(\"Both LUTs must be RGBA textures\");\n } else {\n const data0 = img0.data;\n const data1 = img1.data;\n const size = size0;\n const sizeSq = size ** 2;\n const s = size - 1;\n for (let i = 0, l = size ** 3; i < l; ++i) {\n const i4 = i * 4;\n const r = data0[i4 + 0] * s;\n const g = data0[i4 + 1] * s;\n const b = data0[i4 + 2] * s;\n const iRGB = Math.round(r + g * size + b * sizeSq) * 4;\n data0[i4 + 0] = data1[iRGB + 0];\n data0[i4 + 1] = data1[iRGB + 1];\n data0[i4 + 2] = data1[iRGB + 2];\n }\n this.needsUpdate = true;\n }\n return this;\n }\n /**\n * Converts the LUT data into unsigned byte data.\n *\n * This is a lossy operation which should only be performed after all other transformations have been applied.\n *\n * @return {LookupTexture} This texture.\n */\n convertToUint8() {\n if (this.type === FloatType4) {\n const floatData = this.image.data;\n const uint8Data = new Uint8Array(floatData.length);\n for (let i = 0, l = floatData.length; i < l; ++i) {\n uint8Data[i] = floatData[i] * 255 + 0.5;\n }\n this.image.data = uint8Data;\n this.type = UnsignedByteType13;\n this.needsUpdate = true;\n }\n return this;\n }\n /**\n * Converts the LUT data into float data.\n *\n * @return {LookupTexture} This texture.\n */\n convertToFloat() {\n if (this.type === UnsignedByteType13) {\n const uint8Data = this.image.data;\n const floatData = new Float32Array(uint8Data.length);\n for (let i = 0, l = uint8Data.length; i < l; ++i) {\n floatData[i] = uint8Data[i] / 255;\n }\n this.image.data = floatData;\n this.type = FloatType4;\n this.needsUpdate = true;\n }\n return this;\n }\n /**\n * Converts this LUT into RGBA data.\n *\n * @deprecated LUTs are RGBA by default since three r137.\n * @return {LookupTexture} This texture.\n */\n convertToRGBA() {\n console.warn(\"LookupTexture\", \"convertToRGBA() is deprecated, LUTs are now RGBA by default\");\n return this;\n }\n /**\n * Converts the output of this LUT into sRGB color space.\n *\n * @return {LookupTexture} This texture.\n */\n convertLinearToSRGB() {\n const data = this.image.data;\n if (this.type === FloatType4) {\n for (let i = 0, l = data.length; i < l; i += 4) {\n c.fromArray(data, i).convertLinearToSRGB().toArray(data, i);\n }\n setTextureColorSpace(this, SRGBColorSpace);\n this.needsUpdate = true;\n } else {\n console.error(\"Color space conversion requires FloatType data\");\n }\n return this;\n }\n /**\n * Converts the output of this LUT into linear color space.\n *\n * @return {LookupTexture} This texture.\n */\n convertSRGBToLinear() {\n const data = this.image.data;\n if (this.type === FloatType4) {\n for (let i = 0, l = data.length; i < l; i += 4) {\n c.fromArray(data, i).convertSRGBToLinear().toArray(data, i);\n }\n setTextureColorSpace(this, LinearSRGBColorSpace);\n this.needsUpdate = true;\n } else {\n console.error(\"Color space conversion requires FloatType data\");\n }\n return this;\n }\n /**\n * Converts this LUT into a 2D data texture.\n *\n * Please note that custom input domains are not carried over to 2D textures.\n *\n * @return {DataTexture} The texture.\n */\n toDataTexture() {\n const width = this.image.width;\n const height = this.image.height * this.image.depth;\n const texture = new DataTexture(this.image.data, width, height);\n texture.name = this.name;\n texture.type = this.type;\n texture.format = this.format;\n texture.minFilter = LinearFilter3;\n texture.magFilter = LinearFilter3;\n texture.wrapS = this.wrapS;\n texture.wrapT = this.wrapT;\n texture.generateMipmaps = false;\n texture.needsUpdate = true;\n copyTextureColorSpace(this, texture);\n return texture;\n }\n /**\n * Creates a new 3D LUT by copying a given LUT.\n *\n * Common image-based textures will be converted into 3D data textures.\n *\n * @param {Texture} texture - The LUT. Assumed to be cubic.\n * @return {LookupTexture} A new 3D LUT.\n */\n static from(texture) {\n const image = texture.image;\n const { width, height } = image;\n const size = Math.min(width, height);\n let data;\n if (image instanceof Image) {\n const rawImageData = RawImageData.from(image);\n const src = rawImageData.data;\n if (width > height) {\n data = new Uint8Array(src.length);\n for (let z = 0; z < size; ++z) {\n for (let y = 0; y < size; ++y) {\n for (let x = 0; x < size; ++x) {\n const i4 = (x + z * size + y * size * size) * 4;\n const j4 = (x + y * size + z * size * size) * 4;\n data[j4 + 0] = src[i4 + 0];\n data[j4 + 1] = src[i4 + 1];\n data[j4 + 2] = src[i4 + 2];\n data[j4 + 3] = src[i4 + 3];\n }\n }\n }\n } else {\n data = new Uint8Array(src.buffer);\n }\n } else {\n data = image.data.slice();\n }\n const lut = new _LookupTexture(data, size);\n lut.type = texture.type;\n lut.name = texture.name;\n copyTextureColorSpace(texture, lut);\n return lut;\n }\n /**\n * Creates a neutral 3D LUT.\n *\n * @param {Number} size - The sidelength.\n * @return {LookupTexture} A neutral 3D LUT.\n */\n static createNeutral(size) {\n const data = new Float32Array(size ** 3 * 4);\n const sizeSq = size ** 2;\n const s = 1 / (size - 1);\n for (let r = 0; r < size; ++r) {\n for (let g = 0; g < size; ++g) {\n for (let b = 0; b < size; ++b) {\n const i4 = (r + g * size + b * sizeSq) * 4;\n data[i4 + 0] = r * s;\n data[i4 + 1] = g * s;\n data[i4 + 2] = b * s;\n data[i4 + 3] = 1;\n }\n }\n }\n const lut = new _LookupTexture(data, size);\n lut.name = \"neutral\";\n return lut;\n }\n};\n\n// src/textures/lut/TetrahedralUpscaler.js\nvar P = [\n new Float32Array(3),\n new Float32Array(3)\n];\nvar C = [\n new Float32Array(3),\n new Float32Array(3),\n new Float32Array(3),\n new Float32Array(3)\n];\nvar T = [\n [\n new Float32Array([0, 0, 0]),\n new Float32Array([1, 0, 0]),\n new Float32Array([1, 1, 0]),\n new Float32Array([1, 1, 1])\n ],\n [\n new Float32Array([0, 0, 0]),\n new Float32Array([1, 0, 0]),\n new Float32Array([1, 0, 1]),\n new Float32Array([1, 1, 1])\n ],\n [\n new Float32Array([0, 0, 0]),\n new Float32Array([0, 0, 1]),\n new Float32Array([1, 0, 1]),\n new Float32Array([1, 1, 1])\n ],\n [\n new Float32Array([0, 0, 0]),\n new Float32Array([0, 1, 0]),\n new Float32Array([1, 1, 0]),\n new Float32Array([1, 1, 1])\n ],\n [\n new Float32Array([0, 0, 0]),\n new Float32Array([0, 1, 0]),\n new Float32Array([0, 1, 1]),\n new Float32Array([1, 1, 1])\n ],\n [\n new Float32Array([0, 0, 0]),\n new Float32Array([0, 0, 1]),\n new Float32Array([0, 1, 1]),\n new Float32Array([1, 1, 1])\n ]\n];\nfunction calculateTetrahedronVolume(a, b, c2, d) {\n const bcX = c2[0] - b[0];\n const bcY = c2[1] - b[1];\n const bcZ = c2[2] - b[2];\n const baX = a[0] - b[0];\n const baY = a[1] - b[1];\n const baZ = a[2] - b[2];\n const crossX = bcY * baZ - bcZ * baY;\n const crossY = bcZ * baX - bcX * baZ;\n const crossZ = bcX * baY - bcY * baX;\n const length = Math.sqrt(crossX * crossX + crossY * crossY + crossZ * crossZ);\n const triangleArea = length * 0.5;\n const normalX = crossX / length;\n const normalY = crossY / length;\n const normalZ = crossZ / length;\n const constant = -(a[0] * normalX + a[1] * normalY + a[2] * normalZ);\n const dot = d[0] * normalX + d[1] * normalY + d[2] * normalZ;\n const height = Math.abs(dot + constant);\n return height * triangleArea / 3;\n}\nfunction sample(data, size, x, y, z, color2) {\n const i4 = (x + y * size + z * size * size) * 4;\n color2[0] = data[i4 + 0];\n color2[1] = data[i4 + 1];\n color2[2] = data[i4 + 2];\n}\nfunction tetrahedralSample(data, size, u, v3, w, color2) {\n const px = u * (size - 1);\n const py = v3 * (size - 1);\n const pz = w * (size - 1);\n const minX = Math.floor(px);\n const minY = Math.floor(py);\n const minZ = Math.floor(pz);\n const maxX = Math.ceil(px);\n const maxY = Math.ceil(py);\n const maxZ = Math.ceil(pz);\n const su = px - minX;\n const sv = py - minY;\n const sw = pz - minZ;\n if (minX === px && minY === py && minZ === pz) {\n sample(data, size, px, py, pz, color2);\n } else {\n let vertices;\n if (su >= sv && sv >= sw) {\n vertices = T[0];\n } else if (su >= sw && sw >= sv) {\n vertices = T[1];\n } else if (sw >= su && su >= sv) {\n vertices = T[2];\n } else if (sv >= su && su >= sw) {\n vertices = T[3];\n } else if (sv >= sw && sw >= su) {\n vertices = T[4];\n } else if (sw >= sv && sv >= su) {\n vertices = T[5];\n }\n const [P0, P1, P2, P3] = vertices;\n const coords = P[0];\n coords[0] = su;\n coords[1] = sv;\n coords[2] = sw;\n const tmp = P[1];\n const diffX = maxX - minX;\n const diffY = maxY - minY;\n const diffZ = maxZ - minZ;\n tmp[0] = diffX * P0[0] + minX;\n tmp[1] = diffY * P0[1] + minY;\n tmp[2] = diffZ * P0[2] + minZ;\n sample(data, size, tmp[0], tmp[1], tmp[2], C[0]);\n tmp[0] = diffX * P1[0] + minX;\n tmp[1] = diffY * P1[1] + minY;\n tmp[2] = diffZ * P1[2] + minZ;\n sample(data, size, tmp[0], tmp[1], tmp[2], C[1]);\n tmp[0] = diffX * P2[0] + minX;\n tmp[1] = diffY * P2[1] + minY;\n tmp[2] = diffZ * P2[2] + minZ;\n sample(data, size, tmp[0], tmp[1], tmp[2], C[2]);\n tmp[0] = diffX * P3[0] + minX;\n tmp[1] = diffY * P3[1] + minY;\n tmp[2] = diffZ * P3[2] + minZ;\n sample(data, size, tmp[0], tmp[1], tmp[2], C[3]);\n const V0 = calculateTetrahedronVolume(P1, P2, P3, coords) * 6;\n const V1 = calculateTetrahedronVolume(P0, P2, P3, coords) * 6;\n const V2 = calculateTetrahedronVolume(P0, P1, P3, coords) * 6;\n const V3 = calculateTetrahedronVolume(P0, P1, P2, coords) * 6;\n C[0][0] *= V0;\n C[0][1] *= V0;\n C[0][2] *= V0;\n C[1][0] *= V1;\n C[1][1] *= V1;\n C[1][2] *= V1;\n C[2][0] *= V2;\n C[2][1] *= V2;\n C[2][2] *= V2;\n C[3][0] *= V3;\n C[3][1] *= V3;\n C[3][2] *= V3;\n color2[0] = C[0][0] + C[1][0] + C[2][0] + C[3][0];\n color2[1] = C[0][1] + C[1][1] + C[2][1] + C[3][1];\n color2[2] = C[0][2] + C[1][2] + C[2][2] + C[3][2];\n }\n}\nvar TetrahedralUpscaler = class {\n /**\n * Expands the given data to the target size.\n *\n * @param {TypedArray} data - The input RGBA data. Assumed to be cubic.\n * @param {Number} size - The target size.\n * @return {TypedArray} The new data.\n */\n static expand(data, size) {\n const originalSize = Math.cbrt(data.length / 4);\n const rgb = new Float32Array(3);\n const array = new data.constructor(size ** 3 * 4);\n const maxValue = data instanceof Uint8Array ? 255 : 1;\n const sizeSq = size ** 2;\n const s = 1 / (size - 1);\n for (let z = 0; z < size; ++z) {\n for (let y = 0; y < size; ++y) {\n for (let x = 0; x < size; ++x) {\n const u = x * s;\n const v3 = y * s;\n const w = z * s;\n const i4 = Math.round(x + y * size + z * sizeSq) * 4;\n tetrahedralSample(data, originalSize, u, v3, w, rgb);\n array[i4 + 0] = rgb[0];\n array[i4 + 1] = rgb[1];\n array[i4 + 2] = rgb[2];\n array[i4 + 3] = maxValue;\n }\n }\n }\n return array;\n }\n};\n\n// src/textures/smaa/SMAAAreaImageData.js\nvar area = [\n new Float32Array(2),\n new Float32Array(2)\n];\nvar ORTHOGONAL_SIZE = 16;\nvar DIAGONAL_SIZE = 20;\nvar DIAGONAL_SAMPLES = 30;\nvar SMOOTH_MAX_DISTANCE = 32;\nvar orthogonalSubsamplingOffsets = new Float32Array([\n 0,\n -0.25,\n 0.25,\n -0.125,\n 0.125,\n -0.375,\n 0.375\n]);\nvar diagonalSubsamplingOffsets = [\n new Float32Array([0, 0]),\n new Float32Array([0.25, -0.25]),\n new Float32Array([-0.25, 0.25]),\n new Float32Array([0.125, -0.125]),\n new Float32Array([-0.125, 0.125])\n];\nvar orthogonalEdges = [\n new Uint8Array([0, 0]),\n new Uint8Array([3, 0]),\n new Uint8Array([0, 3]),\n new Uint8Array([3, 3]),\n new Uint8Array([1, 0]),\n new Uint8Array([4, 0]),\n new Uint8Array([1, 3]),\n new Uint8Array([4, 3]),\n new Uint8Array([0, 1]),\n new Uint8Array([3, 1]),\n new Uint8Array([0, 4]),\n new Uint8Array([3, 4]),\n new Uint8Array([1, 1]),\n new Uint8Array([4, 1]),\n new Uint8Array([1, 4]),\n new Uint8Array([4, 4])\n];\nvar diagonalEdges = [\n new Uint8Array([0, 0]),\n new Uint8Array([1, 0]),\n new Uint8Array([0, 2]),\n new Uint8Array([1, 2]),\n new Uint8Array([2, 0]),\n new Uint8Array([3, 0]),\n new Uint8Array([2, 2]),\n new Uint8Array([3, 2]),\n new Uint8Array([0, 1]),\n new Uint8Array([1, 1]),\n new Uint8Array([0, 3]),\n new Uint8Array([1, 3]),\n new Uint8Array([2, 1]),\n new Uint8Array([3, 1]),\n new Uint8Array([2, 3]),\n new Uint8Array([3, 3])\n];\nfunction lerp(a, b, p) {\n return a + (b - a) * p;\n}\nfunction saturate(a) {\n return Math.min(Math.max(a, 0), 1);\n}\nfunction smoothArea(d) {\n const a1 = area[0];\n const a2 = area[1];\n const b1X = Math.sqrt(a1[0] * 2) * 0.5;\n const b1Y = Math.sqrt(a1[1] * 2) * 0.5;\n const b2X = Math.sqrt(a2[0] * 2) * 0.5;\n const b2Y = Math.sqrt(a2[1] * 2) * 0.5;\n const p = saturate(d / SMOOTH_MAX_DISTANCE);\n a1[0] = lerp(b1X, a1[0], p);\n a1[1] = lerp(b1Y, a1[1], p);\n a2[0] = lerp(b2X, a2[0], p);\n a2[1] = lerp(b2Y, a2[1], p);\n}\nfunction getOrthArea(p1X, p1Y, p2X, p2Y, x, result) {\n const dX = p2X - p1X;\n const dY = p2Y - p1Y;\n const x1 = x;\n const x2 = x + 1;\n const y1 = p1Y + dY * (x1 - p1X) / dX;\n const y2 = p1Y + dY * (x2 - p1X) / dX;\n if (x1 >= p1X && x1 < p2X || x2 > p1X && x2 <= p2X) {\n if (Math.sign(y1) === Math.sign(y2) || Math.abs(y1) < 1e-4 || Math.abs(y2) < 1e-4) {\n const a = (y1 + y2) / 2;\n if (a < 0) {\n result[0] = Math.abs(a);\n result[1] = 0;\n } else {\n result[0] = 0;\n result[1] = Math.abs(a);\n }\n } else {\n const t = -p1Y * dX / dY + p1X;\n const tInt = Math.trunc(t);\n const a1 = t > p1X ? y1 * (t - tInt) / 2 : 0;\n const a2 = t < p2X ? y2 * (1 - (t - tInt)) / 2 : 0;\n const a = Math.abs(a1) > Math.abs(a2) ? a1 : -a2;\n if (a < 0) {\n result[0] = Math.abs(a1);\n result[1] = Math.abs(a2);\n } else {\n result[0] = Math.abs(a2);\n result[1] = Math.abs(a1);\n }\n }\n } else {\n result[0] = 0;\n result[1] = 0;\n }\n return result;\n}\nfunction getOrthAreaForPattern(pattern, left, right, offset, result) {\n const a1 = area[0];\n const a2 = area[1];\n const o1 = 0.5 + offset;\n const o2 = 0.5 + offset - 1;\n const d = left + right + 1;\n switch (pattern) {\n case 0: {\n result[0] = 0;\n result[1] = 0;\n break;\n }\n case 1: {\n if (left <= right) {\n getOrthArea(0, o2, d / 2, 0, left, result);\n } else {\n result[0] = 0;\n result[1] = 0;\n }\n break;\n }\n case 2: {\n if (left >= right) {\n getOrthArea(d / 2, 0, d, o2, left, result);\n } else {\n result[0] = 0;\n result[1] = 0;\n }\n break;\n }\n case 3: {\n getOrthArea(0, o2, d / 2, 0, left, a1);\n getOrthArea(d / 2, 0, d, o2, left, a2);\n smoothArea(d, area);\n result[0] = a1[0] + a2[0];\n result[1] = a1[1] + a2[1];\n break;\n }\n case 4: {\n if (left <= right) {\n getOrthArea(0, o1, d / 2, 0, left, result);\n } else {\n result[0] = 0;\n result[1] = 0;\n }\n break;\n }\n case 5: {\n result[0] = 0;\n result[1] = 0;\n break;\n }\n case 6: {\n if (Math.abs(offset) > 0) {\n getOrthArea(0, o1, d, o2, left, a1);\n getOrthArea(0, o1, d / 2, 0, left, a2);\n getOrthArea(d / 2, 0, d, o2, left, result);\n a2[0] = a2[0] + result[0];\n a2[1] = a2[1] + result[1];\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n } else {\n getOrthArea(0, o1, d, o2, left, result);\n }\n break;\n }\n case 7: {\n getOrthArea(0, o1, d, o2, left, result);\n break;\n }\n case 8: {\n if (left >= right) {\n getOrthArea(d / 2, 0, d, o1, left, result);\n } else {\n result[0] = 0;\n result[1] = 0;\n }\n break;\n }\n case 9: {\n if (Math.abs(offset) > 0) {\n getOrthArea(0, o2, d, o1, left, a1);\n getOrthArea(0, o2, d / 2, 0, left, a2);\n getOrthArea(d / 2, 0, d, o1, left, result);\n a2[0] = a2[0] + result[0];\n a2[1] = a2[1] + result[1];\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n } else {\n getOrthArea(0, o2, d, o1, left, result);\n }\n break;\n }\n case 10: {\n result[0] = 0;\n result[1] = 0;\n break;\n }\n case 11: {\n getOrthArea(0, o2, d, o1, left, result);\n break;\n }\n case 12: {\n getOrthArea(0, o1, d / 2, 0, left, a1);\n getOrthArea(d / 2, 0, d, o1, left, a2);\n smoothArea(d, area);\n result[0] = a1[0] + a2[0];\n result[1] = a1[1] + a2[1];\n break;\n }\n case 13: {\n getOrthArea(0, o2, d, o1, left, result);\n break;\n }\n case 14: {\n getOrthArea(0, o1, d, o2, left, result);\n break;\n }\n case 15: {\n result[0] = 0;\n result[1] = 0;\n break;\n }\n }\n return result;\n}\nfunction isInsideArea(a1X, a1Y, a2X, a2Y, x, y) {\n let result = a1X === a2X && a1Y === a2Y;\n if (!result) {\n const xm = (a1X + a2X) / 2;\n const ym = (a1Y + a2Y) / 2;\n const a = a2Y - a1Y;\n const b = a1X - a2X;\n const c2 = a * (x - xm) + b * (y - ym);\n result = c2 > 0;\n }\n return result;\n}\nfunction getDiagAreaForPixel(a1X, a1Y, a2X, a2Y, pX, pY) {\n let n = 0;\n for (let y = 0; y < DIAGONAL_SAMPLES; ++y) {\n for (let x = 0; x < DIAGONAL_SAMPLES; ++x) {\n const offsetX = x / (DIAGONAL_SAMPLES - 1);\n const offsetY = y / (DIAGONAL_SAMPLES - 1);\n if (isInsideArea(a1X, a1Y, a2X, a2Y, pX + offsetX, pY + offsetY)) {\n ++n;\n }\n }\n }\n return n / (DIAGONAL_SAMPLES * DIAGONAL_SAMPLES);\n}\nfunction getDiagArea(pattern, a1X, a1Y, a2X, a2Y, left, offset, result) {\n const e = diagonalEdges[pattern];\n const e1 = e[0];\n const e2 = e[1];\n if (e1 > 0) {\n a1X += offset[0];\n a1Y += offset[1];\n }\n if (e2 > 0) {\n a2X += offset[0];\n a2Y += offset[1];\n }\n result[0] = 1 - getDiagAreaForPixel(a1X, a1Y, a2X, a2Y, 1 + left, 0 + left);\n result[1] = getDiagAreaForPixel(a1X, a1Y, a2X, a2Y, 1 + left, 1 + left);\n return result;\n}\nfunction getDiagAreaForPattern(pattern, left, right, offset, result) {\n const a1 = area[0];\n const a2 = area[1];\n const d = left + right + 1;\n switch (pattern) {\n case 0: {\n getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 1: {\n getDiagArea(pattern, 1, 0, 0 + d, 0 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 2: {\n getDiagArea(pattern, 0, 0, 1 + d, 0 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 3: {\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, result);\n break;\n }\n case 4: {\n getDiagArea(pattern, 1, 1, 0 + d, 0 + d, left, offset, a1);\n getDiagArea(pattern, 1, 1, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 5: {\n getDiagArea(pattern, 1, 1, 0 + d, 0 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 6: {\n getDiagArea(pattern, 1, 1, 1 + d, 0 + d, left, offset, result);\n break;\n }\n case 7: {\n getDiagArea(pattern, 1, 1, 1 + d, 0 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 8: {\n getDiagArea(pattern, 0, 0, 1 + d, 1 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 9: {\n getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, result);\n getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, result);\n break;\n }\n case 10: {\n getDiagArea(pattern, 0, 0, 1 + d, 1 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 11: {\n getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 12: {\n getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, result);\n break;\n }\n case 13: {\n getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 1 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 14: {\n getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, a1);\n getDiagArea(pattern, 1, 1, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n case 15: {\n getDiagArea(pattern, 1, 1, 1 + d, 1 + d, left, offset, a1);\n getDiagArea(pattern, 1, 0, 1 + d, 0 + d, left, offset, a2);\n result[0] = (a1[0] + a2[0]) / 2;\n result[1] = (a1[1] + a2[1]) / 2;\n break;\n }\n }\n return result;\n}\nfunction generatePatterns(patterns, offset, orthogonal) {\n const result = new Float32Array(2);\n for (let i = 0, l = patterns.length; i < l; ++i) {\n const pattern = patterns[i];\n const data = pattern.data;\n const size = pattern.width;\n for (let y = 0; y < size; ++y) {\n for (let x = 0; x < size; ++x) {\n if (orthogonal) {\n getOrthAreaForPattern(i, x, y, offset, result);\n } else {\n getDiagAreaForPattern(i, x, y, offset, result);\n }\n const c2 = (y * size + x) * 2;\n data[c2] = result[0] * 255;\n data[c2 + 1] = result[1] * 255;\n }\n }\n }\n}\nfunction assemble(baseX, baseY, patterns, edges2, size, orthogonal, target) {\n const dstData = target.data;\n const dstWidth = target.width;\n for (let i = 0, l = patterns.length; i < l; ++i) {\n const edge = edges2[i];\n const pattern = patterns[i];\n const srcData = pattern.data;\n const srcWidth = pattern.width;\n for (let y = 0; y < size; ++y) {\n for (let x = 0; x < size; ++x) {\n const pX = edge[0] * size + baseX + x;\n const pY = edge[1] * size + baseY + y;\n const c2 = (pY * dstWidth + pX) * 4;\n const d = orthogonal ? (y * y * srcWidth + x * x) * 2 : (y * srcWidth + x) * 2;\n dstData[c2] = srcData[d];\n dstData[c2 + 1] = srcData[d + 1];\n dstData[c2 + 2] = 0;\n dstData[c2 + 3] = 255;\n }\n }\n }\n}\nvar SMAAAreaImageData = class {\n /**\n * Creates a new area image.\n *\n * @return {RawImageData} The generated image data.\n */\n static generate() {\n const width = 2 * 5 * ORTHOGONAL_SIZE;\n const height = orthogonalSubsamplingOffsets.length * 5 * ORTHOGONAL_SIZE;\n const data = new Uint8ClampedArray(width * height * 4);\n const result = new RawImageData(width, height, data);\n const orthPatternSize = Math.pow(ORTHOGONAL_SIZE - 1, 2) + 1;\n const diagPatternSize = DIAGONAL_SIZE;\n const orthogonalPatterns = [];\n const diagonalPatterns = [];\n for (let i = 3, l = data.length; i < l; i += 4) {\n data[i] = 255;\n }\n for (let i = 0; i < 16; ++i) {\n orthogonalPatterns.push(new RawImageData(\n orthPatternSize,\n orthPatternSize,\n new Uint8ClampedArray(orthPatternSize * orthPatternSize * 2),\n 2\n ));\n diagonalPatterns.push(new RawImageData(\n diagPatternSize,\n diagPatternSize,\n new Uint8ClampedArray(diagPatternSize * diagPatternSize * 2),\n 2\n ));\n }\n for (let i = 0, l = orthogonalSubsamplingOffsets.length; i < l; ++i) {\n generatePatterns(orthogonalPatterns, orthogonalSubsamplingOffsets[i], true);\n assemble(\n 0,\n 5 * ORTHOGONAL_SIZE * i,\n orthogonalPatterns,\n orthogonalEdges,\n ORTHOGONAL_SIZE,\n true,\n result\n );\n }\n for (let i = 0, l = diagonalSubsamplingOffsets.length; i < l; ++i) {\n generatePatterns(diagonalPatterns, diagonalSubsamplingOffsets[i], false);\n assemble(\n 5 * ORTHOGONAL_SIZE,\n 4 * DIAGONAL_SIZE * i,\n diagonalPatterns,\n diagonalEdges,\n DIAGONAL_SIZE,\n false,\n result\n );\n }\n return result;\n }\n};\n\n// src/textures/smaa/SMAAImageGenerator.js\nimport { LoadingManager } from \"three\";\n\n// tmp/smaa/worker.txt\nvar worker_default2 = '\"use strict\";(()=>{function q(t,a,s){let e=document.createElement(\"canvas\"),n=e.getContext(\"2d\");if(e.width=t,e.height=a,s instanceof Image)n.drawImage(s,0,0);else{let r=n.createImageData(t,a);r.data.set(s),n.putImageData(r,0,0)}return e}var F=class t{constructor(a=0,s=0,e=null){this.width=a,this.height=s,this.data=e}toCanvas(){return typeof document==\"undefined\"?null:q(this.width,this.height,this.data)}static from(a){let{width:s,height:e}=a,n;if(a instanceof Image){let r=q(s,e,a);r!==null&&(n=r.getContext(\"2d\").getImageData(0,0,s,e).data)}else n=a.data;return new t(s,e,n)}};var M=[new Float32Array(2),new Float32Array(2)],D=16,W=20,I=30,j=32,v=new Float32Array([0,-.25,.25,-.125,.125,-.375,.375]),N=[new Float32Array([0,0]),new Float32Array([.25,-.25]),new Float32Array([-.25,.25]),new Float32Array([.125,-.125]),new Float32Array([-.125,.125])],z=[new Uint8Array([0,0]),new Uint8Array([3,0]),new Uint8Array([0,3]),new Uint8Array([3,3]),new Uint8Array([1,0]),new Uint8Array([4,0]),new Uint8Array([1,3]),new Uint8Array([4,3]),new Uint8Array([0,1]),new Uint8Array([3,1]),new Uint8Array([0,4]),new Uint8Array([3,4]),new Uint8Array([1,1]),new Uint8Array([4,1]),new Uint8Array([1,4]),new Uint8Array([4,4])],p=[new Uint8Array([0,0]),new Uint8Array([1,0]),new Uint8Array([0,2]),new Uint8Array([1,2]),new Uint8Array([2,0]),new Uint8Array([3,0]),new Uint8Array([2,2]),new Uint8Array([3,2]),new Uint8Array([0,1]),new Uint8Array([1,1]),new Uint8Array([0,3]),new Uint8Array([1,3]),new Uint8Array([2,1]),new Uint8Array([3,1]),new Uint8Array([2,3]),new Uint8Array([3,3])];function C(t,a,s){return t+(a-t)*s}function B(t){return Math.min(Math.max(t,0),1)}function _(t){let a=M[0],s=M[1],e=Math.sqrt(a[0]*2)*.5,n=Math.sqrt(a[1]*2)*.5,r=Math.sqrt(s[0]*2)*.5,o=Math.sqrt(s[1]*2)*.5,c=B(t/j);a[0]=C(e,a[0],c),a[1]=C(n,a[1],c),s[0]=C(r,s[0],c),s[1]=C(o,s[1],c)}function d(t,a,s,e,n,r){let o=s-t,c=e-a,h=n,i=n+1,w=a+c*(h-t)/o,b=a+c*(i-t)/o;if(h>=t&&h<s||i>t&&i<=s)if(Math.sign(w)===Math.sign(b)||Math.abs(w)<1e-4||Math.abs(b)<1e-4){let g=(w+b)/2;g<0?(r[0]=Math.abs(g),r[1]=0):(r[0]=0,r[1]=Math.abs(g))}else{let g=-a*o/c+t,k=Math.trunc(g),m=g>t?w*(g-k)/2:0,U=g<s?b*(1-(g-k))/2:0;(Math.abs(m)>Math.abs(U)?m:-U)<0?(r[0]=Math.abs(m),r[1]=Math.abs(U)):(r[0]=Math.abs(U),r[1]=Math.abs(m))}else r[0]=0,r[1]=0;return r}function J(t,a,s,e,n){let r=M[0],o=M[1],c=.5+e,h=.5+e-1,i=a+s+1;switch(t){case 0:{n[0]=0,n[1]=0;break}case 1:{a<=s?d(0,h,i/2,0,a,n):(n[0]=0,n[1]=0);break}case 2:{a>=s?d(i/2,0,i,h,a,n):(n[0]=0,n[1]=0);break}case 3:{d(0,h,i/2,0,a,r),d(i/2,0,i,h,a,o),_(i,M),n[0]=r[0]+o[0],n[1]=r[1]+o[1];break}case 4:{a<=s?d(0,c,i/2,0,a,n):(n[0]=0,n[1]=0);break}case 5:{n[0]=0,n[1]=0;break}case 6:{Math.abs(e)>0?(d(0,c,i,h,a,r),d(0,c,i/2,0,a,o),d(i/2,0,i,h,a,n),o[0]=o[0]+n[0],o[1]=o[1]+n[1],n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2):d(0,c,i,h,a,n);break}case 7:{d(0,c,i,h,a,n);break}case 8:{a>=s?d(i/2,0,i,c,a,n):(n[0]=0,n[1]=0);break}case 9:{Math.abs(e)>0?(d(0,h,i,c,a,r),d(0,h,i/2,0,a,o),d(i/2,0,i,c,a,n),o[0]=o[0]+n[0],o[1]=o[1]+n[1],n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2):d(0,h,i,c,a,n);break}case 10:{n[0]=0,n[1]=0;break}case 11:{d(0,h,i,c,a,n);break}case 12:{d(0,c,i/2,0,a,r),d(i/2,0,i,c,a,o),_(i,M),n[0]=r[0]+o[0],n[1]=r[1]+o[1];break}case 13:{d(0,h,i,c,a,n);break}case 14:{d(0,c,i,h,a,n);break}case 15:{n[0]=0,n[1]=0;break}}return n}function K(t,a,s,e,n,r){let o=t===s&&a===e;if(!o){let c=(t+s)/2,h=(a+e)/2,i=e-a,w=t-s;o=i*(n-c)+w*(r-h)>0}return o}function G(t,a,s,e,n,r){let o=0;for(let c=0;c<I;++c)for(let h=0;h<I;++h){let i=h/(I-1),w=c/(I-1);K(t,a,s,e,n+i,r+w)&&++o}return o/(I*I)}function A(t,a,s,e,n,r,o,c){let h=p[t],i=h[0],w=h[1];return i>0&&(a+=o[0],s+=o[1]),w>0&&(e+=o[0],n+=o[1]),c[0]=1-G(a,s,e,n,1+r,0+r),c[1]=G(a,s,e,n,1+r,1+r),c}function Q(t,a,s,e,n){let r=M[0],o=M[1],c=a+s+1;switch(t){case 0:{A(t,1,1,1+c,1+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 1:{A(t,1,0,0+c,0+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 2:{A(t,0,0,1+c,0+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 3:{A(t,1,0,1+c,0+c,a,e,n);break}case 4:{A(t,1,1,0+c,0+c,a,e,r),A(t,1,1,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 5:{A(t,1,1,0+c,0+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 6:{A(t,1,1,1+c,0+c,a,e,n);break}case 7:{A(t,1,1,1+c,0+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 8:{A(t,0,0,1+c,1+c,a,e,r),A(t,1,0,1+c,1+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 9:{A(t,1,0,1+c,1+c,a,e,n),A(t,1,0,1+c,1+c,a,e,n);break}case 10:{A(t,0,0,1+c,1+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 11:{A(t,1,0,1+c,1+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 12:{A(t,1,1,1+c,1+c,a,e,n);break}case 13:{A(t,1,1,1+c,1+c,a,e,r),A(t,1,0,1+c,1+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 14:{A(t,1,1,1+c,1+c,a,e,r),A(t,1,1,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}case 15:{A(t,1,1,1+c,1+c,a,e,r),A(t,1,0,1+c,0+c,a,e,o),n[0]=(r[0]+o[0])/2,n[1]=(r[1]+o[1])/2;break}}return n}function R(t,a,s){let e=new Float32Array(2);for(let n=0,r=t.length;n<r;++n){let o=t[n],c=o.data,h=o.width;for(let i=0;i<h;++i)for(let w=0;w<h;++w){s?J(n,w,i,a,e):Q(n,w,i,a,e);let b=(i*h+w)*2;c[b]=e[0]*255,c[b+1]=e[1]*255}}}function T(t,a,s,e,n,r,o){let c=o.data,h=o.width;for(let i=0,w=s.length;i<w;++i){let b=e[i],g=s[i],k=g.data,m=g.width;for(let U=0;U<n;++U)for(let x=0;x<n;++x){let Z=b[0]*n+t+x,O=((b[1]*n+a+U)*h+Z)*4,L=r?(U*U*m+x*x)*2:(U*m+x)*2;c[O]=k[L],c[O+1]=k[L+1],c[O+2]=0,c[O+3]=255}}}var S=class{static generate(){let a=10*D,s=v.length*5*D,e=new Uint8ClampedArray(a*s*4),n=new F(a,s,e),r=Math.pow(D-1,2)+1,o=W,c=[],h=[];for(let i=3,w=e.length;i<w;i+=4)e[i]=255;for(let i=0;i<16;++i)c.push(new F(r,r,new Uint8ClampedArray(r*r*2),2)),h.push(new F(o,o,new Uint8ClampedArray(o*o*2),2));for(let i=0,w=v.length;i<w;++i)R(c,v[i],!0),T(0,5*D*i,c,z,D,!0,n);for(let i=0,w=N.length;i<w;++i)R(h,N[i],!1),T(5*D,4*W*i,h,p,W,!1,n);return n}};var P=new Map([[y(0,0,0,0),new Float32Array([0,0,0,0])],[y(0,0,0,1),new Float32Array([0,0,0,1])],[y(0,0,1,0),new Float32Array([0,0,1,0])],[y(0,0,1,1),new Float32Array([0,0,1,1])],[y(0,1,0,0),new Float32Array([0,1,0,0])],[y(0,1,0,1),new Float32Array([0,1,0,1])],[y(0,1,1,0),new Float32Array([0,1,1,0])],[y(0,1,1,1),new Float32Array([0,1,1,1])],[y(1,0,0,0),new Float32Array([1,0,0,0])],[y(1,0,0,1),new Float32Array([1,0,0,1])],[y(1,0,1,0),new Float32Array([1,0,1,0])],[y(1,0,1,1),new Float32Array([1,0,1,1])],[y(1,1,0,0),new Float32Array([1,1,0,0])],[y(1,1,0,1),new Float32Array([1,1,0,1])],[y(1,1,1,0),new Float32Array([1,1,1,0])],[y(1,1,1,1),new Float32Array([1,1,1,1])]]);function H(t,a,s){return t+(a-t)*s}function y(t,a,s,e){let n=H(t,a,.75),r=H(s,e,1-.25);return H(n,r,1-.125)}function V(t,a){let s=0;return a[3]===1&&(s+=1),s===1&&a[2]===1&&t[1]!==1&&t[3]!==1&&(s+=1),s}function $(t,a){let s=0;return a[3]===1&&t[1]!==1&&t[3]!==1&&(s+=1),s===1&&a[2]===1&&t[0]!==1&&t[2]!==1&&(s+=1),s}var E=class{static generate(){let o=new Uint8ClampedArray(2178),c=new Uint8ClampedArray(64*16*4);for(let h=0;h<33;++h)for(let i=0;i<66;++i){let w=.03125*i,b=.03125*h;if(P.has(w)&&P.has(b)){let g=P.get(w),k=P.get(b),m=h*66+i;o[m]=127*V(g,k),o[m+33]=127*$(g,k)}}for(let h=0,i=33-16;i<33;++i)for(let w=0;w<64;++w,h+=4)c[h]=o[i*66+w],c[h+3]=255;return new F(64,16,c)}};self.addEventListener(\"message\",t=>{let a=S.generate(),s=E.generate();postMessage({areaImageData:a,searchImageData:s},[a.data.buffer,s.data.buffer]),close()});})();\\n';\n\n// src/textures/smaa/SMAAImageGenerator.js\nfunction generate(useCache = true) {\n const workerURL = URL.createObjectURL(new Blob([worker_default2], {\n type: \"text/javascript\"\n }));\n const worker = new Worker(workerURL);\n URL.revokeObjectURL(workerURL);\n return new Promise((resolve, reject) => {\n worker.addEventListener(\"error\", (event) => reject(event.error));\n worker.addEventListener(\"message\", (event) => {\n const searchImageData = RawImageData.from(event.data.searchImageData);\n const areaImageData = RawImageData.from(event.data.areaImageData);\n const urls = [\n searchImageData.toCanvas().toDataURL(\"image/png\", 1),\n areaImageData.toCanvas().toDataURL(\"image/png\", 1)\n ];\n if (useCache) {\n localStorage.setItem(\"smaa-search\", urls[0]);\n localStorage.setItem(\"smaa-area\", urls[1]);\n }\n resolve(urls);\n });\n worker.postMessage(null);\n });\n}\nvar SMAAImageGenerator = class {\n /**\n * Constructs a new SMAA image generator.\n */\n constructor() {\n this.disableCache = false;\n }\n /**\n * Enables or disables caching via localStorage.\n *\n * @param {Boolean} value - Whether the cache should be enabled.\n */\n setCacheEnabled(value) {\n this.disableCache = !value;\n }\n /**\n * Generates the SMAA data images.\n *\n * @example\n * SMAAImageGenerator.generate().then(([search, area]) => {\n * const smaaEffect = new SMAAEffect(search, area);\n * });\n * @return {Promise<Image[]>} A promise that returns the search image and area image as a pair.\n */\n generate() {\n const useCache = !this.disableCache && window.localStorage !== void 0;\n const cachedURLs = useCache ? [\n localStorage.getItem(\"smaa-search\"),\n localStorage.getItem(\"smaa-area\")\n ] : [null, null];\n const promise = cachedURLs[0] !== null && cachedURLs[1] !== null ? Promise.resolve(cachedURLs) : generate(useCache);\n return promise.then((urls) => {\n return new Promise((resolve, reject) => {\n const searchImage = new Image();\n const areaImage = new Image();\n const manager = new LoadingManager();\n manager.onLoad = () => resolve([searchImage, areaImage]);\n manager.onError = reject;\n searchImage.addEventListener(\"error\", (e) => manager.itemError(\"smaa-search\"));\n areaImage.addEventListener(\"error\", (e) => manager.itemError(\"smaa-area\"));\n searchImage.addEventListener(\"load\", () => manager.itemEnd(\"smaa-search\"));\n areaImage.addEventListener(\"load\", () => manager.itemEnd(\"smaa-area\"));\n manager.itemStart(\"smaa-search\");\n manager.itemStart(\"smaa-area\");\n searchImage.src = urls[0];\n areaImage.src = urls[1];\n });\n });\n }\n};\n\n// src/textures/smaa/SMAASearchImageData.js\nvar edges = /* @__PURE__ */ new Map([\n [bilinear(0, 0, 0, 0), new Float32Array([0, 0, 0, 0])],\n [bilinear(0, 0, 0, 1), new Float32Array([0, 0, 0, 1])],\n [bilinear(0, 0, 1, 0), new Float32Array([0, 0, 1, 0])],\n [bilinear(0, 0, 1, 1), new Float32Array([0, 0, 1, 1])],\n [bilinear(0, 1, 0, 0), new Float32Array([0, 1, 0, 0])],\n [bilinear(0, 1, 0, 1), new Float32Array([0, 1, 0, 1])],\n [bilinear(0, 1, 1, 0), new Float32Array([0, 1, 1, 0])],\n [bilinear(0, 1, 1, 1), new Float32Array([0, 1, 1, 1])],\n [bilinear(1, 0, 0, 0), new Float32Array([1, 0, 0, 0])],\n [bilinear(1, 0, 0, 1), new Float32Array([1, 0, 0, 1])],\n [bilinear(1, 0, 1, 0), new Float32Array([1, 0, 1, 0])],\n [bilinear(1, 0, 1, 1), new Float32Array([1, 0, 1, 1])],\n [bilinear(1, 1, 0, 0), new Float32Array([1, 1, 0, 0])],\n [bilinear(1, 1, 0, 1), new Float32Array([1, 1, 0, 1])],\n [bilinear(1, 1, 1, 0), new Float32Array([1, 1, 1, 0])],\n [bilinear(1, 1, 1, 1), new Float32Array([1, 1, 1, 1])]\n]);\nfunction lerp2(a, b, p) {\n return a + (b - a) * p;\n}\nfunction bilinear(e0, e1, e2, e3) {\n const a = lerp2(e0, e1, 1 - 0.25);\n const b = lerp2(e2, e3, 1 - 0.25);\n return lerp2(a, b, 1 - 0.125);\n}\nfunction deltaLeft(left, top) {\n let d = 0;\n if (top[3] === 1) {\n d += 1;\n }\n if (d === 1 && top[2] === 1 && left[1] !== 1 && left[3] !== 1) {\n d += 1;\n }\n return d;\n}\nfunction deltaRight(left, top) {\n let d = 0;\n if (top[3] === 1 && left[1] !== 1 && left[3] !== 1) {\n d += 1;\n }\n if (d === 1 && top[2] === 1 && left[0] !== 1 && left[2] !== 1) {\n d += 1;\n }\n return d;\n}\nvar SMAASearchImageData = class {\n /**\n * Creates a new search image.\n *\n * @return {RawImageData} The generated image data.\n */\n static generate() {\n const width = 66;\n const height = 33;\n const halfWidth = width / 2;\n const croppedWidth = 64;\n const croppedHeight = 16;\n const data = new Uint8ClampedArray(width * height);\n const croppedData = new Uint8ClampedArray(croppedWidth * croppedHeight * 4);\n for (let y = 0; y < height; ++y) {\n for (let x = 0; x < width; ++x) {\n const s = 0.03125 * x;\n const t = 0.03125 * y;\n if (edges.has(s) && edges.has(t)) {\n const e1 = edges.get(s);\n const e2 = edges.get(t);\n const i = y * width + x;\n data[i] = 127 * deltaLeft(e1, e2);\n data[i + halfWidth] = 127 * deltaRight(e1, e2);\n }\n }\n }\n for (let i = 0, y = height - croppedHeight; y < height; ++y) {\n for (let x = 0; x < croppedWidth; ++x, i += 4) {\n croppedData[i] = data[y * width + x];\n croppedData[i + 3] = 255;\n }\n }\n return new RawImageData(croppedWidth, croppedHeight, croppedData);\n }\n};\n\n// src/textures/NoiseTexture.js\nimport {\n DataTexture as DataTexture2,\n LuminanceFormat,\n RedFormat,\n RGFormat,\n RGBAFormat as RGBAFormat2,\n UnsignedByteType as UnsignedByteType14\n} from \"three\";\nfunction getNoise(size, format, type) {\n const channels = /* @__PURE__ */ new Map([\n [LuminanceFormat, 1],\n [RedFormat, 1],\n [RGFormat, 2],\n [RGBAFormat2, 4]\n ]);\n let data;\n if (!channels.has(format)) {\n console.error(\"Invalid noise texture format\");\n }\n if (type === UnsignedByteType14) {\n data = new Uint8Array(size * channels.get(format));\n for (let i = 0, l = data.length; i < l; ++i) {\n data[i] = Math.random() * 255 + 0.5;\n }\n } else {\n data = new Float32Array(size * channels.get(format));\n for (let i = 0, l = data.length; i < l; ++i) {\n data[i] = Math.random();\n }\n }\n return data;\n}\nvar NoiseTexture = class extends DataTexture2 {\n /**\n * Constructs a new noise texture.\n *\n * The texture format can be either `LuminanceFormat` or `RGBAFormat`. Additionally, the formats `RedFormat` and\n * `RGFormat` can be used in a WebGL 2 context.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n * @param {Number} [format=LuminanceFormat] - The texture format.\n * @param {Number} [type=UnsignedByteType] - The texture type.\n */\n constructor(width, height, format = LuminanceFormat, type = UnsignedByteType14) {\n super(getNoise(width * height, format, type), width, height, format, type);\n this.needsUpdate = true;\n }\n};\n\n// src/effects/glsl/glitch.frag\nvar glitch_default = \"uniform lowp sampler2D perturbationMap;uniform bool active;uniform float columns;uniform float random;uniform vec2 seeds;uniform vec2 distortion;void mainUv(inout vec2 uv){if(active){if(uv.y<distortion.x+columns&&uv.y>distortion.x-columns*random){float sx=clamp(ceil(seeds.x),0.0,1.0);uv.y=sx*(1.0-(uv.y+distortion.y))+(1.0-sx)*distortion.y;}if(uv.x<distortion.y+columns&&uv.x>distortion.y-columns*random){float sy=clamp(ceil(seeds.y),0.0,1.0);uv.x=sy*distortion.x+(1.0-sy)*(1.0-(uv.x+distortion.x));}vec2 normal=texture2D(perturbationMap,uv*random*random).rg;uv+=normal*seeds*(random*0.2);}}\";\n\n// src/effects/GlitchEffect.js\nvar textureTag = \"Glitch.Generated\";\nfunction randomFloat(low, high) {\n return low + Math.random() * (high - low);\n}\nvar GlitchEffect = class extends Effect {\n /**\n * Constructs a new glitch effect.\n *\n * TODO Change ratio to 0.15.\n * @param {Object} [options] - The options.\n * @param {Vector2} [options.chromaticAberrationOffset] - A chromatic aberration offset. If provided, the glitch effect will influence this offset.\n * @param {Vector2} [options.delay] - The minimum and maximum delay between glitch activations in seconds.\n * @param {Vector2} [options.duration] - The minimum and maximum duration of a glitch in seconds.\n * @param {Vector2} [options.strength] - The strength of weak and strong glitches.\n * @param {Texture} [options.perturbationMap] - A perturbation map. If none is provided, a noise texture will be created.\n * @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided.\n * @param {Number} [options.columns=0.05] - The scale of the blocky glitch columns.\n * @param {Number} [options.ratio=0.85] - The threshold for strong glitches.\n */\n constructor({\n chromaticAberrationOffset = null,\n delay = new Vector220(1.5, 3.5),\n duration = new Vector220(0.6, 1),\n strength = new Vector220(0.3, 1),\n columns = 0.05,\n ratio = 0.85,\n perturbationMap = null,\n dtSize = 64\n } = {}) {\n super(\"GlitchEffect\", glitch_default, {\n uniforms: /* @__PURE__ */ new Map([\n [\"perturbationMap\", new Uniform32(null)],\n [\"columns\", new Uniform32(columns)],\n [\"active\", new Uniform32(false)],\n [\"random\", new Uniform32(1)],\n [\"seeds\", new Uniform32(new Vector220())],\n [\"distortion\", new Uniform32(new Vector220())]\n ])\n });\n if (perturbationMap === null) {\n const map = new NoiseTexture(dtSize, dtSize, RGBAFormat3);\n map.name = textureTag;\n this.perturbationMap = map;\n } else {\n this.perturbationMap = perturbationMap;\n }\n this.time = 0;\n this.distortion = this.uniforms.get(\"distortion\").value;\n this.delay = delay;\n this.duration = duration;\n this.breakPoint = new Vector220(\n randomFloat(this.delay.x, this.delay.y),\n randomFloat(this.duration.x, this.duration.y)\n );\n this.strength = strength;\n this.mode = GlitchMode.SPORADIC;\n this.ratio = ratio;\n this.chromaticAberrationOffset = chromaticAberrationOffset;\n }\n /**\n * Random number seeds.\n *\n * @type {Vector2}\n * @private\n */\n get seeds() {\n return this.uniforms.get(\"seeds\").value;\n }\n /**\n * Indicates whether the glitch effect is currently active.\n *\n * @type {Boolean}\n */\n get active() {\n return this.uniforms.get(\"active\").value;\n }\n /**\n * Indicates whether the glitch effect is currently active.\n *\n * @deprecated Use active instead.\n * @return {Boolean} Whether the glitch effect is active.\n */\n isActive() {\n return this.active;\n }\n /**\n * The minimum delay between glitch activations.\n *\n * @type {Number}\n */\n get minDelay() {\n return this.delay.x;\n }\n set minDelay(value) {\n this.delay.x = value;\n }\n /**\n * Returns the minimum delay between glitch activations.\n *\n * @deprecated Use minDelay instead.\n * @return {Number} The minimum delay in seconds.\n */\n getMinDelay() {\n return this.delay.x;\n }\n /**\n * Sets the minimum delay between glitch activations.\n *\n * @deprecated Use minDelay instead.\n * @param {Number} value - The minimum delay in seconds.\n */\n setMinDelay(value) {\n this.delay.x = value;\n }\n /**\n * The maximum delay between glitch activations.\n *\n * @type {Number}\n */\n get maxDelay() {\n return this.delay.y;\n }\n set maxDelay(value) {\n this.delay.y = value;\n }\n /**\n * Returns the maximum delay between glitch activations.\n *\n * @deprecated Use maxDelay instead.\n * @return {Number} The maximum delay in seconds.\n */\n getMaxDelay() {\n return this.delay.y;\n }\n /**\n * Sets the maximum delay between glitch activations.\n *\n * @deprecated Use maxDelay instead.\n * @param {Number} value - The maximum delay in seconds.\n */\n setMaxDelay(value) {\n this.delay.y = value;\n }\n /**\n * The minimum duration of sporadic glitches.\n *\n * @type {Number}\n */\n get minDuration() {\n return this.duration.x;\n }\n set minDuration(value) {\n this.duration.x = value;\n }\n /**\n * Returns the minimum duration of sporadic glitches.\n *\n * @deprecated Use minDuration instead.\n * @return {Number} The minimum duration in seconds.\n */\n getMinDuration() {\n return this.duration.x;\n }\n /**\n * Sets the minimum duration of sporadic glitches.\n *\n * @deprecated Use minDuration instead.\n * @param {Number} value - The minimum duration in seconds.\n */\n setMinDuration(value) {\n this.duration.x = value;\n }\n /**\n * The maximum duration of sporadic glitches.\n *\n * @type {Number}\n */\n get maxDuration() {\n return this.duration.y;\n }\n set maxDuration(value) {\n this.duration.y = value;\n }\n /**\n * Returns the maximum duration of sporadic glitches.\n *\n * @deprecated Use maxDuration instead.\n * @return {Number} The maximum duration in seconds.\n */\n getMaxDuration() {\n return this.duration.y;\n }\n /**\n * Sets the maximum duration of sporadic glitches.\n *\n * @deprecated Use maxDuration instead.\n * @param {Number} value - The maximum duration in seconds.\n */\n setMaxDuration(value) {\n this.duration.y = value;\n }\n /**\n * The strength of weak glitches.\n *\n * @type {Number}\n */\n get minStrength() {\n return this.strength.x;\n }\n set minStrength(value) {\n this.strength.x = value;\n }\n /**\n * Returns the strength of weak glitches.\n *\n * @deprecated Use minStrength instead.\n * @return {Number} The strength.\n */\n getMinStrength() {\n return this.strength.x;\n }\n /**\n * Sets the strength of weak glitches.\n *\n * @deprecated Use minStrength instead.\n * @param {Number} value - The strength.\n */\n setMinStrength(value) {\n this.strength.x = value;\n }\n /**\n * The strength of strong glitches.\n *\n * @type {Number}\n */\n get maxStrength() {\n return this.strength.y;\n }\n set maxStrength(value) {\n this.strength.y = value;\n }\n /**\n * Returns the strength of strong glitches.\n *\n * @deprecated Use maxStrength instead.\n * @return {Number} The strength.\n */\n getMaxStrength() {\n return this.strength.y;\n }\n /**\n * Sets the strength of strong glitches.\n *\n * @deprecated Use maxStrength instead.\n * @param {Number} value - The strength.\n */\n setMaxStrength(value) {\n this.strength.y = value;\n }\n /**\n * Returns the current glitch mode.\n *\n * @deprecated Use mode instead.\n * @return {GlitchMode} The mode.\n */\n getMode() {\n return this.mode;\n }\n /**\n * Sets the current glitch mode.\n *\n * @deprecated Use mode instead.\n * @param {GlitchMode} value - The mode.\n */\n setMode(value) {\n this.mode = value;\n }\n /**\n * Returns the glitch ratio.\n *\n * @deprecated Use ratio instead.\n * @return {Number} The ratio.\n */\n getGlitchRatio() {\n return 1 - this.ratio;\n }\n /**\n * Sets the ratio of weak (0.0) and strong (1.0) glitches.\n *\n * @deprecated Use ratio instead.\n * @param {Number} value - The ratio. Range is [0.0, 1.0].\n */\n setGlitchRatio(value) {\n this.ratio = Math.min(Math.max(1 - value, 0), 1);\n }\n /**\n * The glitch column size.\n *\n * @type {Number}\n */\n get columns() {\n return this.uniforms.get(\"columns\").value;\n }\n set columns(value) {\n this.uniforms.get(\"columns\").value = value;\n }\n /**\n * Returns the glitch column size.\n *\n * @deprecated Use columns instead.\n * @return {Number} The glitch column size.\n */\n getGlitchColumns() {\n return this.columns;\n }\n /**\n * Sets the glitch column size.\n *\n * @deprecated Use columns instead.\n * @param {Number} value - The glitch column size.\n */\n setGlitchColumns(value) {\n this.columns = value;\n }\n /**\n * Returns the chromatic aberration offset.\n *\n * @deprecated Use chromaticAberrationOffset instead.\n * @return {Vector2} The offset.\n */\n getChromaticAberrationOffset() {\n return this.chromaticAberrationOffset;\n }\n /**\n * Sets the chromatic aberration offset.\n *\n * @deprecated Use chromaticAberrationOffset instead.\n * @param {Vector2} value - The offset.\n */\n setChromaticAberrationOffset(value) {\n this.chromaticAberrationOffset = value;\n }\n /**\n * The perturbation map.\n *\n * @type {Texture}\n */\n get perturbationMap() {\n return this.uniforms.get(\"perturbationMap\").value;\n }\n set perturbationMap(value) {\n const currentMap = this.perturbationMap;\n if (currentMap !== null && currentMap.name === textureTag) {\n currentMap.dispose();\n }\n value.minFilter = value.magFilter = NearestFilter6;\n value.wrapS = value.wrapT = RepeatWrapping;\n value.generateMipmaps = false;\n this.uniforms.get(\"perturbationMap\").value = value;\n }\n /**\n * Returns the current perturbation map.\n *\n * @deprecated Use perturbationMap instead.\n * @return {Texture} The current perturbation map.\n */\n getPerturbationMap() {\n return this.perturbationMap;\n }\n /**\n * Replaces the current perturbation map with the given one.\n *\n * The current map will be disposed if it was generated by this effect.\n *\n * @deprecated Use perturbationMap instead.\n * @param {Texture} value - The new perturbation map.\n */\n setPerturbationMap(value) {\n this.perturbationMap = value;\n }\n /**\n * Generates a perturbation map.\n *\n * @deprecated Use NoiseTexture instead.\n * @param {Number} [value=64] - The texture size.\n * @return {DataTexture} The perturbation map.\n */\n generatePerturbationMap(value = 64) {\n const map = new NoiseTexture(value, value, RGBAFormat3);\n map.name = textureTag;\n return map;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n const mode = this.mode;\n const breakPoint = this.breakPoint;\n const offset = this.chromaticAberrationOffset;\n const s = this.strength;\n let time = this.time;\n let active = false;\n let r = 0, a = 0;\n let trigger;\n if (mode !== GlitchMode.DISABLED) {\n if (mode === GlitchMode.SPORADIC) {\n time += deltaTime;\n trigger = time > breakPoint.x;\n if (time >= breakPoint.x + breakPoint.y) {\n breakPoint.set(\n randomFloat(this.delay.x, this.delay.y),\n randomFloat(this.duration.x, this.duration.y)\n );\n time = 0;\n }\n }\n r = Math.random();\n this.uniforms.get(\"random\").value = r;\n if (trigger && r > this.ratio || mode === GlitchMode.CONSTANT_WILD) {\n active = true;\n r *= s.y * 0.03;\n a = randomFloat(-Math.PI, Math.PI);\n this.seeds.set(randomFloat(-s.y, s.y), randomFloat(-s.y, s.y));\n this.distortion.set(randomFloat(0, 1), randomFloat(0, 1));\n } else if (trigger || mode === GlitchMode.CONSTANT_MILD) {\n active = true;\n r *= s.x * 0.03;\n a = randomFloat(-Math.PI, Math.PI);\n this.seeds.set(randomFloat(-s.x, s.x), randomFloat(-s.x, s.x));\n this.distortion.set(randomFloat(0, 1), randomFloat(0, 1));\n }\n this.time = time;\n }\n if (offset !== null) {\n if (active) {\n offset.set(Math.cos(a), Math.sin(a)).multiplyScalar(r);\n } else {\n offset.set(0, 0);\n }\n }\n this.uniforms.get(\"active\").value = active;\n }\n /**\n * Deletes generated resources.\n */\n dispose() {\n const map = this.perturbationMap;\n if (map !== null && map.name === textureTag) {\n map.dispose();\n }\n }\n};\n\n// src/effects/GodRaysEffect.js\nimport {\n BasicDepthPacking as BasicDepthPacking15,\n Color as Color5,\n DepthTexture as DepthTexture2,\n Matrix4 as Matrix42,\n Scene as Scene2,\n Uniform as Uniform33,\n Vector2 as Vector221,\n Vector3 as Vector32,\n WebGLRenderTarget as WebGLRenderTarget17\n} from \"three\";\n\n// src/effects/glsl/god-rays.frag\nvar god_rays_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D map;\\n#else\\nuniform lowp sampler2D map;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=texture2D(map,uv);}\";\n\n// src/effects/GodRaysEffect.js\nvar v = /* @__PURE__ */ new Vector32();\nvar m = /* @__PURE__ */ new Matrix42();\nvar GodRaysEffect = class extends Effect {\n /**\n * Constructs a new god rays effect.\n *\n * @param {Camera} [camera] - The main camera.\n * @param {Mesh|Points} [lightSource] - The light source. Must not write depth and has to be flagged as transparent.\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SCREEN] - The blend function of this effect.\n * @param {Number} [options.samples=60.0] - The number of samples per pixel.\n * @param {Number} [options.density=0.96] - The density of the light rays.\n * @param {Number} [options.decay=0.9] - An illumination decay factor.\n * @param {Number} [options.weight=0.4] - A light ray weight factor.\n * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.\n * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.\n * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n * @param {KernelSize} [options.kernelSize=KernelSize.SMALL] - The blur kernel size. Has no effect if blur is disabled.\n * @param {Boolean} [options.blur=true] - Whether the god rays should be blurred to reduce artifacts.\n */\n constructor(camera, lightSource, {\n blendFunction = BlendFunction.SCREEN,\n samples = 60,\n density = 0.96,\n decay = 0.9,\n weight = 0.4,\n exposure = 0.6,\n clampMax = 1,\n blur = true,\n kernelSize = KernelSize.SMALL,\n resolutionScale = 0.5,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"GodRaysEffect\", god_rays_default, {\n blendFunction,\n attributes: EffectAttribute.DEPTH,\n uniforms: /* @__PURE__ */ new Map([\n [\"map\", new Uniform33(null)]\n ])\n });\n this.camera = camera;\n this._lightSource = lightSource;\n this.lightSource = lightSource;\n this.lightScene = new Scene2();\n this.screenPosition = new Vector221();\n this.renderTargetA = new WebGLRenderTarget17(1, 1, { depthBuffer: false });\n this.renderTargetA.texture.name = \"GodRays.Target.A\";\n this.renderTargetB = this.renderTargetA.clone();\n this.renderTargetB.texture.name = \"GodRays.Target.B\";\n this.uniforms.get(\"map\").value = this.renderTargetB.texture;\n this.renderTargetLight = new WebGLRenderTarget17(1, 1);\n this.renderTargetLight.texture.name = \"GodRays.Light\";\n this.renderTargetLight.depthTexture = new DepthTexture2();\n this.renderPassLight = new RenderPass(this.lightScene, camera);\n this.renderPassLight.clearPass.overrideClearColor = new Color5(0);\n this.clearPass = new ClearPass(true, false, false);\n this.clearPass.overrideClearColor = new Color5(0);\n this.blurPass = new KawaseBlurPass({ kernelSize });\n this.blurPass.enabled = blur;\n this.depthMaskPass = new ShaderPass(new DepthMaskMaterial());\n const depthMaskMaterial = this.depthMaskMaterial;\n depthMaskMaterial.depthBuffer1 = this.renderTargetLight.depthTexture;\n depthMaskMaterial.copyCameraSettings(camera);\n this.godRaysPass = new ShaderPass(new GodRaysMaterial(this.screenPosition));\n const godRaysMaterial = this.godRaysMaterial;\n godRaysMaterial.density = density;\n godRaysMaterial.decay = decay;\n godRaysMaterial.weight = weight;\n godRaysMaterial.exposure = exposure;\n godRaysMaterial.maxIntensity = clampMax;\n godRaysMaterial.samples = samples;\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n }\n set mainCamera(value) {\n this.camera = value;\n this.renderPassLight.mainCamera = value;\n this.depthMaskMaterial.copyCameraSettings(value);\n }\n /**\n * Sets the light source.\n *\n * @type {Mesh|Points}\n */\n get lightSource() {\n return this._lightSource;\n }\n set lightSource(value) {\n this._lightSource = value;\n if (value !== null) {\n value.material.depthWrite = false;\n value.material.transparent = true;\n }\n }\n /**\n * Returns the blur pass that reduces aliasing artifacts and makes the light softer.\n *\n * @deprecated Use blurPass instead.\n * @return {KawaseBlurPass} The blur pass.\n */\n getBlurPass() {\n return this.blurPass;\n }\n /**\n * A texture that contains the intermediate result of this effect.\n *\n * @type {Texture}\n */\n get texture() {\n return this.renderTargetB.texture;\n }\n /**\n * Returns the god rays texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.texture;\n }\n /**\n * The depth mask material.\n *\n * @type {DepthMaskMaterial}\n * @private\n */\n get depthMaskMaterial() {\n return this.depthMaskPass.fullscreenMaterial;\n }\n /**\n * The internal god rays material.\n *\n * @type {GodRaysMaterial}\n */\n get godRaysMaterial() {\n return this.godRaysPass.fullscreenMaterial;\n }\n /**\n * Returns the god rays material.\n *\n * @deprecated Use godRaysMaterial instead.\n * @return {GodRaysMaterial} The material.\n */\n getGodRaysMaterial() {\n return this.godRaysMaterial;\n }\n /**\n * Returns the resolution of this effect.\n *\n * @deprecated Use resolution instead.\n * @return {GodRaysMaterial} The material.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * The current width of the internal render targets.\n *\n * @type {Number}\n * @deprecated Use resolution.width instead.\n */\n get width() {\n return this.resolution.width;\n }\n set width(value) {\n this.resolution.preferredWidth = value;\n }\n /**\n * The current height of the internal render targets.\n *\n * @type {Number}\n * @deprecated Use resolution.height instead.\n */\n get height() {\n return this.resolution.height;\n }\n set height(value) {\n this.resolution.preferredHeight = value;\n }\n /**\n * Indicates whether dithering is enabled.\n *\n * @type {Boolean}\n * @deprecated\n */\n get dithering() {\n return this.godRaysMaterial.dithering;\n }\n set dithering(value) {\n const material = this.godRaysMaterial;\n material.dithering = value;\n material.needsUpdate = true;\n }\n /**\n * Indicates whether the god rays should be blurred to reduce artifacts.\n *\n * @type {Boolean}\n * @deprecated Use blurPass.enabled instead.\n */\n get blur() {\n return this.blurPass.enabled;\n }\n set blur(value) {\n this.blurPass.enabled = value;\n }\n /**\n * The blur kernel size.\n *\n * @type {KernelSize}\n * @deprecated Use blurPass.kernelSize instead.\n */\n get kernelSize() {\n return this.blurPass.kernelSize;\n }\n set kernelSize(value) {\n this.blurPass.kernelSize = value;\n }\n /**\n * Returns the current resolution scale.\n *\n * @return {Number} The resolution scale.\n * @deprecated Use resolution instead.\n */\n getResolutionScale() {\n return this.resolution.scale;\n }\n /**\n * Sets the resolution scale.\n *\n * @param {Number} scale - The new resolution scale.\n * @deprecated Use resolution instead.\n */\n setResolutionScale(scale) {\n this.resolution.scale = scale;\n }\n /**\n * The number of samples per pixel.\n *\n * @type {Number}\n * @deprecated Use godRaysMaterial.samples instead.\n */\n get samples() {\n return this.godRaysMaterial.samples;\n }\n /**\n * A higher sample count improves quality at the cost of performance.\n *\n * @type {Number}\n * @deprecated Use godRaysMaterial.samples instead.\n */\n set samples(value) {\n this.godRaysMaterial.samples = value;\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {Number} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking15) {\n this.depthMaskPass.fullscreenMaterial.depthBuffer0 = depthTexture;\n this.depthMaskPass.fullscreenMaterial.depthPacking0 = depthPacking;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n const lightSource = this.lightSource;\n const parent = lightSource.parent;\n const matrixAutoUpdate = lightSource.matrixAutoUpdate;\n const renderTargetA = this.renderTargetA;\n const renderTargetLight = this.renderTargetLight;\n lightSource.material.depthWrite = true;\n lightSource.matrixAutoUpdate = false;\n lightSource.updateWorldMatrix(true, false);\n if (parent !== null) {\n if (!matrixAutoUpdate) {\n m.copy(lightSource.matrix);\n }\n lightSource.matrix.copy(lightSource.matrixWorld);\n }\n this.lightScene.add(lightSource);\n this.renderPassLight.render(renderer, renderTargetLight);\n this.clearPass.render(renderer, renderTargetA);\n this.depthMaskPass.render(renderer, renderTargetLight, renderTargetA);\n lightSource.material.depthWrite = false;\n lightSource.matrixAutoUpdate = matrixAutoUpdate;\n if (parent !== null) {\n if (!matrixAutoUpdate) {\n lightSource.matrix.copy(m);\n }\n parent.add(lightSource);\n }\n v.setFromMatrixPosition(lightSource.matrixWorld).project(this.camera);\n this.screenPosition.set(\n Math.min(Math.max((v.x + 1) * 0.5, -1), 2),\n Math.min(Math.max((v.y + 1) * 0.5, -1), 2)\n );\n if (this.blurPass.enabled) {\n this.blurPass.render(renderer, renderTargetA, renderTargetA);\n }\n this.godRaysPass.render(renderer, renderTargetA, this.renderTargetB);\n }\n /**\n * Updates the size of internal render targets.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n const w = resolution.width, h = resolution.height;\n this.renderTargetA.setSize(w, h);\n this.renderTargetB.setSize(w, h);\n this.renderTargetLight.setSize(w, h);\n this.blurPass.resolution.copy(resolution);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n this.blurPass.initialize(renderer, alpha, frameBufferType);\n this.renderPassLight.initialize(renderer, alpha, frameBufferType);\n this.depthMaskPass.initialize(renderer, alpha, frameBufferType);\n this.godRaysPass.initialize(renderer, alpha, frameBufferType);\n if (frameBufferType !== void 0) {\n this.renderTargetA.texture.type = frameBufferType;\n this.renderTargetB.texture.type = frameBufferType;\n this.renderTargetLight.texture.type = frameBufferType;\n if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTargetA.texture, SRGBColorSpace);\n setTextureColorSpace(this.renderTargetB.texture, SRGBColorSpace);\n setTextureColorSpace(this.renderTargetLight.texture, SRGBColorSpace);\n }\n }\n }\n};\n\n// src/effects/GridEffect.js\nimport { Uniform as Uniform34, Vector2 as Vector222 } from \"three\";\n\n// src/effects/glsl/grid.frag\nvar grid_default = \"uniform vec2 scale;uniform float lineWidth;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){float grid=0.5-max(abs(mod(uv.x*scale.x,1.0)-0.5),abs(mod(uv.y*scale.y,1.0)-0.5));outputColor=vec4(vec3(smoothstep(0.0,lineWidth,grid)),inputColor.a);}\";\n\n// src/effects/GridEffect.js\nvar GridEffect = class extends Effect {\n /**\n * Constructs a new grid effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.OVERLAY] - The blend function of this effect.\n * @param {Number} [options.scale=1.0] - The scale of the grid pattern.\n * @param {Number} [options.lineWidth=0.0] - The line width of the grid pattern.\n */\n constructor({ blendFunction = BlendFunction.OVERLAY, scale = 1, lineWidth = 0 } = {}) {\n super(\"GridEffect\", grid_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"scale\", new Uniform34(new Vector222())],\n [\"lineWidth\", new Uniform34(lineWidth)]\n ])\n });\n this.resolution = new Vector222();\n this.s = 0;\n this.scale = scale;\n this.l = 0;\n this.lineWidth = lineWidth;\n }\n /**\n * The scale.\n *\n * @type {Number}\n */\n get scale() {\n return this.s;\n }\n set scale(value) {\n this.s = Math.max(value, 1e-6);\n this.setSize(this.resolution.width, this.resolution.height);\n }\n /**\n * Returns the current grid scale.\n *\n * @deprecated Use scale instead.\n * @return {Number} The grid scale.\n */\n getScale() {\n return this.scale;\n }\n /**\n * Sets the grid scale.\n *\n * @deprecated Use scale instead.\n * @param {Number} value - The new grid scale.\n */\n setScale(value) {\n this.scale = value;\n }\n /**\n * The line width.\n *\n * @type {Number}\n */\n get lineWidth() {\n return this.l;\n }\n set lineWidth(value) {\n this.l = value;\n this.setSize(this.resolution.width, this.resolution.height);\n }\n /**\n * Returns the current grid line width.\n *\n * @deprecated Use lineWidth instead.\n * @return {Number} The grid line width.\n */\n getLineWidth() {\n return this.lineWidth;\n }\n /**\n * Sets the grid line width.\n *\n * @deprecated Use lineWidth instead.\n * @param {Number} value - The new grid line width.\n */\n setLineWidth(value) {\n this.lineWidth = value;\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.resolution.set(width, height);\n const aspect = width / height;\n const scale = this.scale * (height * 0.125);\n this.uniforms.get(\"scale\").value.set(aspect * scale, scale);\n this.uniforms.get(\"lineWidth\").value = scale / height + this.lineWidth;\n }\n};\n\n// src/effects/HueSaturationEffect.js\nimport { Uniform as Uniform35, Vector3 as Vector33 } from \"three\";\n\n// src/effects/glsl/hue-saturation.frag\nvar hue_saturation_default = \"uniform vec3 hue;uniform float saturation;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 color=vec3(dot(inputColor.rgb,hue.xyz),dot(inputColor.rgb,hue.zxy),dot(inputColor.rgb,hue.yzx));float average=(color.r+color.g+color.b)/3.0;vec3 diff=average-color;if(saturation>0.0){color+=diff*(1.0-1.0/(1.001-saturation));}else{color+=diff*-saturation;}outputColor=vec4(min(color,1.0),inputColor.a);}\";\n\n// src/effects/HueSaturationEffect.js\nvar HueSaturationEffect = class extends Effect {\n /**\n * Constructs a new hue/saturation effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n * @param {Number} [options.hue=0.0] - The hue in radians.\n * @param {Number} [options.saturation=0.0] - The saturation factor, ranging from -1 to 1, where 0 means no change.\n */\n constructor({ blendFunction = BlendFunction.SRC, hue = 0, saturation = 0 } = {}) {\n super(\"HueSaturationEffect\", hue_saturation_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"hue\", new Uniform35(new Vector33())],\n [\"saturation\", new Uniform35(saturation)]\n ])\n });\n this.hue = hue;\n }\n /**\n * The saturation.\n *\n * @type {Number}\n */\n get saturation() {\n return this.uniforms.get(\"saturation\").value;\n }\n set saturation(value) {\n this.uniforms.get(\"saturation\").value = value;\n }\n /**\n * Returns the saturation.\n *\n * @deprecated Use saturation instead.\n * @return {Number} The saturation.\n */\n getSaturation() {\n return this.saturation;\n }\n /**\n * Sets the saturation.\n *\n * @deprecated Use saturation instead.\n * @param {Number} value - The saturation.\n */\n setSaturation(value) {\n this.saturation = value;\n }\n /**\n * The hue.\n *\n * @type {Number}\n */\n get hue() {\n const hue = this.uniforms.get(\"hue\").value;\n return Math.acos((hue.x * 3 - 1) / 2);\n }\n set hue(value) {\n const s = Math.sin(value), c2 = Math.cos(value);\n this.uniforms.get(\"hue\").value.set(\n (2 * c2 + 1) / 3,\n (-Math.sqrt(3) * s - c2 + 1) / 3,\n (Math.sqrt(3) * s - c2 + 1) / 3\n );\n }\n /**\n * Returns the hue.\n *\n * @deprecated Use hue instead.\n * @return {Number} The hue in radians.\n */\n getHue() {\n return this.hue;\n }\n /**\n * Sets the hue.\n *\n * @deprecated Use hue instead.\n * @param {Number} value - The hue in radians.\n */\n setHue(value) {\n this.hue = value;\n }\n};\n\n// src/effects/LensDistortionEffect.js\nimport { Uniform as Uniform36, Vector2 as Vector223 } from \"three\";\n\n// src/effects/glsl/lens-distortion.frag\nvar lens_distortion_default = \"uniform vec2 distortion;uniform vec2 principalPoint;uniform vec2 focalLength;uniform float skew;float mask(const in vec2 uv){return float(uv.s>=0.0&&uv.s<=1.0&&uv.t>=0.0&&uv.t<=1.0);}void mainUv(inout vec2 uv){vec2 xn=2.0*(uv.st-0.5);vec3 xDistorted=vec3((1.0+distortion*dot(xn,xn))*xn,1.0);mat3 kk=mat3(vec3(focalLength.x,0.0,0.0),vec3(skew*focalLength.x,focalLength.y,0.0),vec3(principalPoint.x,principalPoint.y,1.0));uv=(kk*xDistorted).xy*0.5+0.5;}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=mask(uv)*inputColor;}\";\n\n// src/effects/LensDistortionEffect.js\nvar LensDistortionEffect = class extends Effect {\n /**\n * Constructs a new lens distortion effect.\n *\n * @param {Object} [options] - The options.\n * @param {Vector2} [options.distortion] - The distortion value.\n * @param {Vector2} [options.principalPoint] - The center point.\n * @param {Vector2} [options.focalLength] - The focal length.\n * @param {Number} [options.skew=0] - The skew value.\n */\n constructor({\n distortion = new Vector223(0, 0),\n principalPoint = new Vector223(0, 0),\n focalLength = new Vector223(1, 1),\n skew = 0\n } = {}) {\n super(\"LensDistortionEffect\", lens_distortion_default, {\n uniforms: /* @__PURE__ */ new Map([\n [\"distortion\", new Uniform36(distortion)],\n [\"principalPoint\", new Uniform36(principalPoint)],\n [\"focalLength\", new Uniform36(focalLength)],\n [\"skew\", new Uniform36(skew)]\n ])\n });\n }\n /**\n * The radial distortion coefficients. Default is (0, 0).\n *\n * @type {Vector2}\n */\n get distortion() {\n return this.uniforms.get(\"distortion\").value;\n }\n set distortion(value) {\n this.uniforms.get(\"distortion\").value = value;\n }\n /**\n * The principal point. Default is (0, 0).\n *\n * @type {Vector2}\n */\n get principalPoint() {\n return this.uniforms.get(\"principalPoint\").value;\n }\n set principalPoint(value) {\n this.uniforms.get(\"principalPoint\").value = value;\n }\n /**\n * The focal length. Default is (1, 1).\n *\n * @type {Vector2}\n */\n get focalLength() {\n return this.uniforms.get(\"focalLength\").value;\n }\n set focalLength(value) {\n this.uniforms.get(\"focalLength\").value = value;\n }\n /**\n * The skew factor in radians.\n *\n * @type {Number}\n */\n get skew() {\n return this.uniforms.get(\"skew\").value;\n }\n set skew(value) {\n this.uniforms.get(\"skew\").value = value;\n }\n};\n\n// src/effects/LUT1DEffect.js\nimport { FloatType as FloatType5, HalfFloatType, Uniform as Uniform37 } from \"three\";\n\n// src/effects/glsl/lut-1d.frag\nvar lut_1d_default = \"#ifdef LUT_PRECISION_HIGH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D lut;\\n#else\\nuniform mediump sampler2D lut;\\n#endif\\n#else\\nuniform lowp sampler2D lut;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){outputColor=vec4(texture2D(lut,vec2(inputColor.r,0.5)).r,texture2D(lut,vec2(inputColor.g,0.5)).r,texture2D(lut,vec2(inputColor.b,0.5)).r,inputColor.a);}\";\n\n// src/effects/LUT1DEffect.js\nvar LUT1DEffect = class extends Effect {\n /**\n * Constructs a new color grading effect.\n *\n * @param {Texture} lut - The lookup texture.\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n */\n constructor(lut, { blendFunction = BlendFunction.SRC } = {}) {\n super(\"LUT1DEffect\", lut_1d_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([[\"lut\", new Uniform37(null)]])\n });\n this.lut = lut;\n }\n /**\n * The LUT.\n *\n * @type {Texture}\n */\n get lut() {\n return this.uniforms.get(\"lut\").value;\n }\n set lut(value) {\n this.uniforms.get(\"lut\").value = value;\n if (value !== null && (value.type === FloatType5 || value.type === HalfFloatType)) {\n this.defines.set(\"LUT_PRECISION_HIGH\", \"1\");\n }\n }\n};\n\n// src/effects/LUT3DEffect.js\nimport {\n Data3DTexture as Data3DTexture2,\n FloatType as FloatType6,\n HalfFloatType as HalfFloatType2,\n LinearFilter as LinearFilter4,\n NearestFilter as NearestFilter7,\n sRGBEncoding as sRGBEncoding2,\n Uniform as Uniform38,\n Vector3 as Vector34\n} from \"three\";\n\n// src/effects/glsl/lut-3d.frag\nvar lut_3d_default = \"uniform vec3 scale;uniform vec3 offset;\\n#ifdef CUSTOM_INPUT_DOMAIN\\nuniform vec3 domainMin;uniform vec3 domainMax;\\n#endif\\n#ifdef LUT_3D\\n#ifdef LUT_PRECISION_HIGH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler3D lut;\\n#else\\nuniform mediump sampler3D lut;\\n#endif\\n#else\\nuniform lowp sampler3D lut;\\n#endif\\nvec4 applyLUT(const in vec3 rgb){\\n#ifdef TETRAHEDRAL_INTERPOLATION\\nvec3 p=floor(rgb);vec3 f=rgb-p;vec3 v1=(p+0.5)*LUT_TEXEL_WIDTH;vec3 v4=(p+1.5)*LUT_TEXEL_WIDTH;vec3 v2,v3;vec3 frac;if(f.r>=f.g){if(f.g>f.b){frac=f.rgb;v2=vec3(v4.x,v1.y,v1.z);v3=vec3(v4.x,v4.y,v1.z);}else if(f.r>=f.b){frac=f.rbg;v2=vec3(v4.x,v1.y,v1.z);v3=vec3(v4.x,v1.y,v4.z);}else{frac=f.brg;v2=vec3(v1.x,v1.y,v4.z);v3=vec3(v4.x,v1.y,v4.z);}}else{if(f.b>f.g){frac=f.bgr;v2=vec3(v1.x,v1.y,v4.z);v3=vec3(v1.x,v4.y,v4.z);}else if(f.r>=f.b){frac=f.grb;v2=vec3(v1.x,v4.y,v1.z);v3=vec3(v4.x,v4.y,v1.z);}else{frac=f.gbr;v2=vec3(v1.x,v4.y,v1.z);v3=vec3(v1.x,v4.y,v4.z);}}vec4 n1=texture(lut,v1);vec4 n2=texture(lut,v2);vec4 n3=texture(lut,v3);vec4 n4=texture(lut,v4);vec4 weights=vec4(1.0-frac.x,frac.x-frac.y,frac.y-frac.z,frac.z);vec4 result=weights*mat4(vec4(n1.r,n2.r,n3.r,n4.r),vec4(n1.g,n2.g,n3.g,n4.g),vec4(n1.b,n2.b,n3.b,n4.b),vec4(1.0));return vec4(result.rgb,1.0);\\n#else\\nreturn texture(lut,rgb);\\n#endif\\n}\\n#else\\n#ifdef LUT_PRECISION_HIGH\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D lut;\\n#else\\nuniform mediump sampler2D lut;\\n#endif\\n#else\\nuniform lowp sampler2D lut;\\n#endif\\nvec4 applyLUT(const in vec3 rgb){float slice=rgb.b*LUT_SIZE;float slice0=floor(slice);float interp=slice-slice0;float centeredInterp=interp-0.5;float slice1=slice0+sign(centeredInterp);\\n#ifdef LUT_STRIP_HORIZONTAL\\nfloat xOffset=clamp(rgb.r*LUT_TEXEL_HEIGHT,LUT_TEXEL_WIDTH*0.5,LUT_TEXEL_HEIGHT-LUT_TEXEL_WIDTH*0.5);vec2 uv0=vec2(slice0*LUT_TEXEL_HEIGHT+xOffset,rgb.g);vec2 uv1=vec2(slice1*LUT_TEXEL_HEIGHT+xOffset,rgb.g);\\n#else\\nfloat yOffset=clamp(rgb.g*LUT_TEXEL_WIDTH,LUT_TEXEL_HEIGHT*0.5,LUT_TEXEL_WIDTH-LUT_TEXEL_HEIGHT*0.5);vec2 uv0=vec2(rgb.r,slice0*LUT_TEXEL_WIDTH+yOffset);vec2 uv1=vec2(rgb.r,slice1*LUT_TEXEL_WIDTH+yOffset);\\n#endif\\nvec4 sample0=texture2D(lut,uv0);vec4 sample1=texture2D(lut,uv1);return mix(sample0,sample1,abs(centeredInterp));}\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 c=inputColor.rgb;\\n#ifdef CUSTOM_INPUT_DOMAIN\\nif(c.r>=domainMin.r&&c.g>=domainMin.g&&c.b>=domainMin.b&&c.r<=domainMax.r&&c.g<=domainMax.g&&c.b<=domainMax.b){c=applyLUT(scale*c+offset).rgb;}else{c=inputColor.rgb;}\\n#else\\n#if !defined(LUT_3D) || defined(TETRAHEDRAL_INTERPOLATION)\\nc=clamp(c,0.0,1.0);\\n#endif\\nc=applyLUT(scale*c+offset).rgb;\\n#endif\\noutputColor=vec4(c,inputColor.a);}\";\n\n// src/effects/LUT3DEffect.js\nvar LUT3DEffect = class extends Effect {\n /**\n * Constructs a new color grading effect.\n *\n * @param {Texture} lut - The lookup texture.\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n * @param {Boolean} [options.tetrahedralInterpolation=false] - Enables or disables tetrahedral interpolation.\n * @param {TextureEncoding} [options.inputEncoding=sRGBEncoding] - Deprecated.\n * @param {ColorSpace} [options.inputColorSpace=SRGBColorSpace] - The input color space.\n */\n constructor(lut, {\n blendFunction = BlendFunction.SRC,\n tetrahedralInterpolation = false,\n inputEncoding = sRGBEncoding2,\n inputColorSpace\n } = {}) {\n super(\"LUT3DEffect\", lut_3d_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"lut\", new Uniform38(null)],\n [\"scale\", new Uniform38(new Vector34())],\n [\"offset\", new Uniform38(new Vector34())],\n [\"domainMin\", new Uniform38(null)],\n [\"domainMax\", new Uniform38(null)]\n ])\n });\n this.tetrahedralInterpolation = tetrahedralInterpolation;\n this.inputColorSpace = inputColorSpace || encodingToColorSpace.get(inputEncoding);\n this.lut = lut;\n }\n /**\n * The input encoding. Default is `sRGBEncoding`.\n *\n * Set this to `LinearEncoding` if your LUT expects linear color input.\n *\n * @deprecated Use inputColorSpace instead.\n * @type {TextureEncoding}\n */\n get inputEncoding() {\n return this.inputColorSpace;\n }\n set inputEncoding(value) {\n this.inputColorSpace = value;\n }\n /**\n * Returns the input encoding.\n *\n * @deprecated Use inputColorSpace instead.\n * @return {TextureEncoding} The encoding.\n */\n getInputEncoding() {\n return this.inputColorSpace;\n }\n /**\n * Sets the input encoding.\n *\n * @deprecated Use inputColorSpace instead.\n * @param {TextureEncoding} value - The encoding.\n */\n setInputEncoding(value) {\n this.inputColorSpace = value;\n }\n /**\n * Returns the output encoding.\n *\n * @deprecated Use outputColorSpace instead.\n * @return {TextureEncoding} The encoding.\n */\n getOutputEncoding() {\n return this.outputColorSpace;\n }\n /**\n * The LUT.\n *\n * @type {Texture}\n */\n get lut() {\n return this.uniforms.get(\"lut\").value;\n }\n set lut(value) {\n const defines = this.defines;\n const uniforms = this.uniforms;\n if (this.lut !== value) {\n uniforms.get(\"lut\").value = value;\n if (value !== null) {\n const image = value.image;\n const tetrahedralInterpolation = this.tetrahedralInterpolation;\n defines.clear();\n defines.set(\"LUT_SIZE\", Math.min(image.width, image.height).toFixed(16));\n defines.set(\"LUT_TEXEL_WIDTH\", (1 / image.width).toFixed(16));\n defines.set(\"LUT_TEXEL_HEIGHT\", (1 / image.height).toFixed(16));\n uniforms.get(\"domainMin\").value = null;\n uniforms.get(\"domainMax\").value = null;\n if (value.type === FloatType6 || value.type === HalfFloatType2) {\n defines.set(\"LUT_PRECISION_HIGH\", \"1\");\n }\n if (image.width > image.height) {\n defines.set(\"LUT_STRIP_HORIZONTAL\", \"1\");\n } else if (value instanceof Data3DTexture2) {\n defines.set(\"LUT_3D\", \"1\");\n }\n if (value instanceof LookupTexture) {\n const min = value.domainMin;\n const max = value.domainMax;\n if (min.x !== 0 || min.y !== 0 || min.z !== 0 || max.x !== 1 || max.y !== 1 || max.z !== 1) {\n defines.set(\"CUSTOM_INPUT_DOMAIN\", \"1\");\n uniforms.get(\"domainMin\").value = min.clone();\n uniforms.get(\"domainMax\").value = max.clone();\n }\n }\n this.tetrahedralInterpolation = tetrahedralInterpolation;\n }\n }\n }\n /**\n * Returns the current LUT.\n *\n * @deprecated Use lut instead.\n * @return {Texture} The LUT.\n */\n getLUT() {\n return this.lut;\n }\n /**\n * Sets the LUT.\n *\n * @deprecated Use lut instead.\n * @param {Texture} value - The LUT.\n */\n setLUT(value) {\n this.lut = value;\n }\n /**\n * Updates the scale and offset for the LUT sampling coordinates.\n *\n * @private\n */\n updateScaleOffset() {\n const lut = this.lut;\n if (lut !== null) {\n const size = Math.min(lut.image.width, lut.image.height);\n const scale = this.uniforms.get(\"scale\").value;\n const offset = this.uniforms.get(\"offset\").value;\n if (this.tetrahedralInterpolation && lut instanceof Data3DTexture2) {\n if (this.defines.has(\"CUSTOM_INPUT_DOMAIN\")) {\n const domainScale = lut.domainMax.clone().sub(lut.domainMin);\n scale.setScalar(size - 1).divide(domainScale);\n offset.copy(lut.domainMin).negate().multiply(scale);\n } else {\n scale.setScalar(size - 1);\n offset.setScalar(0);\n }\n } else {\n if (this.defines.has(\"CUSTOM_INPUT_DOMAIN\")) {\n const domainScale = lut.domainMax.clone().sub(lut.domainMin).multiplyScalar(size);\n scale.setScalar(size - 1).divide(domainScale);\n offset.copy(lut.domainMin).negate().multiply(scale).addScalar(1 / (2 * size));\n } else {\n scale.setScalar((size - 1) / size);\n offset.setScalar(1 / (2 * size));\n }\n }\n }\n }\n /**\n * Configures parameters for tetrahedral interpolation.\n *\n * @private\n */\n configureTetrahedralInterpolation() {\n const lut = this.lut;\n if (lut !== null) {\n lut.minFilter = LinearFilter4;\n lut.magFilter = LinearFilter4;\n if (this.tetrahedralInterpolation) {\n if (lut instanceof Data3DTexture2) {\n lut.minFilter = NearestFilter7;\n lut.magFilter = NearestFilter7;\n } else {\n console.warn(\"Tetrahedral interpolation requires a 3D texture\");\n }\n }\n if (lut.source === void 0) {\n lut.needsUpdate = true;\n }\n }\n }\n /**\n * Indicates whether tetrahedral interpolation is enabled. Requires a 3D LUT, disabled by default.\n *\n * Tetrahedral interpolation produces highly accurate results but is slower than hardware interpolation.\n *\n * @type {Boolean}\n */\n get tetrahedralInterpolation() {\n return this.defines.has(\"TETRAHEDRAL_INTERPOLATION\");\n }\n set tetrahedralInterpolation(value) {\n if (value) {\n this.defines.set(\"TETRAHEDRAL_INTERPOLATION\", \"1\");\n } else {\n this.defines.delete(\"TETRAHEDRAL_INTERPOLATION\");\n }\n this.configureTetrahedralInterpolation();\n this.updateScaleOffset();\n this.setChanged();\n }\n /**\n * Enables or disables tetrahedral interpolation.\n *\n * @deprecated Use tetrahedralInterpolation instead.\n * @param {Boolean} value - Whether tetrahedral interpolation should be enabled.\n */\n setTetrahedralInterpolationEnabled(value) {\n this.tetrahedralInterpolation = value;\n }\n};\n\n// src/effects/glsl/noise.frag\nvar noise_default = \"void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 noise=vec3(rand(uv*time));\\n#ifdef PREMULTIPLY\\noutputColor=vec4(min(inputColor.rgb*noise,vec3(1.0)),inputColor.a);\\n#else\\noutputColor=vec4(noise,inputColor.a);\\n#endif\\n}\";\n\n// src/effects/NoiseEffect.js\nvar NoiseEffect = class extends Effect {\n /**\n * Constructs a new noise effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SCREEN] - The blend function of this effect.\n * @param {Boolean} [options.premultiply=false] - Whether the noise should be multiplied with the input colors prior to blending.\n */\n constructor({ blendFunction = BlendFunction.SCREEN, premultiply = false } = {}) {\n super(\"NoiseEffect\", noise_default, { blendFunction });\n this.premultiply = premultiply;\n }\n /**\n * Indicates whether noise will be multiplied with the input colors prior to blending.\n *\n * @type {Boolean}\n */\n get premultiply() {\n return this.defines.has(\"PREMULTIPLY\");\n }\n set premultiply(value) {\n if (this.premultiply !== value) {\n if (value) {\n this.defines.set(\"PREMULTIPLY\", \"1\");\n } else {\n this.defines.delete(\"PREMULTIPLY\");\n }\n this.setChanged();\n }\n }\n /**\n * Indicates whether noise will be multiplied with the input colors prior to blending.\n *\n * @deprecated Use premultiply instead.\n * @return {Boolean} Whether noise is premultiplied.\n */\n isPremultiplied() {\n return this.premultiply;\n }\n /**\n * Controls whether noise should be multiplied with the input colors prior to blending.\n *\n * @deprecated Use premultiply instead.\n * @param {Boolean} value - Whether noise should be premultiplied.\n */\n setPremultiplied(value) {\n this.premultiply = value;\n }\n};\n\n// src/effects/OutlineEffect.js\nimport { Color as Color6, RepeatWrapping as RepeatWrapping2, Uniform as Uniform39, UnsignedByteType as UnsignedByteType15, WebGLRenderTarget as WebGLRenderTarget18 } from \"three\";\n\n// src/effects/glsl/outline.frag\nvar outline_default3 = \"uniform lowp sampler2D edgeTexture;uniform lowp sampler2D maskTexture;uniform vec3 visibleEdgeColor;uniform vec3 hiddenEdgeColor;uniform float pulse;uniform float edgeStrength;\\n#ifdef USE_PATTERN\\nuniform lowp sampler2D patternTexture;varying vec2 vUvPattern;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec2 edge=texture2D(edgeTexture,uv).rg;vec2 mask=texture2D(maskTexture,uv).rg;\\n#ifndef X_RAY\\nedge.y=0.0;\\n#endif\\nedge*=(edgeStrength*mask.x*pulse);vec3 color=edge.x*visibleEdgeColor+edge.y*hiddenEdgeColor;float visibilityFactor=0.0;\\n#ifdef USE_PATTERN\\nvec4 patternColor=texture2D(patternTexture,vUvPattern);\\n#ifdef X_RAY\\nfloat hiddenFactor=0.5;\\n#else\\nfloat hiddenFactor=0.0;\\n#endif\\nvisibilityFactor=(1.0-mask.y>0.0)?1.0:hiddenFactor;visibilityFactor*=(1.0-mask.x)*patternColor.a;color+=visibilityFactor*patternColor.rgb;\\n#endif\\nfloat alpha=max(max(edge.x,edge.y),visibilityFactor);\\n#ifdef ALPHA\\noutputColor=vec4(color,alpha);\\n#else\\noutputColor=vec4(color,max(alpha,inputColor.a));\\n#endif\\n}\";\n\n// src/effects/glsl/outline.vert\nvar outline_default4 = \"uniform float patternScale;varying vec2 vUvPattern;void mainSupport(const in vec2 uv){vUvPattern=uv*vec2(aspect,1.0)*patternScale;}\";\n\n// src/effects/OutlineEffect.js\nvar OutlineEffect = class extends Effect {\n /**\n * Constructs a new outline effect.\n *\n * @param {Scene} scene - The main scene.\n * @param {Camera} camera - The main camera.\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SCREEN] - The blend function. Use `BlendFunction.ALPHA` for dark outlines.\n * @param {Texture} [options.patternTexture=null] - A pattern texture.\n * @param {Number} [options.patternScale=1.0] - The pattern scale.\n * @param {Number} [options.edgeStrength=1.0] - The edge strength.\n * @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect.\n * @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges.\n * @param {Number} [options.hiddenEdgeColor=0x22090a] - The color of hidden edges.\n * @param {KernelSize} [options.kernelSize=KernelSize.VERY_SMALL] - The blur kernel size.\n * @param {Boolean} [options.blur=false] - Whether the outline should be blurred.\n * @param {Boolean} [options.xRay=true] - Whether occluded parts of selected objects should be visible.\n * @param {Number} [options.multisampling=0] - The number of samples used for multisample antialiasing. Requires WebGL 2.\n * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n */\n constructor(scene, camera, {\n blendFunction = BlendFunction.SCREEN,\n patternTexture = null,\n patternScale = 1,\n edgeStrength = 1,\n pulseSpeed = 0,\n visibleEdgeColor = 16777215,\n hiddenEdgeColor = 2230538,\n kernelSize = KernelSize.VERY_SMALL,\n blur = false,\n xRay = true,\n multisampling = 0,\n resolutionScale = 0.5,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"OutlineEffect\", outline_default3, {\n uniforms: /* @__PURE__ */ new Map([\n [\"maskTexture\", new Uniform39(null)],\n [\"edgeTexture\", new Uniform39(null)],\n [\"edgeStrength\", new Uniform39(edgeStrength)],\n [\"visibleEdgeColor\", new Uniform39(new Color6(visibleEdgeColor))],\n [\"hiddenEdgeColor\", new Uniform39(new Color6(hiddenEdgeColor))],\n [\"pulse\", new Uniform39(1)],\n [\"patternScale\", new Uniform39(patternScale)],\n [\"patternTexture\", new Uniform39(null)]\n ])\n });\n this.blendMode.addEventListener(\"change\", (event) => {\n if (this.blendMode.blendFunction === BlendFunction.ALPHA) {\n this.defines.set(\"ALPHA\", \"1\");\n } else {\n this.defines.delete(\"ALPHA\");\n }\n this.setChanged();\n });\n this.blendMode.blendFunction = blendFunction;\n this.patternTexture = patternTexture;\n this.xRay = xRay;\n this.scene = scene;\n this.camera = camera;\n this.renderTargetMask = new WebGLRenderTarget18(1, 1);\n this.renderTargetMask.samples = multisampling;\n this.renderTargetMask.texture.name = \"Outline.Mask\";\n this.uniforms.get(\"maskTexture\").value = this.renderTargetMask.texture;\n this.renderTargetOutline = new WebGLRenderTarget18(1, 1, { depthBuffer: false });\n this.renderTargetOutline.texture.name = \"Outline.Edges\";\n this.uniforms.get(\"edgeTexture\").value = this.renderTargetOutline.texture;\n this.clearPass = new ClearPass();\n this.clearPass.overrideClearColor = new Color6(0);\n this.clearPass.overrideClearAlpha = 1;\n this.depthPass = new DepthPass(scene, camera);\n this.maskPass = new RenderPass(scene, camera, new DepthComparisonMaterial(this.depthPass.texture, camera));\n const clearPass = this.maskPass.clearPass;\n clearPass.overrideClearColor = new Color6(16777215);\n clearPass.overrideClearAlpha = 1;\n this.blurPass = new KawaseBlurPass({ resolutionScale, resolutionX, resolutionY, kernelSize });\n this.blurPass.enabled = blur;\n const resolution = this.blurPass.resolution;\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n this.outlinePass = new ShaderPass(new OutlineMaterial());\n const outlineMaterial = this.outlinePass.fullscreenMaterial;\n outlineMaterial.inputBuffer = this.renderTargetMask.texture;\n this.time = 0;\n this.forceUpdate = true;\n this.selection = new Selection();\n this.selection.layer = 10;\n this.pulseSpeed = pulseSpeed;\n }\n set mainScene(value) {\n this.scene = value;\n this.depthPass.mainScene = value;\n this.maskPass.mainScene = value;\n }\n set mainCamera(value) {\n this.camera = value;\n this.depthPass.mainCamera = value;\n this.maskPass.mainCamera = value;\n this.maskPass.overrideMaterial.copyCameraSettings(value);\n }\n /**\n * The resolution of this effect.\n *\n * @type {Resolution}\n */\n get resolution() {\n return this.blurPass.resolution;\n }\n /**\n * Returns the resolution.\n *\n * @return {Resizer} The resolution.\n */\n getResolution() {\n return this.blurPass.getResolution();\n }\n /**\n * The amount of MSAA samples.\n *\n * Requires WebGL 2. Set to zero to disable multisampling.\n *\n * @experimental Requires three >= r138.\n * @type {Number}\n */\n get multisampling() {\n return this.renderTargetMask.samples;\n }\n set multisampling(value) {\n this.renderTargetMask.samples = value;\n this.renderTargetMask.dispose();\n }\n /**\n * The pattern scale.\n *\n * @type {Number}\n */\n get patternScale() {\n return this.uniforms.get(\"patternScale\").value;\n }\n set patternScale(value) {\n this.uniforms.get(\"patternScale\").value = value;\n }\n /**\n * The edge strength.\n *\n * @type {Number}\n */\n get edgeStrength() {\n return this.uniforms.get(\"edgeStrength\").value;\n }\n set edgeStrength(value) {\n this.uniforms.get(\"edgeStrength\").value = value;\n }\n /**\n * The visible edge color.\n *\n * @type {Color}\n */\n get visibleEdgeColor() {\n return this.uniforms.get(\"visibleEdgeColor\").value;\n }\n set visibleEdgeColor(value) {\n this.uniforms.get(\"visibleEdgeColor\").value = value;\n }\n /**\n * The hidden edge color.\n *\n * @type {Color}\n */\n get hiddenEdgeColor() {\n return this.uniforms.get(\"hiddenEdgeColor\").value;\n }\n set hiddenEdgeColor(value) {\n this.uniforms.get(\"hiddenEdgeColor\").value = value;\n }\n /**\n * Returns the blur pass.\n *\n * @deprecated Use blurPass instead.\n * @return {KawaseBlurPass} The blur pass.\n */\n getBlurPass() {\n return this.blurPass;\n }\n /**\n * Returns the selection.\n *\n * @deprecated Use selection instead.\n * @return {Selection} The selection.\n */\n getSelection() {\n return this.selection;\n }\n /**\n * Returns the pulse speed.\n *\n * @deprecated Use pulseSpeed instead.\n * @return {Number} The speed.\n */\n getPulseSpeed() {\n return this.pulseSpeed;\n }\n /**\n * Sets the pulse speed. Set to zero to disable.\n *\n * @deprecated Use pulseSpeed instead.\n * @param {Number} value - The speed.\n */\n setPulseSpeed(value) {\n this.pulseSpeed = value;\n }\n /**\n * The current width of the internal render targets.\n *\n * @type {Number}\n * @deprecated Use resolution.width instead.\n */\n get width() {\n return this.resolution.width;\n }\n set width(value) {\n this.resolution.preferredWidth = value;\n }\n /**\n * The current height of the internal render targets.\n *\n * @type {Number}\n * @deprecated Use resolution.height instead.\n */\n get height() {\n return this.resolution.height;\n }\n set height(value) {\n this.resolution.preferredHeight = value;\n }\n /**\n * The selection layer.\n *\n * @type {Number}\n * @deprecated Use selection.layer instead.\n */\n get selectionLayer() {\n return this.selection.layer;\n }\n set selectionLayer(value) {\n this.selection.layer = value;\n }\n /**\n * Indicates whether dithering is enabled.\n *\n * @type {Boolean}\n * @deprecated\n */\n get dithering() {\n return this.blurPass.dithering;\n }\n set dithering(value) {\n this.blurPass.dithering = value;\n }\n /**\n * The blur kernel size.\n *\n * @type {KernelSize}\n * @deprecated Use blurPass.kernelSize instead.\n */\n get kernelSize() {\n return this.blurPass.kernelSize;\n }\n set kernelSize(value) {\n this.blurPass.kernelSize = value;\n }\n /**\n * Indicates whether the outlines should be blurred.\n *\n * @type {Boolean}\n * @deprecated Use blurPass.enabled instead.\n */\n get blur() {\n return this.blurPass.enabled;\n }\n set blur(value) {\n this.blurPass.enabled = value;\n }\n /**\n * Indicates whether X-ray mode is enabled.\n *\n * @type {Boolean}\n */\n get xRay() {\n return this.defines.has(\"X_RAY\");\n }\n set xRay(value) {\n if (this.xRay !== value) {\n if (value) {\n this.defines.set(\"X_RAY\", \"1\");\n } else {\n this.defines.delete(\"X_RAY\");\n }\n this.setChanged();\n }\n }\n /**\n * Indicates whether X-ray mode is enabled.\n *\n * @deprecated Use xRay instead.\n * @return {Boolean} Whether X-ray mode is enabled.\n */\n isXRayEnabled() {\n return this.xRay;\n }\n /**\n * Enables or disables X-ray outlines.\n *\n * @deprecated Use xRay instead.\n * @param {Boolean} value - Whether X-ray should be enabled.\n */\n setXRayEnabled(value) {\n this.xRay = value;\n }\n /**\n * The pattern texture. Set to `null` to disable.\n *\n * @type {Texture}\n */\n get patternTexture() {\n return this.uniforms.get(\"patternTexture\").value;\n }\n set patternTexture(value) {\n if (value !== null) {\n value.wrapS = value.wrapT = RepeatWrapping2;\n this.defines.set(\"USE_PATTERN\", \"1\");\n this.setVertexShader(outline_default4);\n } else {\n this.defines.delete(\"USE_PATTERN\");\n this.setVertexShader(null);\n }\n this.uniforms.get(\"patternTexture\").value = value;\n this.setChanged();\n }\n /**\n * Sets the pattern texture.\n *\n * @deprecated Use patternTexture instead.\n * @param {Texture} value - The new texture.\n */\n setPatternTexture(value) {\n this.patternTexture = value;\n }\n /**\n * Returns the current resolution scale.\n *\n * @return {Number} The resolution scale.\n * @deprecated Use resolution instead.\n */\n getResolutionScale() {\n return this.resolution.scale;\n }\n /**\n * Sets the resolution scale.\n *\n * @param {Number} scale - The new resolution scale.\n * @deprecated Use resolution instead.\n */\n setResolutionScale(scale) {\n this.resolution.scale = scale;\n }\n /**\n * Clears the current selection and selects a list of objects.\n *\n * @param {Object3D[]} objects - The objects that should be outlined. This array will be copied.\n * @return {OutlinePass} This pass.\n * @deprecated Use selection.set() instead.\n */\n setSelection(objects) {\n this.selection.set(objects);\n return this;\n }\n /**\n * Clears the list of selected objects.\n *\n * @return {OutlinePass} This pass.\n * @deprecated Use selection.clear() instead.\n */\n clearSelection() {\n this.selection.clear();\n return this;\n }\n /**\n * Selects an object.\n *\n * @param {Object3D} object - The object that should be outlined.\n * @return {OutlinePass} This pass.\n * @deprecated Use selection.add() instead.\n */\n selectObject(object) {\n this.selection.add(object);\n return this;\n }\n /**\n * Deselects an object.\n *\n * @param {Object3D} object - The object that should no longer be outlined.\n * @return {OutlinePass} This pass.\n * @deprecated Use selection.delete() instead.\n */\n deselectObject(object) {\n this.selection.delete(object);\n return this;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n const scene = this.scene;\n const camera = this.camera;\n const selection = this.selection;\n const uniforms = this.uniforms;\n const pulse = uniforms.get(\"pulse\");\n const background = scene.background;\n const mask = camera.layers.mask;\n if (this.forceUpdate || selection.size > 0) {\n scene.background = null;\n pulse.value = 1;\n if (this.pulseSpeed > 0) {\n pulse.value = Math.cos(this.time * this.pulseSpeed * 10) * 0.375 + 0.625;\n }\n this.time += deltaTime;\n selection.setVisible(false);\n this.depthPass.render(renderer);\n selection.setVisible(true);\n camera.layers.set(selection.layer);\n this.maskPass.render(renderer, this.renderTargetMask);\n camera.layers.mask = mask;\n scene.background = background;\n this.outlinePass.render(renderer, null, this.renderTargetOutline);\n if (this.blurPass.enabled) {\n this.blurPass.render(renderer, this.renderTargetOutline, this.renderTargetOutline);\n }\n }\n this.forceUpdate = selection.size > 0;\n }\n /**\n * Updates the size of internal render targets.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.blurPass.setSize(width, height);\n this.renderTargetMask.setSize(width, height);\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n const w = resolution.width, h = resolution.height;\n this.depthPass.setSize(w, h);\n this.renderTargetOutline.setSize(w, h);\n this.outlinePass.fullscreenMaterial.setSize(w, h);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n this.blurPass.initialize(renderer, alpha, UnsignedByteType15);\n if (frameBufferType !== void 0) {\n this.depthPass.initialize(renderer, alpha, frameBufferType);\n this.maskPass.initialize(renderer, alpha, frameBufferType);\n this.outlinePass.initialize(renderer, alpha, frameBufferType);\n }\n }\n};\n\n// src/effects/PixelationEffect.js\nimport { Uniform as Uniform40, Vector2 as Vector224, Vector4 as Vector43 } from \"three\";\n\n// src/effects/glsl/pixelation.frag\nvar pixelation_default = \"uniform bool active;uniform vec4 d;void mainUv(inout vec2 uv){if(active){uv=d.xy*(floor(uv*d.zw)+0.5);}}\";\n\n// src/effects/PixelationEffect.js\nvar PixelationEffect = class extends Effect {\n /**\n * Constructs a new pixelation effect.\n *\n * @param {Object} [granularity=30.0] - The pixel granularity.\n */\n constructor(granularity = 30) {\n super(\"PixelationEffect\", pixelation_default, {\n uniforms: /* @__PURE__ */ new Map([\n [\"active\", new Uniform40(false)],\n [\"d\", new Uniform40(new Vector43())]\n ])\n });\n this.resolution = new Vector224();\n this._granularity = 0;\n this.granularity = granularity;\n }\n /**\n * The pixel granularity.\n *\n * A higher value yields coarser visuals.\n *\n * @type {Number}\n */\n get granularity() {\n return this._granularity;\n }\n set granularity(value) {\n let d = Math.floor(value);\n if (d % 2 > 0) {\n d += 1;\n }\n this._granularity = d;\n this.uniforms.get(\"active\").value = d > 0;\n this.setSize(this.resolution.width, this.resolution.height);\n }\n /**\n * Returns the pixel granularity.\n *\n * @deprecated Use granularity instead.\n * @return {Number} The granularity.\n */\n getGranularity() {\n return this.granularity;\n }\n /**\n * Sets the pixel granularity.\n *\n * @deprecated Use granularity instead.\n * @param {Number} value - The new granularity.\n */\n setGranularity(value) {\n this.granularity = value;\n }\n /**\n * Updates the granularity.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.set(width, height);\n const d = this.granularity;\n const x = d / resolution.x;\n const y = d / resolution.y;\n this.uniforms.get(\"d\").value.set(x, y, 1 / x, 1 / y);\n }\n};\n\n// src/effects/RealisticBokehEffect.js\nimport { Uniform as Uniform41, Vector4 as Vector44 } from \"three\";\n\n// src/effects/glsl/realistic-bokeh.frag\nvar realistic_bokeh_default = \"uniform float focus;uniform float focalLength;uniform float fStop;uniform float maxBlur;uniform float luminanceThreshold;uniform float luminanceGain;uniform float bias;uniform float fringe;\\n#ifdef MANUAL_DOF\\nuniform vec4 dof;\\n#endif\\n#ifdef PENTAGON\\nfloat pentagon(const in vec2 coords){const vec4 HS0=vec4(1.0,0.0,0.0,1.0);const vec4 HS1=vec4(0.309016994,0.951056516,0.0,1.0);const vec4 HS2=vec4(-0.809016994,0.587785252,0.0,1.0);const vec4 HS3=vec4(-0.809016994,-0.587785252,0.0,1.0);const vec4 HS4=vec4(0.309016994,-0.951056516,0.0,1.0);const vec4 HS5=vec4(0.0,0.0,1.0,1.0);const vec4 ONE=vec4(1.0);const float P_FEATHER=0.4;const float N_FEATHER=-P_FEATHER;float inOrOut=-4.0;vec4 P=vec4(coords,vec2(RINGS_FLOAT-1.3));vec4 dist=vec4(dot(P,HS0),dot(P,HS1),dot(P,HS2),dot(P,HS3));dist=smoothstep(N_FEATHER,P_FEATHER,dist);inOrOut+=dot(dist,ONE);dist.x=dot(P,HS4);dist.y=HS5.w-abs(P.z);dist=smoothstep(N_FEATHER,P_FEATHER,dist);inOrOut+=dist.x;return clamp(inOrOut,0.0,1.0);}\\n#endif\\nvec3 processTexel(const in vec2 coords,const in float blur){vec2 scale=texelSize*fringe*blur;vec3 c=vec3(texture2D(inputBuffer,coords+vec2(0.0,1.0)*scale).r,texture2D(inputBuffer,coords+vec2(-0.866,-0.5)*scale).g,texture2D(inputBuffer,coords+vec2(0.866,-0.5)*scale).b);float luminance=linearToRelativeLuminance(c);float threshold=max((luminance-luminanceThreshold)*luminanceGain,0.0);return c+mix(vec3(0.0),c,threshold*blur);}float gather(const in float i,const in float j,const in float ringSamples,const in vec2 uv,const in vec2 blurFactor,const in float blur,inout vec3 color){float step=PI2/ringSamples;vec2 wh=vec2(cos(j*step)*i,sin(j*step)*i);\\n#ifdef PENTAGON\\nfloat p=pentagon(wh);\\n#else\\nfloat p=1.0;\\n#endif\\ncolor+=processTexel(wh*blurFactor+uv,blur)*mix(1.0,i/RINGS_FLOAT,bias)*p;return mix(1.0,i/RINGS_FLOAT,bias)*p;}void mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){\\n#ifdef PERSPECTIVE_CAMERA\\nfloat viewZ=perspectiveDepthToViewZ(depth,cameraNear,cameraFar);float linearDepth=viewZToOrthographicDepth(viewZ,cameraNear,cameraFar);\\n#else\\nfloat linearDepth=depth;\\n#endif\\n#ifdef MANUAL_DOF\\nfloat focalPlane=linearDepth-focus;float farDoF=(focalPlane-dof.z)/dof.w;float nearDoF=(-focalPlane-dof.x)/dof.y;float blur=(focalPlane>0.0)?farDoF:nearDoF;\\n#else\\nconst float CIRCLE_OF_CONFUSION=0.03;float focalPlaneMM=focus*1000.0;float depthMM=linearDepth*1000.0;float focalPlane=(depthMM*focalLength)/(depthMM-focalLength);float farDoF=(focalPlaneMM*focalLength)/(focalPlaneMM-focalLength);float nearDoF=(focalPlaneMM-focalLength)/(focalPlaneMM*fStop*CIRCLE_OF_CONFUSION);float blur=abs(focalPlane-farDoF)*nearDoF;\\n#endif\\nconst int MAX_RING_SAMPLES=RINGS_INT*SAMPLES_INT;blur=clamp(blur,0.0,1.0);vec3 color=inputColor.rgb;if(blur>=0.05){vec2 blurFactor=blur*maxBlur*texelSize;float s=1.0;int ringSamples;for(int i=1;i<=RINGS_INT;i++){ringSamples=i*SAMPLES_INT;for(int j=0;j<MAX_RING_SAMPLES;j++){if(j>=ringSamples){break;}s+=gather(float(i),float(j),float(ringSamples),uv,blurFactor,blur,color);}}color/=s;}\\n#ifdef SHOW_FOCUS\\nfloat edge=0.002*linearDepth;float m=clamp(smoothstep(0.0,edge,blur),0.0,1.0);float e=clamp(smoothstep(1.0-edge,1.0,blur),0.0,1.0);color=mix(color,vec3(1.0,0.5,0.0),(1.0-m)*0.6);color=mix(color,vec3(0.0,0.5,1.0),((1.0-e)-(1.0-m))*0.2);\\n#endif\\noutputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/RealisticBokehEffect.js\nvar RealisticBokehEffect = class extends Effect {\n /**\n * Constructs a new bokeh effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {Number} [options.focus=1.0] - The focus distance in world units.\n * @param {Number} [options.focalLength=24.0] - The focal length of the main camera.\n * @param {Number} [options.fStop=0.9] - The ratio of the lens focal length to the diameter of the entrance pupil (aperture).\n * @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold.\n * @param {Number} [options.luminanceGain=2.0] - A luminance gain factor.\n * @param {Number} [options.bias=0.5] - A blur bias.\n * @param {Number} [options.fringe=0.7] - A blur offset.\n * @param {Number} [options.maxBlur=1.0] - The maximum blur strength.\n * @param {Boolean} [options.rings=3] - The number of blur iterations.\n * @param {Boolean} [options.samples=2] - The amount of samples taken per ring.\n * @param {Boolean} [options.showFocus=false] - Whether the focal point should be highlighted. Useful for debugging.\n * @param {Boolean} [options.manualDoF=false] - Enables manual control over the depth of field.\n * @param {Boolean} [options.pentagon=false] - Enables pentagonal blur shapes. Requires a high number of rings and samples.\n */\n constructor({\n blendFunction,\n focus = 1,\n focalLength = 24,\n fStop = 0.9,\n luminanceThreshold = 0.5,\n luminanceGain = 2,\n bias = 0.5,\n fringe = 0.7,\n maxBlur = 1,\n rings = 3,\n samples = 2,\n showFocus = false,\n manualDoF = false,\n pentagon = false\n } = {}) {\n super(\"RealisticBokehEffect\", realistic_bokeh_default, {\n blendFunction,\n attributes: EffectAttribute.CONVOLUTION | EffectAttribute.DEPTH,\n uniforms: /* @__PURE__ */ new Map([\n [\"focus\", new Uniform41(focus)],\n [\"focalLength\", new Uniform41(focalLength)],\n [\"fStop\", new Uniform41(fStop)],\n [\"luminanceThreshold\", new Uniform41(luminanceThreshold)],\n [\"luminanceGain\", new Uniform41(luminanceGain)],\n [\"bias\", new Uniform41(bias)],\n [\"fringe\", new Uniform41(fringe)],\n [\"maxBlur\", new Uniform41(maxBlur)],\n [\"dof\", new Uniform41(null)]\n ])\n });\n this.rings = rings;\n this.samples = samples;\n this.showFocus = showFocus;\n this.manualDoF = manualDoF;\n this.pentagon = pentagon;\n }\n /**\n * The amount of blur iterations.\n *\n * @type {Number}\n */\n get rings() {\n return Number.parseInt(this.defines.get(\"RINGS_INT\"));\n }\n set rings(value) {\n const r = Math.floor(value);\n this.defines.set(\"RINGS_INT\", r.toFixed(0));\n this.defines.set(\"RINGS_FLOAT\", r.toFixed(1));\n this.setChanged();\n }\n /**\n * The amount of blur samples per ring.\n *\n * @type {Number}\n */\n get samples() {\n return Number.parseInt(this.defines.get(\"SAMPLES_INT\"));\n }\n set samples(value) {\n const s = Math.floor(value);\n this.defines.set(\"SAMPLES_INT\", s.toFixed(0));\n this.defines.set(\"SAMPLES_FLOAT\", s.toFixed(1));\n this.setChanged();\n }\n /**\n * Indicates whether the focal point will be highlighted.\n *\n * @type {Boolean}\n */\n get showFocus() {\n return this.defines.has(\"SHOW_FOCUS\");\n }\n set showFocus(value) {\n if (this.showFocus !== value) {\n if (value) {\n this.defines.set(\"SHOW_FOCUS\", \"1\");\n } else {\n this.defines.delete(\"SHOW_FOCUS\");\n }\n this.setChanged();\n }\n }\n /**\n * Indicates whether the Depth of Field should be calculated manually.\n *\n * If enabled, the Depth of Field can be adjusted via the `dof` uniform.\n *\n * @type {Boolean}\n */\n get manualDoF() {\n return this.defines.has(\"MANUAL_DOF\");\n }\n set manualDoF(value) {\n if (this.manualDoF !== value) {\n if (value) {\n this.defines.set(\"MANUAL_DOF\", \"1\");\n this.uniforms.get(\"dof\").value = new Vector44(0.2, 1, 0.2, 2);\n } else {\n this.defines.delete(\"MANUAL_DOF\");\n this.uniforms.get(\"dof\").value = null;\n }\n this.setChanged();\n }\n }\n /**\n * Indicates whether the blur shape should be pentagonal.\n *\n * @type {Boolean}\n */\n get pentagon() {\n return this.defines.has(\"PENTAGON\");\n }\n set pentagon(value) {\n if (this.pentagon !== value) {\n if (value) {\n this.defines.set(\"PENTAGON\", \"1\");\n } else {\n this.defines.delete(\"PENTAGON\");\n }\n this.setChanged();\n }\n }\n};\n\n// src/effects/ScanlineEffect.js\nimport { Uniform as Uniform42, Vector2 as Vector225 } from \"three\";\n\n// src/effects/glsl/scanlines.frag\nvar scanlines_default = \"uniform float count;\\n#ifdef SCROLL\\nuniform float scrollSpeed;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){float y=uv.y;\\n#ifdef SCROLL\\ny+=time*scrollSpeed;\\n#endif\\nvec2 sl=vec2(sin(y*count),cos(y*count));outputColor=vec4(sl.xyx,inputColor.a);}\";\n\n// src/effects/ScanlineEffect.js\nvar ScanlineEffect = class extends Effect {\n /**\n * Constructs a new scanline effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.OVERLAY] - The blend function of this effect.\n * @param {Number} [options.density=1.25] - The scanline density.\n * @param {Number} [options.scrollSpeed=0.0] - The scanline scroll speed.\n */\n constructor({ blendFunction = BlendFunction.OVERLAY, density = 1.25, scrollSpeed = 0 } = {}) {\n super(\"ScanlineEffect\", scanlines_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"count\", new Uniform42(0)],\n [\"scrollSpeed\", new Uniform42(0)]\n ])\n });\n this.resolution = new Vector225();\n this.d = density;\n this.scrollSpeed = scrollSpeed;\n }\n /**\n * The scanline density.\n *\n * @type {Number}\n */\n get density() {\n return this.d;\n }\n set density(value) {\n this.d = value;\n this.setSize(this.resolution.width, this.resolution.height);\n }\n /**\n * Returns the current scanline density.\n *\n * @deprecated Use density instead.\n * @return {Number} The scanline density.\n */\n getDensity() {\n return this.density;\n }\n /**\n * Sets the scanline density.\n *\n * @deprecated Use density instead.\n * @param {Number} value - The new scanline density.\n */\n setDensity(value) {\n this.density = value;\n }\n /**\n * The scanline scroll speed. Default is 0 (disabled).\n *\n * @type {Number}\n */\n get scrollSpeed() {\n return this.uniforms.get(\"scrollSpeed\").value;\n }\n set scrollSpeed(value) {\n this.uniforms.get(\"scrollSpeed\").value = value;\n if (value === 0) {\n if (this.defines.delete(\"SCROLL\")) {\n this.setChanged();\n }\n } else if (!this.defines.has(\"SCROLL\")) {\n this.defines.set(\"SCROLL\", \"1\");\n this.setChanged();\n }\n }\n /**\n * Updates the size of this pass.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.resolution.set(width, height);\n this.uniforms.get(\"count\").value = Math.round(height * this.density);\n }\n};\n\n// src/effects/ShockWaveEffect.js\nimport { Uniform as Uniform43, Vector2 as Vector226, Vector3 as Vector35 } from \"three\";\n\n// src/effects/glsl/shock-wave.frag\nvar shock_wave_default = \"uniform bool active;uniform vec2 center;uniform float waveSize;uniform float radius;uniform float maxRadius;uniform float amplitude;varying float vSize;void mainUv(inout vec2 uv){if(active){vec2 aspectCorrection=vec2(aspect,1.0);vec2 difference=uv*aspectCorrection-center*aspectCorrection;float distance=sqrt(dot(difference,difference))*vSize;if(distance>radius){if(distance<radius+waveSize){float angle=(distance-radius)*PI2/waveSize;float cosSin=(1.0-cos(angle))*0.5;float extent=maxRadius+waveSize;float decay=max(extent-distance*distance,0.0)/extent;uv-=((cosSin*amplitude*difference)/distance)*decay;}}}}\";\n\n// src/effects/glsl/shock-wave.vert\nvar shock_wave_default2 = \"uniform float size;uniform float cameraDistance;varying float vSize;void mainSupport(){vSize=(0.1*cameraDistance)/size;}\";\n\n// src/effects/ShockWaveEffect.js\nvar HALF_PI = Math.PI * 0.5;\nvar v2 = /* @__PURE__ */ new Vector35();\nvar ab = /* @__PURE__ */ new Vector35();\nvar ShockWaveEffect = class extends Effect {\n /**\n * Constructs a new shock wave effect.\n *\n * @param {Camera} camera - The main camera.\n * @param {Vector3} [position] - The world position of the shock wave.\n * @param {Object} [options] - The options.\n * @param {Number} [options.speed=2.0] - The animation speed.\n * @param {Number} [options.maxRadius=1.0] - The extent of the shock wave.\n * @param {Number} [options.waveSize=0.2] - The wave size.\n * @param {Number} [options.amplitude=0.05] - The distortion amplitude.\n */\n constructor(camera, position = new Vector35(), {\n speed = 2,\n maxRadius = 1,\n waveSize = 0.2,\n amplitude = 0.05\n } = {}) {\n super(\"ShockWaveEffect\", shock_wave_default, {\n vertexShader: shock_wave_default2,\n uniforms: /* @__PURE__ */ new Map([\n [\"active\", new Uniform43(false)],\n [\"center\", new Uniform43(new Vector226(0.5, 0.5))],\n [\"cameraDistance\", new Uniform43(1)],\n [\"size\", new Uniform43(1)],\n [\"radius\", new Uniform43(-waveSize)],\n [\"maxRadius\", new Uniform43(maxRadius)],\n [\"waveSize\", new Uniform43(waveSize)],\n [\"amplitude\", new Uniform43(amplitude)]\n ])\n });\n this.position = position;\n this.speed = speed;\n this.camera = camera;\n this.screenPosition = this.uniforms.get(\"center\").value;\n this.time = 0;\n this.active = false;\n }\n set mainCamera(value) {\n this.camera = value;\n }\n /**\n * The amplitude.\n *\n * @type {Number}\n */\n get amplitude() {\n return this.uniforms.get(\"amplitude\").value;\n }\n set amplitude(value) {\n this.uniforms.get(\"amplitude\").value = value;\n }\n /**\n * The wave size.\n *\n * @type {Number}\n */\n get waveSize() {\n return this.uniforms.get(\"waveSize\").value;\n }\n set waveSize(value) {\n this.uniforms.get(\"waveSize\").value = value;\n }\n /**\n * The maximum radius.\n *\n * @type {Number}\n */\n get maxRadius() {\n return this.uniforms.get(\"maxRadius\").value;\n }\n set maxRadius(value) {\n this.uniforms.get(\"maxRadius\").value = value;\n }\n /**\n * The position of the shock wave.\n *\n * @type {Vector3}\n * @deprecated Use position instead.\n */\n get epicenter() {\n return this.position;\n }\n set epicenter(value) {\n this.position = value;\n }\n /**\n * Returns the position of the shock wave.\n *\n * @deprecated Use position instead.\n * @return {Vector3} The position.\n */\n getPosition() {\n return this.position;\n }\n /**\n * Sets the position of the shock wave.\n *\n * @deprecated Use position instead.\n * @param {Vector3} value - The position.\n */\n setPosition(value) {\n this.position = value;\n }\n /**\n * Returns the speed of the shock wave.\n *\n * @deprecated Use speed instead.\n * @return {Number} The speed.\n */\n getSpeed() {\n return this.speed;\n }\n /**\n * Sets the speed of the shock wave.\n *\n * @deprecated Use speed instead.\n * @param {Number} value - The speed.\n */\n setSpeed(value) {\n this.speed = value;\n }\n /**\n * Emits the shock wave.\n */\n explode() {\n this.time = 0;\n this.active = true;\n this.uniforms.get(\"active\").value = true;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [delta] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, delta) {\n const position = this.position;\n const camera = this.camera;\n const uniforms = this.uniforms;\n const uActive = uniforms.get(\"active\");\n if (this.active) {\n const waveSize = uniforms.get(\"waveSize\").value;\n camera.getWorldDirection(v2);\n ab.copy(camera.position).sub(position);\n uActive.value = v2.angleTo(ab) > HALF_PI;\n if (uActive.value) {\n uniforms.get(\"cameraDistance\").value = camera.position.distanceTo(position);\n v2.copy(position).project(camera);\n this.screenPosition.set((v2.x + 1) * 0.5, (v2.y + 1) * 0.5);\n }\n this.time += delta * this.speed;\n const radius = this.time - waveSize;\n uniforms.get(\"radius\").value = radius;\n if (radius >= (uniforms.get(\"maxRadius\").value + waveSize) * 2) {\n this.active = false;\n uActive.value = false;\n }\n }\n }\n};\n\n// src/effects/SelectiveBloomEffect.js\nimport {\n BasicDepthPacking as BasicDepthPacking16,\n Color as Color7,\n NotEqualDepth as NotEqualDepth2,\n EqualDepth as EqualDepth2,\n RGBADepthPacking as RGBADepthPacking5,\n WebGLRenderTarget as WebGLRenderTarget19\n} from \"three\";\nvar SelectiveBloomEffect = class extends BloomEffect {\n /**\n * Constructs a new selective bloom effect.\n *\n * @param {Scene} scene - The main scene.\n * @param {Camera} camera - The main camera.\n * @param {Object} [options] - The options. See {@link BloomEffect} for details.\n */\n constructor(scene, camera, options) {\n super(options);\n this.setAttributes(this.getAttributes() | EffectAttribute.DEPTH);\n this.camera = camera;\n this.depthPass = new DepthPass(scene, camera);\n this.clearPass = new ClearPass(true, false, false);\n this.clearPass.overrideClearColor = new Color7(0);\n this.depthMaskPass = new ShaderPass(new DepthMaskMaterial());\n const depthMaskMaterial = this.depthMaskMaterial;\n depthMaskMaterial.copyCameraSettings(camera);\n depthMaskMaterial.depthBuffer1 = this.depthPass.texture;\n depthMaskMaterial.depthPacking1 = RGBADepthPacking5;\n depthMaskMaterial.depthMode = EqualDepth2;\n this.renderTargetMasked = new WebGLRenderTarget19(1, 1, { depthBuffer: false });\n this.renderTargetMasked.texture.name = \"Bloom.Masked\";\n this.selection = new Selection();\n this.selection.layer = 11;\n this._inverted = false;\n this._ignoreBackground = false;\n }\n set mainScene(value) {\n this.depthPass.mainScene = value;\n }\n set mainCamera(value) {\n this.camera = value;\n this.depthPass.mainCamera = value;\n this.depthMaskMaterial.copyCameraSettings(value);\n }\n /**\n * Returns the selection.\n *\n * @deprecated Use selection instead.\n * @return {Selection} The selection.\n */\n getSelection() {\n return this.selection;\n }\n /**\n * The depth mask material.\n *\n * @type {DepthMaskMaterial}\n * @private\n */\n get depthMaskMaterial() {\n return this.depthMaskPass.fullscreenMaterial;\n }\n /**\n * Indicates whether the selection should be considered inverted.\n *\n * @type {Boolean}\n */\n get inverted() {\n return this._inverted;\n }\n set inverted(value) {\n this._inverted = value;\n this.depthMaskMaterial.depthMode = value ? NotEqualDepth2 : EqualDepth2;\n }\n /**\n * Indicates whether the mask is inverted.\n *\n * @deprecated Use inverted instead.\n * @return {Boolean} Whether the mask is inverted.\n */\n isInverted() {\n return this.inverted;\n }\n /**\n * Enables or disable mask inversion.\n *\n * @deprecated Use inverted instead.\n * @param {Boolean} value - Whether the mask should be inverted.\n */\n setInverted(value) {\n this.inverted = value;\n }\n /**\n * Indicates whether the background colors will be ignored.\n *\n * @type {Boolean}\n */\n get ignoreBackground() {\n return this._ignoreBackground;\n }\n set ignoreBackground(value) {\n this._ignoreBackground = value;\n this.depthMaskMaterial.maxDepthStrategy = value ? DepthTestStrategy.DISCARD_MAX_DEPTH : DepthTestStrategy.KEEP_MAX_DEPTH;\n }\n /**\n * Indicates whether the background is disabled.\n *\n * @deprecated Use ignoreBackground instead.\n * @return {Boolean} Whether the background is disabled.\n */\n isBackgroundDisabled() {\n return this.ignoreBackground;\n }\n /**\n * Enables or disables the background.\n *\n * @deprecated Use ignoreBackground instead.\n * @param {Boolean} value - Whether the background should be disabled.\n */\n setBackgroundDisabled(value) {\n this.ignoreBackground = value;\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking16) {\n this.depthMaskMaterial.depthBuffer0 = depthTexture;\n this.depthMaskMaterial.depthPacking0 = depthPacking;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n const camera = this.camera;\n const selection = this.selection;\n const inverted = this.inverted;\n let renderTarget = inputBuffer;\n if (this.ignoreBackground || !inverted || selection.size > 0) {\n const mask = camera.layers.mask;\n camera.layers.set(selection.layer);\n this.depthPass.render(renderer);\n camera.layers.mask = mask;\n renderTarget = this.renderTargetMasked;\n this.clearPass.render(renderer, renderTarget);\n this.depthMaskPass.render(renderer, inputBuffer, renderTarget);\n }\n super.update(renderer, renderTarget, deltaTime);\n }\n /**\n * Updates the size of internal render targets.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n super.setSize(width, height);\n this.renderTargetMasked.setSize(width, height);\n this.depthPass.setSize(width, height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n super.initialize(renderer, alpha, frameBufferType);\n this.clearPass.initialize(renderer, alpha, frameBufferType);\n this.depthPass.initialize(renderer, alpha, frameBufferType);\n this.depthMaskPass.initialize(renderer, alpha, frameBufferType);\n if (renderer.capabilities.logarithmicDepthBuffer) {\n this.depthMaskPass.fullscreenMaterial.defines.LOG_DEPTH = \"1\";\n }\n if (frameBufferType !== void 0) {\n this.renderTargetMasked.texture.type = frameBufferType;\n if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTargetMasked.texture, SRGBColorSpace);\n }\n }\n }\n};\n\n// src/effects/SepiaEffect.js\nimport { Uniform as Uniform44, Vector3 as Vector36 } from \"three\";\n\n// src/effects/glsl/sepia.frag\nvar sepia_default = \"uniform vec3 weightsR;uniform vec3 weightsG;uniform vec3 weightsB;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec3 color=vec3(dot(inputColor.rgb,weightsR),dot(inputColor.rgb,weightsG),dot(inputColor.rgb,weightsB));outputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/SepiaEffect.js\nvar SepiaEffect = class extends Effect {\n /**\n * Constructs a new sepia effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {Number} [options.intensity=1.0] - The intensity of the effect.\n */\n constructor({ blendFunction, intensity = 1 } = {}) {\n super(\"SepiaEffect\", sepia_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"weightsR\", new Uniform44(new Vector36(0.393, 0.769, 0.189))],\n [\"weightsG\", new Uniform44(new Vector36(0.349, 0.686, 0.168))],\n [\"weightsB\", new Uniform44(new Vector36(0.272, 0.534, 0.131))]\n ])\n });\n }\n /**\n * The intensity.\n *\n * @deprecated Use blendMode.opacity instead.\n * @type {Number}\n */\n get intensity() {\n return this.blendMode.opacity.value;\n }\n set intensity(value) {\n this.blendMode.opacity.value = value;\n }\n /**\n * Returns the current sepia intensity.\n *\n * @deprecated Use blendMode.opacity instead.\n * @return {Number} The intensity.\n */\n getIntensity() {\n return this.intensity;\n }\n /**\n * Sets the sepia intensity.\n *\n * @deprecated Use blendMode.opacity instead.\n * @param {Number} value - The intensity.\n */\n setIntensity(value) {\n this.intensity = value;\n }\n /**\n * The weights for the red channel. Default is `(0.393, 0.769, 0.189)`.\n *\n * @type {Vector3}\n */\n get weightsR() {\n return this.uniforms.get(\"weightsR\").value;\n }\n /**\n * The weights for the green channel. Default is `(0.349, 0.686, 0.168)`.\n *\n * @type {Vector3}\n */\n get weightsG() {\n return this.uniforms.get(\"weightsG\").value;\n }\n /**\n * The weights for the blue channel. Default is `(0.272, 0.534, 0.131)`.\n *\n * @type {Vector3}\n */\n get weightsB() {\n return this.uniforms.get(\"weightsB\").value;\n }\n};\n\n// src/effects/SMAAEffect.js\nimport {\n BasicDepthPacking as BasicDepthPacking17,\n Color as Color8,\n LinearFilter as LinearFilter5,\n LoadingManager as LoadingManager2,\n NearestFilter as NearestFilter8,\n Texture as Texture3,\n Uniform as Uniform45,\n WebGLRenderTarget as WebGLRenderTarget20\n} from \"three\";\n\n// src/textures/smaa/searchImageDataURL.js\nvar searchImageDataURL_default = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAQCAYAAACm53kpAAAAeElEQVRYR+2XSwqAMAxEJ168ePEqwRSKhIIiuHjJqiU0gWE+1CQdApcVAMUAuARaMGCX1MIL/Ow13++9lW2s3mW9MWvsnWc/2fvGygwPAN4E8QzAA4CXAB6AHjG4JTHYI1ey3pcx6FHnEfhLDOIBKAmUBK6/ANUDTlROXAHd9EC1AAAAAElFTkSuQmCC\";\n\n// src/textures/smaa/areaImageDataURL.js\nvar areaImageDataURL_default = \"data:image/png;base64,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\";\n\n// src/effects/glsl/smaa.frag\nvar smaa_default = \"uniform sampler2D weightMap;varying vec2 vOffset0;varying vec2 vOffset1;void movec(const in bvec2 c,inout vec2 variable,const in vec2 value){if(c.x){variable.x=value.x;}if(c.y){variable.y=value.y;}}void movec(const in bvec4 c,inout vec4 variable,const in vec4 value){movec(c.xy,variable.xy,value.xy);movec(c.zw,variable.zw,value.zw);}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec4 a;a.x=texture2D(weightMap,vOffset0).a;a.y=texture2D(weightMap,vOffset1).g;a.wz=texture2D(weightMap,uv).rb;vec4 color=inputColor;if(dot(a,vec4(1.0))>=1e-5){bool h=max(a.x,a.z)>max(a.y,a.w);vec4 blendingOffset=vec4(0.0,a.y,0.0,a.w);vec2 blendingWeight=a.yw;movec(bvec4(h),blendingOffset,vec4(a.x,0.0,a.z,0.0));movec(bvec2(h),blendingWeight,a.xz);blendingWeight/=dot(blendingWeight,vec2(1.0));vec4 blendingCoord=blendingOffset*vec4(texelSize,-texelSize)+uv.xyxy;color=blendingWeight.x*texture2D(inputBuffer,blendingCoord.xy);color+=blendingWeight.y*texture2D(inputBuffer,blendingCoord.zw);}outputColor=color;}\";\n\n// src/effects/glsl/smaa.vert\nvar smaa_default2 = \"varying vec2 vOffset0;varying vec2 vOffset1;void mainSupport(const in vec2 uv){vOffset0=uv+texelSize*vec2(1.0,0.0);vOffset1=uv+texelSize*vec2(0.0,1.0);}\";\n\n// src/effects/SMAAEffect.js\nvar SMAAEffect = class extends Effect {\n /**\n * Constructs a new SMAA effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n * @param {SMAAPreset} [options.preset=SMAAPreset.MEDIUM] - The quality preset.\n * @param {EdgeDetectionMode} [options.edgeDetectionMode=EdgeDetectionMode.COLOR] - The edge detection mode.\n * @param {PredicationMode} [options.predicationMode=PredicationMode.DISABLED] - The predication mode.\n */\n constructor({\n blendFunction = BlendFunction.SRC,\n preset = SMAAPreset.MEDIUM,\n edgeDetectionMode = EdgeDetectionMode.COLOR,\n predicationMode = PredicationMode.DISABLED\n } = {}) {\n super(\"SMAAEffect\", smaa_default, {\n vertexShader: smaa_default2,\n blendFunction,\n attributes: EffectAttribute.CONVOLUTION | EffectAttribute.DEPTH,\n uniforms: /* @__PURE__ */ new Map([\n [\"weightMap\", new Uniform45(null)]\n ])\n });\n let searchImage, areaImage;\n if (arguments.length > 1) {\n searchImage = arguments[0];\n areaImage = arguments[1];\n if (arguments.length > 2) {\n preset = arguments[2];\n }\n if (arguments.length > 3) {\n edgeDetectionMode = arguments[3];\n }\n }\n this.renderTargetEdges = new WebGLRenderTarget20(1, 1, { depthBuffer: false });\n this.renderTargetEdges.texture.name = \"SMAA.Edges\";\n this.renderTargetWeights = this.renderTargetEdges.clone();\n this.renderTargetWeights.texture.name = \"SMAA.Weights\";\n this.uniforms.get(\"weightMap\").value = this.renderTargetWeights.texture;\n this.clearPass = new ClearPass(true, false, false);\n this.clearPass.overrideClearColor = new Color8(0);\n this.clearPass.overrideClearAlpha = 1;\n this.edgeDetectionPass = new ShaderPass(new EdgeDetectionMaterial());\n this.edgeDetectionMaterial.edgeDetectionMode = edgeDetectionMode;\n this.edgeDetectionMaterial.predicationMode = predicationMode;\n this.weightsPass = new ShaderPass(new SMAAWeightsMaterial());\n const loadingManager = new LoadingManager2();\n loadingManager.onLoad = () => {\n const searchTexture = new Texture3(searchImage);\n searchTexture.name = \"SMAA.Search\";\n searchTexture.magFilter = NearestFilter8;\n searchTexture.minFilter = NearestFilter8;\n searchTexture.generateMipmaps = false;\n searchTexture.needsUpdate = true;\n searchTexture.flipY = true;\n this.weightsMaterial.searchTexture = searchTexture;\n const areaTexture = new Texture3(areaImage);\n areaTexture.name = \"SMAA.Area\";\n areaTexture.magFilter = LinearFilter5;\n areaTexture.minFilter = LinearFilter5;\n areaTexture.generateMipmaps = false;\n areaTexture.needsUpdate = true;\n areaTexture.flipY = false;\n this.weightsMaterial.areaTexture = areaTexture;\n this.dispatchEvent({ type: \"load\" });\n };\n loadingManager.itemStart(\"search\");\n loadingManager.itemStart(\"area\");\n if (searchImage !== void 0 && areaImage !== void 0) {\n loadingManager.itemEnd(\"search\");\n loadingManager.itemEnd(\"area\");\n } else if (typeof Image !== \"undefined\") {\n searchImage = new Image();\n areaImage = new Image();\n searchImage.addEventListener(\"load\", () => loadingManager.itemEnd(\"search\"));\n areaImage.addEventListener(\"load\", () => loadingManager.itemEnd(\"area\"));\n searchImage.src = searchImageDataURL_default;\n areaImage.src = areaImageDataURL_default;\n }\n this.applyPreset(preset);\n }\n /**\n * The edges texture.\n *\n * @type {Texture}\n */\n get edgesTexture() {\n return this.renderTargetEdges.texture;\n }\n /**\n * Returns the edges texture.\n *\n * @deprecated Use edgesTexture instead.\n * @return {Texture} The texture.\n */\n getEdgesTexture() {\n return this.edgesTexture;\n }\n /**\n * The edge weights texture.\n *\n * @type {Texture}\n */\n get weightsTexture() {\n return this.renderTargetWeights.texture;\n }\n /**\n * Returns the edge weights texture.\n *\n * @deprecated Use weightsTexture instead.\n * @return {Texture} The texture.\n */\n getWeightsTexture() {\n return this.weightsTexture;\n }\n /**\n * The edge detection material.\n *\n * @type {EdgeDetectionMaterial}\n */\n get edgeDetectionMaterial() {\n return this.edgeDetectionPass.fullscreenMaterial;\n }\n /**\n * The edge detection material.\n *\n * @type {EdgeDetectionMaterial}\n * @deprecated Use edgeDetectionMaterial instead.\n */\n get colorEdgesMaterial() {\n return this.edgeDetectionMaterial;\n }\n /**\n * Returns the edge detection material.\n *\n * @deprecated Use edgeDetectionMaterial instead.\n * @return {EdgeDetectionMaterial} The material.\n */\n getEdgeDetectionMaterial() {\n return this.edgeDetectionMaterial;\n }\n /**\n * The edge weights material.\n *\n * @type {SMAAWeightsMaterial}\n */\n get weightsMaterial() {\n return this.weightsPass.fullscreenMaterial;\n }\n /**\n * Returns the edge weights material.\n *\n * @deprecated Use weightsMaterial instead.\n * @return {SMAAWeightsMaterial} The material.\n */\n getWeightsMaterial() {\n return this.weightsMaterial;\n }\n /**\n * Sets the edge detection sensitivity.\n *\n * See {@link EdgeDetectionMaterial#setEdgeDetectionThreshold} for more details.\n *\n * @deprecated Use edgeDetectionMaterial instead.\n * @param {Number} threshold - The edge detection sensitivity. Range: [0.05, 0.5].\n */\n setEdgeDetectionThreshold(threshold) {\n this.edgeDetectionMaterial.edgeDetectionThreshold = threshold;\n }\n /**\n * Sets the maximum amount of horizontal/vertical search steps.\n *\n * See {@link SMAAWeightsMaterial#setOrthogonalSearchSteps} for more details.\n *\n * @deprecated Use weightsMaterial instead.\n * @param {Number} steps - The search steps. Range: [0, 112].\n */\n setOrthogonalSearchSteps(steps) {\n this.weightsMaterial.orthogonalSearchSteps = steps;\n }\n /**\n * Applies the given quality preset.\n *\n * @param {SMAAPreset} preset - The preset.\n */\n applyPreset(preset) {\n const edgeDetectionMaterial = this.edgeDetectionMaterial;\n const weightsMaterial = this.weightsMaterial;\n switch (preset) {\n case SMAAPreset.LOW:\n edgeDetectionMaterial.edgeDetectionThreshold = 0.15;\n weightsMaterial.orthogonalSearchSteps = 4;\n weightsMaterial.diagonalDetection = false;\n weightsMaterial.cornerDetection = false;\n break;\n case SMAAPreset.MEDIUM:\n edgeDetectionMaterial.edgeDetectionThreshold = 0.1;\n weightsMaterial.orthogonalSearchSteps = 8;\n weightsMaterial.diagonalDetection = false;\n weightsMaterial.cornerDetection = false;\n break;\n case SMAAPreset.HIGH:\n edgeDetectionMaterial.edgeDetectionThreshold = 0.1;\n weightsMaterial.orthogonalSearchSteps = 16;\n weightsMaterial.diagonalSearchSteps = 8;\n weightsMaterial.cornerRounding = 25;\n weightsMaterial.diagonalDetection = true;\n weightsMaterial.cornerDetection = true;\n break;\n case SMAAPreset.ULTRA:\n edgeDetectionMaterial.edgeDetectionThreshold = 0.05;\n weightsMaterial.orthogonalSearchSteps = 32;\n weightsMaterial.diagonalSearchSteps = 16;\n weightsMaterial.cornerRounding = 25;\n weightsMaterial.diagonalDetection = true;\n weightsMaterial.cornerDetection = true;\n break;\n }\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking17) {\n this.edgeDetectionMaterial.depthBuffer = depthTexture;\n this.edgeDetectionMaterial.depthPacking = depthPacking;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n this.clearPass.render(renderer, this.renderTargetEdges);\n this.edgeDetectionPass.render(renderer, inputBuffer, this.renderTargetEdges);\n this.weightsPass.render(renderer, this.renderTargetEdges, this.renderTargetWeights);\n }\n /**\n * Updates the size of internal render targets.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n this.edgeDetectionMaterial.setSize(width, height);\n this.weightsMaterial.setSize(width, height);\n this.renderTargetEdges.setSize(width, height);\n this.renderTargetWeights.setSize(width, height);\n }\n /**\n * Deletes internal render targets and textures.\n */\n dispose() {\n const { searchTexture, areaTexture } = this.weightsMaterial;\n if (searchTexture !== null && areaTexture !== null) {\n searchTexture.dispose();\n areaTexture.dispose();\n }\n super.dispose();\n }\n /**\n * The SMAA search image, encoded as a base64 data URL.\n *\n * @type {String}\n * @deprecated\n */\n static get searchImageDataURL() {\n return searchImageDataURL_default;\n }\n /**\n * The SMAA area image, encoded as a base64 data URL.\n *\n * @type {String}\n * @deprecated\n */\n static get areaImageDataURL() {\n return areaImageDataURL_default;\n }\n};\n\n// src/effects/SSAOEffect.js\nimport { BasicDepthPacking as BasicDepthPacking18, Color as Color9, RepeatWrapping as RepeatWrapping3, RGBAFormat as RGBAFormat4, Uniform as Uniform46, WebGLRenderTarget as WebGLRenderTarget21 } from \"three\";\n\n// src/effects/glsl/ssao.frag\nvar ssao_default3 = \"uniform lowp sampler2D aoBuffer;uniform float luminanceInfluence;uniform float intensity;\\n#if THREE_REVISION < 143\\n#define luminance(v) linearToRelativeLuminance(v)\\n#endif\\n#if defined(DEPTH_AWARE_UPSAMPLING) && defined(NORMAL_DEPTH)\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nuniform highp sampler2D normalDepthBuffer;\\n#else\\nuniform mediump sampler2D normalDepthBuffer;\\n#endif\\n#endif\\n#ifdef COLORIZE\\nuniform vec3 color;\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,const in float depth,out vec4 outputColor){float aoLinear=texture2D(aoBuffer,uv).r;\\n#if defined(DEPTH_AWARE_UPSAMPLING) && defined(NORMAL_DEPTH) && __VERSION__ == 300\\nvec4 normalDepth[4];normalDepth[0]=textureOffset(normalDepthBuffer,uv,ivec2(0,0));normalDepth[1]=textureOffset(normalDepthBuffer,uv,ivec2(0,1));normalDepth[2]=textureOffset(normalDepthBuffer,uv,ivec2(1,0));normalDepth[3]=textureOffset(normalDepthBuffer,uv,ivec2(1,1));float dot01=dot(normalDepth[0].rgb,normalDepth[1].rgb);float dot02=dot(normalDepth[0].rgb,normalDepth[2].rgb);float dot03=dot(normalDepth[0].rgb,normalDepth[3].rgb);float minDot=min(dot01,min(dot02,dot03));float s=step(THRESHOLD,minDot);float smallestDistance=1.0;int index;for(int i=0;i<4;++i){float distance=abs(depth-normalDepth[i].a);if(distance<smallestDistance){smallestDistance=distance;index=i;}}ivec2 offsets[4];offsets[0]=ivec2(0,0);offsets[1]=ivec2(0,1);offsets[2]=ivec2(1,0);offsets[3]=ivec2(1,1);ivec2 coord=ivec2(uv*vec2(textureSize(aoBuffer,0)))+offsets[index];float aoNearest=texelFetch(aoBuffer,coord,0).r;float ao=mix(aoNearest,aoLinear,s);\\n#else\\nfloat ao=aoLinear;\\n#endif\\nfloat l=luminance(inputColor.rgb);ao=mix(ao,0.0,l*luminanceInfluence);ao=clamp(ao*intensity,0.0,1.0);\\n#ifdef COLORIZE\\noutputColor=vec4(1.0-ao*(1.0-color),inputColor.a);\\n#else\\noutputColor=vec4(vec3(1.0-ao),inputColor.a);\\n#endif\\n}\";\n\n// src/effects/SSAOEffect.js\nvar NOISE_TEXTURE_SIZE = 64;\nvar SSAOEffect = class extends Effect {\n /**\n * Constructs a new SSAO effect.\n *\n * @todo Move normalBuffer to options.\n * @param {Camera} [camera] - The main camera.\n * @param {Texture} [normalBuffer] - A texture that contains the scene normals.\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.MULTIPLY] - The blend function of this effect.\n * @param {Boolean} [options.distanceScaling=true] - Deprecated.\n * @param {Boolean} [options.depthAwareUpsampling=true] - Enables or disables depth-aware upsampling. Has no effect if WebGL 2 is not supported.\n * @param {Texture} [options.normalDepthBuffer=null] - Deprecated.\n * @param {Number} [options.samples=9] - The amount of samples per pixel. Should not be a multiple of the ring count.\n * @param {Number} [options.rings=7] - The amount of spiral turns in the occlusion sampling pattern. Should be a prime number.\n * @param {Number} [options.worldDistanceThreshold] - The world distance threshold at which the occlusion effect starts to fade out.\n * @param {Number} [options.worldDistanceFalloff] - The world distance falloff. Influences the smoothness of the occlusion cutoff.\n * @param {Number} [options.worldProximityThreshold] - The world proximity threshold at which the occlusion starts to fade out.\n * @param {Number} [options.worldProximityFalloff] - The world proximity falloff. Influences the smoothness of the proximity cutoff.\n * @param {Number} [options.distanceThreshold=0.97] - Deprecated.\n * @param {Number} [options.distanceFalloff=0.03] - Deprecated.\n * @param {Number} [options.rangeThreshold=0.0005] - Deprecated.\n * @param {Number} [options.rangeFalloff=0.001] - Deprecated.\n * @param {Number} [options.minRadiusScale=0.1] - The minimum radius scale.\n * @param {Number} [options.luminanceInfluence=0.7] - Determines how much the luminance of the scene influences the ambient occlusion.\n * @param {Number} [options.radius=0.1825] - The occlusion sampling radius, expressed as a scale relative to the resolution. Range [1e-6, 1.0].\n * @param {Number} [options.intensity=1.0] - The intensity of the ambient occlusion.\n * @param {Number} [options.bias=0.025] - An occlusion bias. Eliminates artifacts caused by depth discontinuities.\n * @param {Number} [options.fade=0.01] - Influences the smoothness of the shadows. A lower value results in higher contrast.\n * @param {Color} [options.color=null] - The color of the ambient occlusion.\n * @param {Number} [options.resolutionScale=1.0] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n * @param {Number} [options.width=Resolution.AUTO_SIZE] - Deprecated. Use resolutionX instead.\n * @param {Number} [options.height=Resolution.AUTO_SIZE] - Deprecated. Use resolutionY instead.\n */\n constructor(camera, normalBuffer, {\n blendFunction = BlendFunction.MULTIPLY,\n samples = 9,\n rings = 7,\n normalDepthBuffer = null,\n depthAwareUpsampling = true,\n worldDistanceThreshold,\n worldDistanceFalloff,\n worldProximityThreshold,\n worldProximityFalloff,\n distanceThreshold = 0.97,\n distanceFalloff = 0.03,\n rangeThreshold = 5e-4,\n rangeFalloff = 1e-3,\n minRadiusScale = 0.1,\n luminanceInfluence = 0.7,\n radius = 0.1825,\n intensity = 1,\n bias = 0.025,\n fade = 0.01,\n color: color2 = null,\n resolutionScale = 1,\n width = Resolution.AUTO_SIZE,\n height = Resolution.AUTO_SIZE,\n resolutionX = width,\n resolutionY = height\n } = {}) {\n super(\"SSAOEffect\", ssao_default3, {\n blendFunction,\n attributes: EffectAttribute.DEPTH,\n defines: /* @__PURE__ */ new Map([\n [\"THRESHOLD\", \"0.997\"]\n ]),\n uniforms: /* @__PURE__ */ new Map([\n [\"aoBuffer\", new Uniform46(null)],\n [\"normalDepthBuffer\", new Uniform46(normalDepthBuffer)],\n [\"luminanceInfluence\", new Uniform46(luminanceInfluence)],\n [\"color\", new Uniform46(null)],\n [\"intensity\", new Uniform46(intensity)],\n [\"scale\", new Uniform46(0)]\n // Unused.\n ])\n });\n this.renderTarget = new WebGLRenderTarget21(1, 1, { depthBuffer: false });\n this.renderTarget.texture.name = \"AO.Target\";\n this.uniforms.get(\"aoBuffer\").value = this.renderTarget.texture;\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n this.camera = camera;\n this.depthDownsamplingPass = new DepthDownsamplingPass({ normalBuffer, resolutionScale });\n this.depthDownsamplingPass.enabled = normalDepthBuffer === null;\n this.ssaoPass = new ShaderPass(new SSAOMaterial(camera));\n const noiseTexture = new NoiseTexture(NOISE_TEXTURE_SIZE, NOISE_TEXTURE_SIZE, RGBAFormat4);\n noiseTexture.wrapS = noiseTexture.wrapT = RepeatWrapping3;\n const ssaoMaterial = this.ssaoMaterial;\n ssaoMaterial.normalBuffer = normalBuffer;\n ssaoMaterial.noiseTexture = noiseTexture;\n ssaoMaterial.minRadiusScale = minRadiusScale;\n ssaoMaterial.samples = samples;\n ssaoMaterial.radius = radius;\n ssaoMaterial.rings = rings;\n ssaoMaterial.fade = fade;\n ssaoMaterial.bias = bias;\n ssaoMaterial.distanceThreshold = distanceThreshold;\n ssaoMaterial.distanceFalloff = distanceFalloff;\n ssaoMaterial.proximityThreshold = rangeThreshold;\n ssaoMaterial.proximityFalloff = rangeFalloff;\n if (worldDistanceThreshold !== void 0) {\n ssaoMaterial.worldDistanceThreshold = worldDistanceThreshold;\n }\n if (worldDistanceFalloff !== void 0) {\n ssaoMaterial.worldDistanceFalloff = worldDistanceFalloff;\n }\n if (worldProximityThreshold !== void 0) {\n ssaoMaterial.worldProximityThreshold = worldProximityThreshold;\n }\n if (worldProximityFalloff !== void 0) {\n ssaoMaterial.worldProximityFalloff = worldProximityFalloff;\n }\n if (normalDepthBuffer !== null) {\n this.ssaoMaterial.normalDepthBuffer = normalDepthBuffer;\n this.defines.set(\"NORMAL_DEPTH\", \"1\");\n }\n this.depthAwareUpsampling = depthAwareUpsampling;\n this.color = color2;\n }\n set mainCamera(value) {\n this.camera = value;\n this.ssaoMaterial.copyCameraSettings(value);\n }\n /**\n * Sets the normal buffer.\n *\n * @type {Texture}\n */\n get normalBuffer() {\n return this.ssaoMaterial.normalBuffer;\n }\n set normalBuffer(value) {\n this.ssaoMaterial.normalBuffer = value;\n this.depthDownsamplingPass.fullscreenMaterial.normalBuffer = value;\n }\n /**\n * Returns the resolution settings.\n *\n * @deprecated Use resolution instead.\n * @return {Resolution} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * The SSAO material.\n *\n * @type {SSAOMaterial}\n */\n get ssaoMaterial() {\n return this.ssaoPass.fullscreenMaterial;\n }\n /**\n * Returns the SSAO material.\n *\n * @deprecated Use ssaoMaterial instead.\n * @return {SSAOMaterial} The material.\n */\n getSSAOMaterial() {\n return this.ssaoMaterial;\n }\n /**\n * The amount of occlusion samples per pixel.\n *\n * @type {Number}\n * @deprecated Use ssaoMaterial.samples instead.\n */\n get samples() {\n return this.ssaoMaterial.samples;\n }\n set samples(value) {\n this.ssaoMaterial.samples = value;\n }\n /**\n * The amount of spiral turns in the occlusion sampling pattern.\n *\n * @type {Number}\n * @deprecated Use ssaoMaterial.rings instead.\n */\n get rings() {\n return this.ssaoMaterial.rings;\n }\n set rings(value) {\n this.ssaoMaterial.rings = value;\n }\n /**\n * The occlusion sampling radius.\n *\n * @type {Number}\n * @deprecated Use ssaoMaterial.radius instead.\n */\n get radius() {\n return this.ssaoMaterial.radius;\n }\n set radius(value) {\n this.ssaoMaterial.radius = value;\n }\n /**\n * Indicates whether depth-aware upsampling is enabled.\n *\n * @type {Boolean}\n */\n get depthAwareUpsampling() {\n return this.defines.has(\"DEPTH_AWARE_UPSAMPLING\");\n }\n set depthAwareUpsampling(value) {\n if (this.depthAwareUpsampling !== value) {\n if (value) {\n this.defines.set(\"DEPTH_AWARE_UPSAMPLING\", \"1\");\n } else {\n this.defines.delete(\"DEPTH_AWARE_UPSAMPLING\");\n }\n this.setChanged();\n }\n }\n /**\n * Indicates whether depth-aware upsampling is enabled.\n *\n * @deprecated Use depthAwareUpsampling instead.\n * @return {Boolean} Whether depth-aware upsampling is enabled.\n */\n isDepthAwareUpsamplingEnabled() {\n return this.depthAwareUpsampling;\n }\n /**\n * Enables or disables depth-aware upsampling.\n *\n * @deprecated Use depthAwareUpsampling instead.\n * @param {Boolean} value - Whether depth-aware upsampling should be enabled.\n */\n setDepthAwareUpsamplingEnabled(value) {\n this.depthAwareUpsampling = value;\n }\n /**\n * Indicates whether distance-based radius scaling is enabled.\n *\n * @type {Boolean}\n * @deprecated\n */\n get distanceScaling() {\n return true;\n }\n set distanceScaling(value) {\n }\n /**\n * The color of the ambient occlusion. Set to `null` to disable.\n *\n * @type {Color}\n */\n get color() {\n return this.uniforms.get(\"color\").value;\n }\n set color(value) {\n const uniforms = this.uniforms;\n const defines = this.defines;\n if (value !== null) {\n if (defines.has(\"COLORIZE\")) {\n uniforms.get(\"color\").value.set(value);\n } else {\n defines.set(\"COLORIZE\", \"1\");\n uniforms.get(\"color\").value = new Color9(value);\n this.setChanged();\n }\n } else if (defines.has(\"COLORIZE\")) {\n defines.delete(\"COLORIZE\");\n uniforms.get(\"color\").value = null;\n this.setChanged();\n }\n }\n /**\n * The luminance influence factor. Range: [0.0, 1.0].\n *\n * @type {Boolean}\n */\n get luminanceInfluence() {\n return this.uniforms.get(\"luminanceInfluence\").value;\n }\n set luminanceInfluence(value) {\n this.uniforms.get(\"luminanceInfluence\").value = value;\n }\n /**\n * The intensity.\n *\n * @type {Number}\n */\n get intensity() {\n return this.uniforms.get(\"intensity\").value;\n }\n set intensity(value) {\n this.uniforms.get(\"intensity\").value = value;\n }\n /**\n * Returns the color of the ambient occlusion.\n *\n * @deprecated Use color instead.\n * @return {Color} The color.\n */\n getColor() {\n return this.color;\n }\n /**\n * Sets the color of the ambient occlusion. Set to `null` to disable colorization.\n *\n * @deprecated Use color instead.\n * @param {Color} value - The color.\n */\n setColor(value) {\n this.color = value;\n }\n /**\n * Sets the occlusion distance cutoff.\n *\n * @deprecated Use ssaoMaterial instead.\n * @param {Number} threshold - The distance threshold. Range [0.0, 1.0].\n * @param {Number} falloff - The falloff. Range [0.0, 1.0].\n */\n setDistanceCutoff(threshold, falloff) {\n this.ssaoMaterial.distanceThreshold = threshold;\n this.ssaoMaterial.distanceFalloff = falloff;\n }\n /**\n * Sets the occlusion proximity cutoff.\n *\n * @deprecated Use ssaoMaterial instead.\n * @param {Number} threshold - The proximity threshold. Range [0.0, 1.0].\n * @param {Number} falloff - The falloff. Range [0.0, 1.0].\n */\n setProximityCutoff(threshold, falloff) {\n this.ssaoMaterial.proximityThreshold = threshold;\n this.ssaoMaterial.proximityFalloff = falloff;\n }\n /**\n * Sets the depth texture.\n *\n * @param {Texture} depthTexture - A depth texture.\n * @param {DepthPackingStrategies} [depthPacking=BasicDepthPacking] - The depth packing.\n */\n setDepthTexture(depthTexture, depthPacking = BasicDepthPacking18) {\n this.depthDownsamplingPass.setDepthTexture(depthTexture, depthPacking);\n this.ssaoMaterial.depthBuffer = depthTexture;\n this.ssaoMaterial.depthPacking = depthPacking;\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n const renderTarget = this.renderTarget;\n if (this.depthDownsamplingPass.enabled) {\n this.depthDownsamplingPass.render(renderer);\n }\n this.ssaoPass.render(renderer, null, renderTarget);\n }\n /**\n * Sets the size.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n const w = resolution.width, h = resolution.height;\n this.ssaoMaterial.copyCameraSettings(this.camera);\n this.ssaoMaterial.setSize(w, h);\n this.renderTarget.setSize(w, h);\n this.depthDownsamplingPass.resolution.scale = resolution.scale;\n this.depthDownsamplingPass.setSize(width, height);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n try {\n let normalDepthBuffer = this.uniforms.get(\"normalDepthBuffer\").value;\n if (normalDepthBuffer === null) {\n this.depthDownsamplingPass.initialize(renderer, alpha, frameBufferType);\n normalDepthBuffer = this.depthDownsamplingPass.texture;\n this.uniforms.get(\"normalDepthBuffer\").value = normalDepthBuffer;\n this.ssaoMaterial.normalDepthBuffer = normalDepthBuffer;\n this.defines.set(\"NORMAL_DEPTH\", \"1\");\n }\n } catch (e) {\n this.depthDownsamplingPass.enabled = false;\n }\n }\n};\n\n// src/effects/TextureEffect.js\nimport { Uniform as Uniform47, UnsignedByteType as UnsignedByteType16 } from \"three\";\n\n// src/effects/glsl/texture.frag\nvar texture_default = \"#ifdef TEXTURE_PRECISION_HIGH\\nuniform mediump sampler2D map;\\n#else\\nuniform lowp sampler2D map;\\n#endif\\nvarying vec2 vUv2;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){\\n#ifdef UV_TRANSFORM\\nvec4 texel=texture2D(map,vUv2);\\n#else\\nvec4 texel=texture2D(map,uv);\\n#endif\\noutputColor=TEXEL;}\";\n\n// src/effects/glsl/texture.vert\nvar texture_default2 = \"#ifdef ASPECT_CORRECTION\\nuniform float scale;\\n#else\\nuniform mat3 uvTransform;\\n#endif\\nvarying vec2 vUv2;void mainSupport(const in vec2 uv){\\n#ifdef ASPECT_CORRECTION\\nvUv2=uv*vec2(aspect,1.0)*scale;\\n#else\\nvUv2=(uvTransform*vec3(uv,1.0)).xy;\\n#endif\\n}\";\n\n// src/effects/TextureEffect.js\nvar TextureEffect = class extends Effect {\n /**\n * Constructs a new texture effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {Texture} [options.texture] - A texture.\n * @param {Boolean} [options.aspectCorrection=false] - Deprecated. Adjust the texture's offset, repeat and center instead.\n */\n constructor({ blendFunction, texture = null, aspectCorrection = false } = {}) {\n super(\"TextureEffect\", texture_default, {\n blendFunction,\n defines: /* @__PURE__ */ new Map([\n [\"TEXEL\", \"texel\"]\n ]),\n uniforms: /* @__PURE__ */ new Map([\n [\"map\", new Uniform47(null)],\n [\"scale\", new Uniform47(1)],\n [\"uvTransform\", new Uniform47(null)]\n ])\n });\n this.texture = texture;\n this.aspectCorrection = aspectCorrection;\n }\n /**\n * The texture.\n *\n * @type {Texture}\n */\n get texture() {\n return this.uniforms.get(\"map\").value;\n }\n set texture(value) {\n const prevTexture = this.texture;\n const uniforms = this.uniforms;\n const defines = this.defines;\n if (prevTexture !== value) {\n uniforms.get(\"map\").value = value;\n uniforms.get(\"uvTransform\").value = value.matrix;\n defines.delete(\"TEXTURE_PRECISION_HIGH\");\n if (value !== null) {\n if (value.matrixAutoUpdate) {\n defines.set(\"UV_TRANSFORM\", \"1\");\n this.setVertexShader(texture_default2);\n } else {\n defines.delete(\"UV_TRANSFORM\");\n this.setVertexShader(null);\n }\n if (value.type !== UnsignedByteType16) {\n defines.set(\"TEXTURE_PRECISION_HIGH\", \"1\");\n }\n if (prevTexture === null || prevTexture.type !== value.type || prevTexture.encoding !== value.encoding) {\n this.setChanged();\n }\n }\n }\n }\n /**\n * Returns the texture.\n *\n * @deprecated Use texture instead.\n * @return {Texture} The texture.\n */\n getTexture() {\n return this.texture;\n }\n /**\n * Sets the texture.\n *\n * @deprecated Use texture instead.\n * @param {Texture} value - The texture.\n */\n setTexture(value) {\n this.texture = value;\n }\n /**\n * Indicates whether aspect correction is enabled.\n *\n * @type {Number}\n * @deprecated Adjust the texture's offset, repeat, rotation and center instead.\n */\n get aspectCorrection() {\n return this.defines.has(\"ASPECT_CORRECTION\");\n }\n set aspectCorrection(value) {\n if (this.aspectCorrection !== value) {\n if (value) {\n this.defines.set(\"ASPECT_CORRECTION\", \"1\");\n } else {\n this.defines.delete(\"ASPECT_CORRECTION\");\n }\n this.setChanged();\n }\n }\n /**\n * Indicates whether the texture UV coordinates will be transformed using the transformation matrix of the texture.\n *\n * @type {Boolean}\n * @deprecated Use texture.matrixAutoUpdate instead.\n */\n get uvTransform() {\n const texture = this.texture;\n return texture !== null && texture.matrixAutoUpdate;\n }\n set uvTransform(value) {\n const texture = this.texture;\n if (texture !== null) {\n texture.matrixAutoUpdate = value;\n }\n }\n /**\n * Sets the swizzles that will be applied to the components of a texel before it is written to the output color.\n *\n * @param {ColorChannel} r - The swizzle for the `r` component.\n * @param {ColorChannel} [g=r] - The swizzle for the `g` component.\n * @param {ColorChannel} [b=r] - The swizzle for the `b` component.\n * @param {ColorChannel} [a=r] - The swizzle for the `a` component.\n */\n setTextureSwizzleRGBA(r, g = r, b = r, a = r) {\n const rgba = \"rgba\";\n let swizzle = \"\";\n if (r !== ColorChannel.RED || g !== ColorChannel.GREEN || b !== ColorChannel.BLUE || a !== ColorChannel.ALPHA) {\n swizzle = [\".\", rgba[r], rgba[g], rgba[b], rgba[a]].join(\"\");\n }\n this.defines.set(\"TEXEL\", \"texel\" + swizzle);\n this.setChanged();\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n if (this.texture.matrixAutoUpdate) {\n this.texture.updateMatrix();\n }\n }\n};\n\n// src/effects/TiltShiftEffect.js\nimport { Uniform as Uniform48, Vector2 as Vector227, WebGLRenderTarget as WebGLRenderTarget22 } from \"three\";\n\n// src/effects/glsl/tilt-shift.frag\nvar tilt_shift_default = \"#ifdef FRAMEBUFFER_PRECISION_HIGH\\nuniform mediump sampler2D map;\\n#else\\nuniform lowp sampler2D map;\\n#endif\\nuniform vec2 maskParams;varying vec2 vUv2;float linearGradientMask(const in float x){return step(maskParams.x,x)-step(maskParams.y,x);}void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){float mask=linearGradientMask(vUv2.y);vec4 texel=texture2D(map,uv);outputColor=mix(texel,inputColor,mask);}\";\n\n// src/effects/glsl/tilt-shift.vert\nvar tilt_shift_default2 = \"uniform vec2 rotation;varying vec2 vUv2;void mainSupport(const in vec2 uv){vUv2=(uv-0.5)*2.0*vec2(aspect,1.0);vUv2=vec2(dot(rotation,vUv2),dot(rotation,vec2(vUv2.y,-vUv2.x)));}\";\n\n// src/effects/TiltShiftEffect.js\nvar TiltShiftEffect = class extends Effect {\n /**\n * Constructs a new tilt shift Effect\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {Number} [options.offset=0.0] - The relative offset of the focus area.\n * @param {Number} [options.rotation=0.0] - The rotation of the focus area in radians.\n * @param {Number} [options.focusArea=0.4] - The relative size of the focus area.\n * @param {Number} [options.feather=0.3] - The softness of the focus area edges.\n * @param {Number} [options.bias=0.06] - Deprecated.\n * @param {KernelSize} [options.kernelSize=KernelSize.MEDIUM] - The blur kernel size.\n * @param {Number} [options.resolutionScale=0.5] - The resolution scale.\n * @param {Number} [options.resolutionX=Resolution.AUTO_SIZE] - The horizontal resolution.\n * @param {Number} [options.resolutionY=Resolution.AUTO_SIZE] - The vertical resolution.\n */\n constructor({\n blendFunction,\n offset = 0,\n rotation = 0,\n focusArea = 0.4,\n feather = 0.3,\n kernelSize = KernelSize.MEDIUM,\n resolutionScale = 0.5,\n resolutionX = Resolution.AUTO_SIZE,\n resolutionY = Resolution.AUTO_SIZE\n } = {}) {\n super(\"TiltShiftEffect\", tilt_shift_default, {\n vertexShader: tilt_shift_default2,\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"rotation\", new Uniform48(new Vector227())],\n [\"maskParams\", new Uniform48(new Vector227())],\n [\"map\", new Uniform48(null)]\n ])\n });\n this._offset = offset;\n this._focusArea = focusArea;\n this._feather = feather;\n this.renderTarget = new WebGLRenderTarget22(1, 1, { depthBuffer: false });\n this.renderTarget.texture.name = \"TiltShift.Target\";\n this.uniforms.get(\"map\").value = this.renderTarget.texture;\n this.blurPass = new TiltShiftBlurPass({\n kernelSize,\n resolutionScale,\n resolutionX,\n resolutionY,\n offset,\n rotation,\n focusArea,\n feather\n });\n const resolution = this.resolution = new Resolution(this, resolutionX, resolutionY, resolutionScale);\n resolution.addEventListener(\"change\", (e) => this.setSize(resolution.baseWidth, resolution.baseHeight));\n this.rotation = rotation;\n this.updateParams();\n }\n /**\n * Updates the mask params.\n *\n * @private\n */\n updateParams() {\n const params = this.uniforms.get(\"maskParams\").value;\n const x = Math.max(this.focusArea - this.feather, 0);\n params.set(this.offset - x, this.offset + x);\n }\n /**\n * The rotation of the focus area in radians.\n *\n * @type {Number}\n */\n get rotation() {\n return Math.acos(this.uniforms.get(\"rotation\").value.x);\n }\n set rotation(value) {\n this.uniforms.get(\"rotation\").value.set(Math.cos(value), Math.sin(value));\n this.blurPass.blurMaterial.rotation = value;\n }\n /**\n * The relative offset of the focus area.\n *\n * @type {Number}\n */\n get offset() {\n return this._offset;\n }\n set offset(value) {\n this._offset = value;\n this.blurPass.blurMaterial.offset = value;\n this.updateParams();\n }\n /**\n * The relative size of the focus area.\n *\n * @type {Number}\n */\n get focusArea() {\n return this._focusArea;\n }\n set focusArea(value) {\n this._focusArea = value;\n this.blurPass.blurMaterial.focusArea = value;\n this.updateParams();\n }\n /**\n * The softness of the focus area edges.\n *\n * @type {Number}\n */\n get feather() {\n return this._feather;\n }\n set feather(value) {\n this._feather = value;\n this.blurPass.blurMaterial.feather = value;\n this.updateParams();\n }\n /**\n * A blend bias.\n *\n * @type {Number}\n * @deprecated\n */\n get bias() {\n return 0;\n }\n set bias(value) {\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n this.blurPass.render(renderer, inputBuffer, this.renderTarget);\n }\n /**\n * Updates the size of internal render targets.\n *\n * @param {Number} width - The width.\n * @param {Number} height - The height.\n */\n setSize(width, height) {\n const resolution = this.resolution;\n resolution.setBaseSize(width, height);\n this.renderTarget.setSize(resolution.width, resolution.height);\n this.blurPass.resolution.copy(resolution);\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n this.blurPass.initialize(renderer, alpha, frameBufferType);\n if (frameBufferType !== void 0) {\n this.renderTarget.texture.type = frameBufferType;\n if (getOutputColorSpace(renderer) === SRGBColorSpace) {\n setTextureColorSpace(this.renderTarget.texture, SRGBColorSpace);\n }\n }\n }\n};\n\n// src/effects/ToneMappingEffect.js\nimport { LinearMipmapLinearFilter, Uniform as Uniform49, WebGLRenderTarget as WebGLRenderTarget23 } from \"three\";\n\n// src/effects/glsl/tone-mapping.frag\nvar tone_mapping_default = \"#include <tonemapping_pars_fragment>\\n#if THREE_REVISION < 143\\n#define luminance(v) linearToRelativeLuminance(v)\\n#endif\\nuniform float whitePoint;\\n#if TONE_MAPPING_MODE == 1 || TONE_MAPPING_MODE == 2\\nuniform float middleGrey;\\n#if TONE_MAPPING_MODE == 2\\nuniform lowp sampler2D luminanceBuffer;\\n#else\\nuniform float averageLuminance;\\n#endif\\nvec3 Reinhard2ToneMapping(vec3 color){color*=toneMappingExposure;float l=luminance(color);\\n#if TONE_MAPPING_MODE == 2\\nfloat lumAvg=unpackRGBAToFloat(texture2D(luminanceBuffer,vec2(0.5)));\\n#else\\nfloat lumAvg=averageLuminance;\\n#endif\\nfloat lumScaled=(l*middleGrey)/max(lumAvg,1e-6);float lumCompressed=lumScaled*(1.0+lumScaled/(whitePoint*whitePoint));lumCompressed/=(1.0+lumScaled);return clamp(lumCompressed*color,0.0,1.0);}\\n#elif TONE_MAPPING_MODE == 5\\n#define A 0.15\\n#define B 0.50\\n#define C 0.10\\n#define D 0.20\\n#define E 0.02\\n#define F 0.30\\nvec3 Uncharted2Helper(const in vec3 x){return((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;}vec3 Uncharted2ToneMapping(vec3 color){color*=toneMappingExposure;return clamp(Uncharted2Helper(color)/Uncharted2Helper(vec3(whitePoint)),0.0,1.0);}\\n#endif\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){\\n#if TONE_MAPPING_MODE == 1 || TONE_MAPPING_MODE == 2\\noutputColor=vec4(Reinhard2ToneMapping(inputColor.rgb),inputColor.a);\\n#elif TONE_MAPPING_MODE == 5\\noutputColor=vec4(Uncharted2ToneMapping(inputColor.rgb),inputColor.a);\\n#else\\noutputColor=vec4(toneMapping(inputColor.rgb),inputColor.a);\\n#endif\\n}\";\n\n// src/effects/ToneMappingEffect.js\nvar ToneMappingEffect = class extends Effect {\n /**\n * Constructs a new tone mapping effect.\n *\n * The additional parameters only affect the Reinhard2 operator.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction=BlendFunction.SRC] - The blend function of this effect.\n * @param {Boolean} [options.adaptive=false] - Deprecated. Use mode instead.\n * @param {ToneMappingMode} [options.mode=ToneMappingMode.ACES_FILMIC] - The tone mapping mode.\n * @param {Number} [options.resolution=256] - The resolution of the luminance texture. Must be a power of two.\n * @param {Number} [options.maxLuminance=4.0] - Deprecated. Same as whitePoint.\n * @param {Number} [options.whitePoint=4.0] - The white point.\n * @param {Number} [options.middleGrey=0.6] - The middle grey factor.\n * @param {Number} [options.minLuminance=0.01] - The minimum luminance. Prevents very high exposure in dark scenes.\n * @param {Number} [options.averageLuminance=1.0] - The average luminance. Used for the non-adaptive Reinhard operator.\n * @param {Number} [options.adaptationRate=1.0] - The luminance adaptation rate.\n */\n constructor({\n blendFunction = BlendFunction.SRC,\n adaptive = false,\n mode = adaptive ? ToneMappingMode.REINHARD2_ADAPTIVE : ToneMappingMode.ACES_FILMIC,\n resolution = 256,\n maxLuminance = 4,\n whitePoint = maxLuminance,\n middleGrey = 0.6,\n minLuminance = 0.01,\n averageLuminance = 1,\n adaptationRate = 1\n } = {}) {\n super(\"ToneMappingEffect\", tone_mapping_default, {\n blendFunction,\n uniforms: /* @__PURE__ */ new Map([\n [\"luminanceBuffer\", new Uniform49(null)],\n [\"maxLuminance\", new Uniform49(maxLuminance)],\n // Unused\n [\"whitePoint\", new Uniform49(whitePoint)],\n [\"middleGrey\", new Uniform49(middleGrey)],\n [\"averageLuminance\", new Uniform49(averageLuminance)]\n ])\n });\n this.renderTargetLuminance = new WebGLRenderTarget23(1, 1, {\n minFilter: LinearMipmapLinearFilter,\n depthBuffer: false\n });\n this.renderTargetLuminance.texture.generateMipmaps = true;\n this.renderTargetLuminance.texture.name = \"Luminance\";\n this.luminancePass = new LuminancePass({\n renderTarget: this.renderTargetLuminance\n });\n this.adaptiveLuminancePass = new AdaptiveLuminancePass(this.luminancePass.texture, {\n minLuminance,\n adaptationRate\n });\n this.uniforms.get(\"luminanceBuffer\").value = this.adaptiveLuminancePass.texture;\n this.resolution = resolution;\n this.mode = mode;\n }\n /**\n * The tone mapping mode.\n *\n * @type {ToneMappingMode}\n */\n get mode() {\n return Number(this.defines.get(\"TONE_MAPPING_MODE\"));\n }\n set mode(value) {\n if (this.mode !== value) {\n this.defines.clear();\n this.defines.set(\"TONE_MAPPING_MODE\", value.toFixed(0));\n switch (value) {\n case ToneMappingMode.REINHARD:\n this.defines.set(\"toneMapping(texel)\", \"ReinhardToneMapping(texel)\");\n break;\n case ToneMappingMode.OPTIMIZED_CINEON:\n this.defines.set(\"toneMapping(texel)\", \"OptimizedCineonToneMapping(texel)\");\n break;\n case ToneMappingMode.ACES_FILMIC:\n this.defines.set(\"toneMapping(texel)\", \"ACESFilmicToneMapping(texel)\");\n break;\n default:\n this.defines.set(\"toneMapping(texel)\", \"texel\");\n break;\n }\n this.adaptiveLuminancePass.enabled = value === ToneMappingMode.REINHARD2_ADAPTIVE;\n this.setChanged();\n }\n }\n /**\n * Returns the current tone mapping mode.\n *\n * @deprecated Use mode instead.\n * @return {ToneMappingMode} The tone mapping mode.\n */\n getMode() {\n return this.mode;\n }\n /**\n * Sets the tone mapping mode.\n *\n * @deprecated Use mode instead.\n * @param {ToneMappingMode} value - The tone mapping mode.\n */\n setMode(value) {\n this.mode = value;\n }\n /**\n * The white point. Default is `4.0`.\n *\n * Only applies to Reinhard2 (Modified & Adaptive).\n *\n * @type {Number}\n */\n get whitePoint() {\n return this.uniforms.get(\"whitePoint\").value;\n }\n set whitePoint(value) {\n this.uniforms.get(\"whitePoint\").value = value;\n }\n /**\n * The middle grey factor. Default is `0.6`.\n *\n * Only applies to Reinhard2 (Modified & Adaptive).\n *\n * @type {Number}\n */\n get middleGrey() {\n return this.uniforms.get(\"middleGrey\").value;\n }\n set middleGrey(value) {\n this.uniforms.get(\"middleGrey\").value = value;\n }\n /**\n * The average luminance.\n *\n * Only applies to Reinhard2 (Modified).\n *\n * @type {Number}\n */\n get averageLuminance() {\n return this.uniforms.get(\"averageLuminance\").value;\n }\n set averageLuminance(value) {\n this.uniforms.get(\"averageLuminance\").value = value;\n }\n /**\n * The adaptive luminance material.\n *\n * @type {AdaptiveLuminanceMaterial}\n */\n get adaptiveLuminanceMaterial() {\n return this.adaptiveLuminancePass.fullscreenMaterial;\n }\n /**\n * Returns the adaptive luminance material.\n *\n * @deprecated Use adaptiveLuminanceMaterial instead.\n * @return {AdaptiveLuminanceMaterial} The material.\n */\n getAdaptiveLuminanceMaterial() {\n return this.adaptiveLuminanceMaterial;\n }\n /**\n * The resolution of the luminance texture. Must be a power of two.\n *\n * @type {Number}\n */\n get resolution() {\n return this.luminancePass.resolution.width;\n }\n set resolution(value) {\n const exponent = Math.max(0, Math.ceil(Math.log2(value)));\n const size = Math.pow(2, exponent);\n this.luminancePass.resolution.setPreferredSize(size, size);\n this.adaptiveLuminanceMaterial.mipLevel1x1 = exponent;\n }\n /**\n * Returns the resolution of the luminance texture.\n *\n * @deprecated Use resolution instead.\n * @return {Number} The resolution.\n */\n getResolution() {\n return this.resolution;\n }\n /**\n * Sets the resolution of the luminance texture. Must be a power of two.\n *\n * @deprecated Use resolution instead.\n * @param {Number} value - The resolution.\n */\n setResolution(value) {\n this.resolution = value;\n }\n /**\n * Indicates whether this pass uses adaptive luminance.\n *\n * @type {Boolean}\n * @deprecated Use mode instead.\n */\n get adaptive() {\n return this.mode === ToneMappingMode.REINHARD2_ADAPTIVE;\n }\n set adaptive(value) {\n this.mode = value ? ToneMappingMode.REINHARD2_ADAPTIVE : ToneMappingMode.REINHARD2;\n }\n /**\n * The luminance adaptation rate.\n *\n * @type {Number}\n * @deprecated Use adaptiveLuminanceMaterial.adaptationRate instead.\n */\n get adaptationRate() {\n return this.adaptiveLuminanceMaterial.adaptationRate;\n }\n set adaptationRate(value) {\n this.adaptiveLuminanceMaterial.adaptationRate = value;\n }\n /**\n * @type {Number}\n * @deprecated\n */\n get distinction() {\n console.warn(this.name, \"distinction was removed.\");\n return 1;\n }\n set distinction(value) {\n console.warn(this.name, \"distinction was removed.\");\n }\n /**\n * Updates this effect.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.\n * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.\n */\n update(renderer, inputBuffer, deltaTime) {\n if (this.adaptiveLuminancePass.enabled) {\n this.luminancePass.render(renderer, inputBuffer);\n this.adaptiveLuminancePass.render(renderer, null, null, deltaTime);\n }\n }\n /**\n * Performs initialization tasks.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.\n * @param {Number} frameBufferType - The type of the main frame buffers.\n */\n initialize(renderer, alpha, frameBufferType) {\n this.adaptiveLuminancePass.initialize(renderer, alpha, frameBufferType);\n }\n};\n\n// src/effects/VignetteEffect.js\nimport { Uniform as Uniform50 } from \"three\";\n\n// src/effects/glsl/vignette.frag\nvar vignette_default = \"uniform float offset;uniform float darkness;void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){const vec2 center=vec2(0.5);vec3 color=inputColor.rgb;\\n#if VIGNETTE_TECHNIQUE == 0\\nfloat d=distance(uv,center);color*=smoothstep(0.8,offset*0.799,d*(darkness+offset));\\n#else\\nvec2 coord=(uv-center)*vec2(offset);color=mix(color,vec3(1.0-darkness),dot(coord,coord));\\n#endif\\noutputColor=vec4(color,inputColor.a);}\";\n\n// src/effects/VignetteEffect.js\nvar VignetteEffect = class extends Effect {\n /**\n * Constructs a new Vignette effect.\n *\n * @param {Object} [options] - The options.\n * @param {BlendFunction} [options.blendFunction] - The blend function of this effect.\n * @param {VignetteTechnique} [options.technique=VignetteTechnique.DEFAULT] - The Vignette technique.\n * @param {Boolean} [options.eskil=false] - Deprecated. Use technique instead.\n * @param {Number} [options.offset=0.5] - The Vignette offset.\n * @param {Number} [options.darkness=0.5] - The Vignette darkness.\n */\n constructor({\n blendFunction,\n technique = VignetteTechnique.DEFAULT,\n eskil = false,\n offset = 0.5,\n darkness = 0.5\n } = {}) {\n super(\"VignetteEffect\", vignette_default, {\n blendFunction,\n defines: /* @__PURE__ */ new Map([\n [\"VIGNETTE_TECHNIQUE\", technique.toFixed(0)]\n ]),\n uniforms: /* @__PURE__ */ new Map([\n [\"offset\", new Uniform50(offset)],\n [\"darkness\", new Uniform50(darkness)]\n ])\n });\n }\n /**\n * The Vignette technique.\n *\n * @type {VignetteTechnique}\n */\n get technique() {\n return Number(this.defines.get(\"VIGNETTE_TECHNIQUE\"));\n }\n set technique(value) {\n if (this.technique !== value) {\n this.defines.set(\"VIGNETTE_TECHNIQUE\", value.toFixed(0));\n this.setChanged();\n }\n }\n /**\n * Indicates whether Eskil's Vignette technique is enabled.\n *\n * @type {Boolean}\n * @deprecated Use technique instead.\n */\n get eskil() {\n return this.technique === VignetteTechnique.ESKIL;\n }\n /**\n * Indicates whether Eskil's Vignette technique is enabled.\n *\n * @type {Boolean}\n * @deprecated Use technique instead.\n */\n set eskil(value) {\n this.technique = value ? VignetteTechnique.ESKIL : VignetteTechnique.DEFAULT;\n }\n /**\n * Returns the Vignette technique.\n *\n * @deprecated Use technique instead.\n * @return {VignetteTechnique} The technique.\n */\n getTechnique() {\n return this.technique;\n }\n /**\n * Sets the Vignette technique.\n *\n * @deprecated Use technique instead.\n * @param {VignetteTechnique} value - The technique.\n */\n setTechnique(value) {\n this.technique = value;\n }\n /**\n * The Vignette offset.\n *\n * @type {Number}\n */\n get offset() {\n return this.uniforms.get(\"offset\").value;\n }\n set offset(value) {\n this.uniforms.get(\"offset\").value = value;\n }\n /**\n * Returns the Vignette offset.\n *\n * @deprecated Use offset instead.\n * @return {Number} The offset.\n */\n getOffset() {\n return this.offset;\n }\n /**\n * Sets the Vignette offset.\n *\n * @deprecated Use offset instead.\n * @param {Number} value - The offset.\n */\n setOffset(value) {\n this.offset = value;\n }\n /**\n * The Vignette darkness.\n *\n * @type {Number}\n */\n get darkness() {\n return this.uniforms.get(\"darkness\").value;\n }\n set darkness(value) {\n this.uniforms.get(\"darkness\").value = value;\n }\n /**\n * Returns the Vignette darkness.\n *\n * @deprecated Use darkness instead.\n * @return {Number} The darkness.\n */\n getDarkness() {\n return this.darkness;\n }\n /**\n * Sets the Vignette darkness.\n *\n * @deprecated Use darkness instead.\n * @param {Number} value - The darkness.\n */\n setDarkness(value) {\n this.darkness = value;\n }\n};\n\n// src/loaders/LUT3dlLoader.js\nimport { FileLoader, Loader, LoadingManager as LoadingManager3 } from \"three\";\nvar LUT3dlLoader = class extends Loader {\n /**\n * Loads a LUT.\n *\n * @param {String} url - The URL of the 3dl-file.\n * @param {Function} [onLoad] - A callback that receives the loaded lookup texture.\n * @param {Function} [onProgress] - A progress callback that receives the XMLHttpRequest instance.\n * @param {Function} [onError] - An error callback that receives the URL of the file that failed to load.\n * @return {Promise<LookupTexture>} A promise that returns the lookup texture.\n */\n load(url, onLoad = () => {\n }, onProgress = () => {\n }, onError = null) {\n const externalManager = this.manager;\n const internalManager = new LoadingManager3();\n const loader = new FileLoader(internalManager);\n loader.setPath(this.path);\n loader.setResponseType(\"text\");\n return new Promise((resolve, reject) => {\n internalManager.onError = (url2) => {\n externalManager.itemError(url2);\n if (onError !== null) {\n onError(`Failed to load ${url2}`);\n resolve();\n } else {\n reject(`Failed to load ${url2}`);\n }\n };\n externalManager.itemStart(url);\n loader.load(url, (data) => {\n try {\n const result = this.parse(data);\n externalManager.itemEnd(url);\n onLoad(result);\n resolve(result);\n } catch (e) {\n console.error(e);\n internalManager.onError(url);\n }\n }, onProgress);\n });\n }\n /**\n * Parses the given data.\n *\n * @param {String} input - The LUT data.\n * @return {LookupTexture} The lookup texture.\n * @throws {Error} Fails if the data is invalid.\n */\n parse(input) {\n const regExpGridInfo = /^[\\d ]+$/m;\n const regExpDataPoints = /^([\\d.e+-]+) +([\\d.e+-]+) +([\\d.e+-]+) *$/gm;\n let result = regExpGridInfo.exec(input);\n if (result === null) {\n throw new Error(\"Missing grid information\");\n }\n const gridLines = result[0].trim().split(/\\s+/g).map((n) => Number(n));\n const gridStep = gridLines[1] - gridLines[0];\n const size = gridLines.length;\n const sizeSq = size ** 2;\n for (let i = 1, l = gridLines.length; i < l; ++i) {\n if (gridStep !== gridLines[i] - gridLines[i - 1]) {\n throw new Error(\"Inconsistent grid size\");\n }\n }\n const data = new Float32Array(size ** 3 * 4);\n let maxValue = 0;\n let index = 0;\n while ((result = regExpDataPoints.exec(input)) !== null) {\n const r = Number(result[1]);\n const g = Number(result[2]);\n const b = Number(result[3]);\n maxValue = Math.max(maxValue, r, g, b);\n const bLayer = index % size;\n const gLayer = Math.floor(index / size) % size;\n const rLayer = Math.floor(index / sizeSq) % size;\n const d4 = (bLayer * sizeSq + gLayer * size + rLayer) * 4;\n data[d4 + 0] = r;\n data[d4 + 1] = g;\n data[d4 + 2] = b;\n data[d4 + 3] = 1;\n ++index;\n }\n const bits = Math.ceil(Math.log2(maxValue));\n const maxBitValue = Math.pow(2, bits);\n for (let i = 0, l = data.length; i < l; i += 4) {\n data[i + 0] /= maxBitValue;\n data[i + 1] /= maxBitValue;\n data[i + 2] /= maxBitValue;\n }\n return new LookupTexture(data, size);\n }\n};\n\n// src/loaders/LUTCubeLoader.js\nimport { FileLoader as FileLoader2, Loader as Loader2, LoadingManager as LoadingManager4, Vector3 as Vector37 } from \"three\";\nvar LUTCubeLoader = class extends Loader2 {\n /**\n * Loads a LUT.\n *\n * @param {String} url - The URL of the CUBE-file.\n * @param {Function} [onLoad] - A callback that receives the loaded lookup texture.\n * @param {Function} [onProgress] - A progress callback that receives the XMLHttpRequest instance.\n * @param {Function} [onError] - An error callback that receives the URL of the file that failed to load.\n * @return {Promise<LookupTexture>} A promise that returns the lookup texture.\n */\n load(url, onLoad = () => {\n }, onProgress = () => {\n }, onError = null) {\n const externalManager = this.manager;\n const internalManager = new LoadingManager4();\n const loader = new FileLoader2(internalManager);\n loader.setPath(this.path);\n loader.setResponseType(\"text\");\n return new Promise((resolve, reject) => {\n internalManager.onError = (url2) => {\n externalManager.itemError(url2);\n if (onError !== null) {\n onError(`Failed to load ${url2}`);\n resolve();\n } else {\n reject(`Failed to load ${url2}`);\n }\n };\n externalManager.itemStart(url);\n loader.load(url, (data) => {\n try {\n const result = this.parse(data);\n externalManager.itemEnd(url);\n onLoad(result);\n resolve(result);\n } catch (e) {\n console.error(e);\n internalManager.onError(url);\n }\n }, onProgress);\n });\n }\n /**\n * Parses the given data.\n *\n * @param {String} input - The LUT data.\n * @return {LookupTexture} The lookup texture.\n * @throws {Error} Fails if the data is invalid.\n */\n parse(input) {\n const regExpTitle = /TITLE +\"([^\"]*)\"/;\n const regExpSize = /LUT_3D_SIZE +(\\d+)/;\n const regExpDomainMin = /DOMAIN_MIN +([\\d.]+) +([\\d.]+) +([\\d.]+)/;\n const regExpDomainMax = /DOMAIN_MAX +([\\d.]+) +([\\d.]+) +([\\d.]+)/;\n const regExpDataPoints = /^([\\d.e+-]+) +([\\d.e+-]+) +([\\d.e+-]+) *$/gm;\n let result = regExpTitle.exec(input);\n const title = result !== null ? result[1] : null;\n result = regExpSize.exec(input);\n if (result === null) {\n throw new Error(\"Missing LUT_3D_SIZE information\");\n }\n const size = Number(result[1]);\n const data = new Float32Array(size ** 3 * 4);\n const domainMin = new Vector37(0, 0, 0);\n const domainMax = new Vector37(1, 1, 1);\n result = regExpDomainMin.exec(input);\n if (result !== null) {\n domainMin.set(Number(result[1]), Number(result[2]), Number(result[3]));\n }\n result = regExpDomainMax.exec(input);\n if (result !== null) {\n domainMax.set(Number(result[1]), Number(result[2]), Number(result[3]));\n }\n if (domainMin.x > domainMax.x || domainMin.y > domainMax.y || domainMin.z > domainMax.z) {\n domainMin.set(0, 0, 0);\n domainMax.set(1, 1, 1);\n throw new Error(\"Invalid input domain\");\n }\n let i = 0;\n while ((result = regExpDataPoints.exec(input)) !== null) {\n data[i++] = Number(result[1]);\n data[i++] = Number(result[2]);\n data[i++] = Number(result[3]);\n data[i++] = 1;\n }\n const lut = new LookupTexture(data, size);\n lut.domainMin.copy(domainMin);\n lut.domainMax.copy(domainMax);\n if (title !== null) {\n lut.name = title;\n }\n return lut;\n }\n};\n\n// src/loaders/SMAAImageLoader.js\nimport { Loader as Loader3, LoadingManager as LoadingManager5 } from \"three\";\nvar SMAAImageLoader = class extends Loader3 {\n /**\n * Loads the SMAA data images.\n *\n * @param {Function} [onLoad] - A callback that receives the search image and area image as a pair.\n * @param {Function} [onError] - An error callback that receives the URL of the image that failed to load.\n * @return {Promise<Image[]>} A promise that returns the search image and area image as a pair.\n */\n load(onLoad = () => {\n }, onError = null) {\n if (arguments.length === 4) {\n onLoad = arguments[1];\n onError = arguments[3];\n } else if (arguments.length === 3 || typeof arguments[0] !== \"function\") {\n onLoad = arguments[1];\n onError = null;\n }\n const externalManager = this.manager;\n const internalManager = new LoadingManager5();\n return new Promise((resolve, reject) => {\n const searchImage = new Image();\n const areaImage = new Image();\n internalManager.onError = (url) => {\n externalManager.itemError(url);\n if (onError !== null) {\n onError(`Failed to load ${url}`);\n resolve();\n } else {\n reject(`Failed to load ${url}`);\n }\n };\n internalManager.onLoad = () => {\n const result = [searchImage, areaImage];\n onLoad(result);\n resolve(result);\n };\n searchImage.addEventListener(\"error\", (e) => {\n internalManager.itemError(\"smaa-search\");\n });\n areaImage.addEventListener(\"error\", (e) => {\n internalManager.itemError(\"smaa-area\");\n });\n searchImage.addEventListener(\"load\", () => {\n externalManager.itemEnd(\"smaa-search\");\n internalManager.itemEnd(\"smaa-search\");\n });\n areaImage.addEventListener(\"load\", () => {\n externalManager.itemEnd(\"smaa-area\");\n internalManager.itemEnd(\"smaa-area\");\n });\n externalManager.itemStart(\"smaa-search\");\n externalManager.itemStart(\"smaa-area\");\n internalManager.itemStart(\"smaa-search\");\n internalManager.itemStart(\"smaa-area\");\n searchImage.src = searchImageDataURL_default;\n areaImage.src = areaImageDataURL_default;\n });\n }\n};\nexport {\n AdaptiveLuminanceMaterial,\n AdaptiveLuminancePass,\n BlendFunction,\n BlendMode,\n BloomEffect,\n KawaseBlurPass as BlurPass,\n BokehEffect,\n BokehMaterial,\n BoxBlurMaterial,\n BoxBlurPass,\n BrightnessContrastEffect,\n ChromaticAberrationEffect,\n CircleOfConfusionMaterial,\n ClearMaskPass,\n ClearPass,\n ColorAverageEffect,\n ColorChannel,\n ColorDepthEffect,\n EdgeDetectionMaterial as ColorEdgesMaterial,\n KawaseBlurMaterial as ConvolutionMaterial,\n CopyMaterial,\n CopyPass,\n DepthComparisonMaterial,\n DepthCopyMaterial,\n DepthCopyMode,\n DepthCopyPass,\n DepthDownsamplingMaterial,\n DepthDownsamplingPass,\n DepthEffect,\n DepthMaskMaterial,\n DepthOfFieldEffect,\n DepthPass,\n DepthPickingPass,\n DepthCopyPass as DepthSavePass,\n DepthTestStrategy,\n DisplayP3ColorSpace,\n Disposable,\n DotScreenEffect,\n DownsamplingMaterial,\n EdgeDetectionMaterial,\n EdgeDetectionMode,\n Effect,\n EffectAttribute,\n EffectComposer,\n EffectMaterial,\n EffectPass,\n EffectShaderData,\n EffectShaderSection,\n FXAAEffect,\n GammaCorrectionEffect,\n GaussKernel,\n GaussianBlurMaterial,\n GaussianBlurPass,\n GlitchEffect,\n GlitchMode,\n GodRaysEffect,\n GodRaysMaterial,\n GridEffect,\n HueSaturationEffect,\n ImmutableTimer,\n Initializable,\n KawaseBlurMaterial,\n KawaseBlurPass,\n KernelSize,\n LUT1DEffect,\n LUT3DEffect,\n LUT3dlLoader,\n LUTCubeLoader,\n LUT3DEffect as LUTEffect,\n LUTOperation,\n LambdaPass,\n LensDistortionEffect,\n LinearSRGBColorSpace,\n LookupTexture,\n LookupTexture as LookupTexture3D,\n LuminanceMaterial,\n LuminancePass,\n MaskFunction,\n MaskMaterial,\n MaskPass,\n MipmapBlurPass,\n NoColorSpace,\n NoiseEffect,\n NoiseTexture,\n NormalPass,\n OutlineMaterial as OutlineEdgesMaterial,\n OutlineEffect,\n OutlineMaterial,\n OverrideMaterialManager,\n Pass,\n PixelationEffect,\n PredicationMode,\n RawImageData,\n RealisticBokehEffect,\n RenderPass,\n Resizable,\n Resolution as Resizer,\n Resolution,\n SMAAAreaImageData,\n SMAAEffect,\n SMAAImageGenerator,\n SMAAImageLoader,\n SMAAPreset,\n SMAASearchImageData,\n SMAAWeightsMaterial,\n SRGBColorSpace,\n SSAOEffect,\n SSAOMaterial,\n CopyPass as SavePass,\n ScanlineEffect,\n EffectShaderSection as Section,\n Selection,\n SelectiveBloomEffect,\n SepiaEffect,\n ShaderPass,\n ShockWaveEffect,\n TetrahedralUpscaler,\n TextureEffect,\n TiltShiftBlurMaterial,\n TiltShiftBlurPass,\n TiltShiftEffect,\n Timer,\n ToneMappingEffect,\n ToneMappingMode,\n UpsamplingMaterial,\n VignetteEffect,\n VignetteTechnique,\n WebGLExtension\n};\n","var img = \"data:image/png;base64,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\";\n export default img;","import { Pass } from \"postprocessing\"\nimport {\n\tHalfFloatType,\n\tNoColorSpace,\n\tMatrix4,\n\tNearestFilter,\n\tNoBlending,\n\tRepeatWrapping,\n\tShaderMaterial,\n\tTextureLoader,\n\tVector2,\n\tWebGLRenderTarget\n} from \"three\"\nimport blueNoiseImage from \"../utils/LDR_RGBA_0.png\"\nimport vertexShader from \"../utils/shader/basic.vert\"\nimport sampleBlueNoise from \"../utils/shader/sampleBlueNoise.glsl\"\n\n// a general AO pass that can be used for any AO algorithm\nclass AOPass extends Pass {\n\tconstructor(camera, scene, fragmentShader) {\n\t\tsuper()\n\t\tthis._camera = camera\n\t\tthis._scene = scene\n\n\t\tthis.renderTarget = new WebGLRenderTarget(1, 1, {\n\t\t\ttype: HalfFloatType,\n\t\t\tdepthBuffer: false\n\t\t})\n\n\t\tconst finalFragmentShader = fragmentShader.replace(\"#include <sampleBlueNoise>\", sampleBlueNoise)\n\n\t\tthis.fullscreenMaterial = new ShaderMaterial({\n\t\t\tfragmentShader: finalFragmentShader,\n\t\t\tvertexShader,\n\n\t\t\tuniforms: {\n\t\t\t\tdepthTexture: { value: null },\n\t\t\t\tnormalTexture: { value: null },\n\t\t\t\tcameraNear: { value: 0 },\n\t\t\t\tcameraFar: { value: 0 },\n\t\t\t\tviewMatrix: { value: this._camera.matrixWorldInverse },\n\t\t\t\tprojectionViewMatrix: { value: new Matrix4() },\n\t\t\t\tprojectionMatrixInverse: { value: this._camera.projectionMatrixInverse },\n\t\t\t\tcameraMatrixWorld: { value: this._camera.matrixWorld },\n\t\t\t\ttexSize: { value: new Vector2() },\n\t\t\t\tblueNoiseTexture: { value: null },\n\t\t\t\tblueNoiseRepeat: { value: new Vector2() },\n\t\t\t\taoDistance: { value: 0 },\n\t\t\t\tdistancePower: { value: 0 },\n\t\t\t\tbias: { value: 0 },\n\t\t\t\tthickness: { value: 0 },\n\t\t\t\tpower: { value: 0 },\n\t\t\t\tframe: { value: 0 }\n\t\t\t},\n\n\t\t\tblending: NoBlending,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t\ttoneMapped: false\n\t\t})\n\n\t\tnew TextureLoader().load(blueNoiseImage, blueNoiseTexture => {\n\t\t\tblueNoiseTexture.minFilter = NearestFilter\n\t\t\tblueNoiseTexture.magFilter = NearestFilter\n\t\t\tblueNoiseTexture.wrapS = RepeatWrapping\n\t\t\tblueNoiseTexture.wrapT = RepeatWrapping\n\t\t\tblueNoiseTexture.colorSpace = NoColorSpace\n\n\t\t\tthis.fullscreenMaterial.uniforms.blueNoiseTexture.value = blueNoiseTexture\n\t\t})\n\t}\n\n\tget texture() {\n\t\treturn this.renderTarget.texture\n\t}\n\n\tsetSize(width, height) {\n\t\tthis.renderTarget.setSize(width, height)\n\n\t\tthis.fullscreenMaterial.uniforms.texSize.value.set(this.renderTarget.width, this.renderTarget.height)\n\t}\n\n\trender(renderer) {\n\t\tconst spp = +this.fullscreenMaterial.defines.spp\n\n\t\tthis.fullscreenMaterial.uniforms.frame.value = (this.fullscreenMaterial.uniforms.frame.value + spp) % 65536\n\n\t\tthis.fullscreenMaterial.uniforms.cameraNear.value = this._camera.near\n\t\tthis.fullscreenMaterial.uniforms.cameraFar.value = this._camera.far\n\n\t\tthis.fullscreenMaterial.uniforms.projectionViewMatrix.value.multiplyMatrices(\n\t\t\tthis._camera.projectionMatrix,\n\t\t\tthis._camera.matrixWorldInverse\n\t\t)\n\n\t\tconst noiseTexture = this.fullscreenMaterial.uniforms.blueNoiseTexture.value\n\t\tif (noiseTexture) {\n\t\t\tconst { width, height } = noiseTexture.source.data\n\n\t\t\tthis.fullscreenMaterial.uniforms.blueNoiseRepeat.value.set(\n\t\t\t\tthis.renderTarget.width / width,\n\t\t\t\tthis.renderTarget.height / height\n\t\t\t)\n\t\t}\n\n\t\trenderer.setRenderTarget(this.renderTarget)\n\t\trenderer.render(this.scene, this.camera)\n\t}\n}\n\nexport { AOPass }\n","import { AOPass } from \"../ao/AOPass\"\nimport fragmentShader from \"./shader/ssao.frag\"\n\nclass SSAOPass extends AOPass {\n\tconstructor(camera, scene) {\n\t\tsuper(camera, scene, fragmentShader)\n\t}\n}\n\nexport { SSAOPass }\n","import { AOPass } from \"../ao/AOPass\"\n// eslint-disable-next-line camelcase\nimport hbao_utils from \"./shader/hbao_utils.glsl\"\nimport fragmentShader from \"./shader/hbao.frag\"\n\nconst finalFragmentShader = fragmentShader.replace(\"#include <hbao_utils>\", hbao_utils)\n\nclass HBAOPass extends AOPass {\n\tconstructor(camera, scene) {\n\t\tsuper(camera, scene, finalFragmentShader)\n\t}\n}\n\nexport { HBAOPass }\n","import { Pass } from \"postprocessing\"\nimport {\n\tHalfFloatType,\n\tNoColorSpace,\n\tMatrix4,\n\tNearestFilter,\n\tRepeatWrapping,\n\tShaderMaterial,\n\tTextureLoader,\n\tVector2,\n\tWebGLRenderTarget\n} from \"three\"\nimport blueNoiseImage from \"../utils/LDR_RGBA_0.png\"\nimport vertexShader from \"../utils/shader/basic.vert\"\nimport sampleBlueNoise from \"../utils/shader/sampleBlueNoise.glsl\"\nimport fragmentShader from \"./shader/poissionDenoise.frag\"\nimport { generateDenoiseSamples, generatePoissonDiskConstant } from \"./utils/PoissonUtils\"\n\nconst finalFragmentShader = fragmentShader.replace(\"#include <sampleBlueNoise>\", sampleBlueNoise)\n\nconst defaultPoissonBlurOptions = {\n\titerations: 1,\n\tradius: 8,\n\trings: 5.625,\n\tlumaPhi: 10,\n\tdepthPhi: 2,\n\tnormalPhi: 3.25,\n\tsamples: 16,\n\tnormalTexture: null\n}\n\nexport class PoissionDenoisePass extends Pass {\n\titerations = defaultPoissonBlurOptions.iterations\n\tindex = 0\n\n\tconstructor(camera, inputTexture, depthTexture, options = defaultPoissonBlurOptions) {\n\t\tsuper(\"PoissionBlurPass\")\n\n\t\toptions = { ...defaultPoissonBlurOptions, ...options }\n\n\t\tthis.inputTexture = inputTexture\n\n\t\tthis.fullscreenMaterial = new ShaderMaterial({\n\t\t\tfragmentShader: finalFragmentShader,\n\t\t\tvertexShader,\n\t\t\tuniforms: {\n\t\t\t\tdepthTexture: { value: null },\n\t\t\t\tinputTexture: { value: null },\n\t\t\t\tprojectionMatrixInverse: { value: new Matrix4() },\n\t\t\t\tcameraMatrixWorld: { value: new Matrix4() },\n\t\t\t\tlumaPhi: { value: 5.0 },\n\t\t\t\tdepthPhi: { value: 5.0 },\n\t\t\t\tnormalPhi: { value: 5.0 },\n\t\t\t\tresolution: { value: new Vector2() },\n\t\t\t\tblueNoiseTexture: { value: null },\n\t\t\t\tindex: { value: 0 },\n\t\t\t\tblueNoiseRepeat: { value: new Vector2() }\n\t\t\t}\n\t\t})\n\n\t\tconst renderTargetOptions = {\n\t\t\ttype: HalfFloatType,\n\t\t\tdepthBuffer: false\n\t\t}\n\n\t\tthis.renderTargetA = new WebGLRenderTarget(1, 1, renderTargetOptions)\n\t\tthis.renderTargetB = new WebGLRenderTarget(1, 1, renderTargetOptions)\n\n\t\tconst { uniforms } = this.fullscreenMaterial\n\n\t\tuniforms[\"inputTexture\"].value = this.inputTexture\n\t\tuniforms[\"depthTexture\"].value = depthTexture\n\t\tuniforms[\"projectionMatrixInverse\"].value = camera.projectionMatrixInverse\n\t\tuniforms[\"cameraMatrixWorld\"].value = camera.matrixWorld\n\t\tuniforms[\"depthPhi\"].value = options.depthPhi\n\t\tuniforms[\"normalPhi\"].value = options.normalPhi\n\n\t\tif (options.normalTexture) {\n\t\t\tuniforms[\"normalTexture\"] = { value : options.normalTexture }\n\t\t} else {\n\t\t\tthis.fullscreenMaterial.defines.NORMAL_IN_RGB = \"\"\n\t\t}\n\n\t\t// these properties need the shader to be recompiled\n\t\tfor (const prop of [\"radius\", \"rings\", \"samples\"]) {\n\t\t\tObject.defineProperty(this, prop, {\n\t\t\t\tget: () => options[prop],\n\t\t\t\tset: value => {\n\t\t\t\t\toptions[prop] = value\n\n\t\t\t\t\tthis.setSize(this.renderTargetA.width, this.renderTargetA.height)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tnew TextureLoader().load(blueNoiseImage, blueNoiseTexture => {\n\t\t\tblueNoiseTexture.minFilter = NearestFilter\n\t\t\tblueNoiseTexture.magFilter = NearestFilter\n\t\t\tblueNoiseTexture.wrapS = RepeatWrapping\n\t\t\tblueNoiseTexture.wrapT = RepeatWrapping\n\t\t\tblueNoiseTexture.colorSpace = NoColorSpace\n\n\t\t\tthis.fullscreenMaterial.uniforms.blueNoiseTexture.value = blueNoiseTexture\n\t\t})\n\t}\n\n\tsetSize(width, height) {\n\t\tthis.renderTargetA.setSize(width, height)\n\t\tthis.renderTargetB.setSize(width, height)\n\n\t\tthis.fullscreenMaterial.uniforms.resolution.value.set(width, height)\n\n\t\tconst poissonDisk = generateDenoiseSamples(\n\t\t\tthis.samples,\n\t\t\tthis.rings,\n\t\t\tthis.radius,\n\t\t\tnew Vector2(1 / width, 1 / height)\n\t\t)\n\n\t\tconst sampleDefine = `const int samples = ${this.samples};\\n`\n\n\t\tconst poissonDiskConstant = generatePoissonDiskConstant(poissonDisk)\n\n\t\tthis.fullscreenMaterial.fragmentShader = sampleDefine + poissonDiskConstant + \"\\n\" + finalFragmentShader\n\t\tthis.fullscreenMaterial.needsUpdate = true\n\t}\n\n\tget texture() {\n\t\treturn this.renderTargetB.texture\n\t}\n\n\trender(renderer) {\n\t\tthis.fullscreenMaterial.uniforms.index.value = 0\n\n\t\tconst noiseTexture = this.fullscreenMaterial.uniforms.blueNoiseTexture.value\n\t\tif (noiseTexture) {\n\t\t\tconst { width, height } = noiseTexture.source.data\n\n\t\t\tthis.fullscreenMaterial.uniforms.blueNoiseRepeat.value.set(\n\t\t\t\tthis.renderTargetA.width / width,\n\t\t\t\tthis.renderTargetA.height / height\n\t\t\t)\n\t\t}\n\n\t\tfor (let i = 0; i < 2 * this.iterations; i++) {\n\t\t\tconst horizontal = i % 2 === 0\n\n\t\t\tconst inputRenderTarget = horizontal ? this.renderTargetB : this.renderTargetA\n\t\t\tthis.fullscreenMaterial.uniforms[\"inputTexture\"].value = i === 0 ? this.inputTexture : inputRenderTarget.texture\n\n\t\t\tconst renderTarget = horizontal ? this.renderTargetA : this.renderTargetB\n\n\t\t\trenderer.setRenderTarget(renderTarget)\n\t\t\trenderer.render(this.scene, this.camera)\n\n\t\t\tthis.fullscreenMaterial.uniforms.index.value = (this.fullscreenMaterial.uniforms.index.value + 1) % 4\n\t\t}\n\t}\n}\n\nPoissionDenoisePass.DefaultOptions = defaultPoissonBlurOptions\n","import { Vector2 } from \"three\"\n\nexport function generateDenoiseSamples(numSamples, numRings, r, texelSize) {\n\tconst angleStep = (2 * Math.PI * numRings) / numSamples\n\tconst invNumSamples = 1.0 / numSamples\n\tconst radiusStep = invNumSamples\n\tconst samples = []\n\tlet radius = invNumSamples\n\tlet angle = 0\n\n\tfor (let i = 0; i < numSamples; i++) {\n\t\tconst v = new Vector2(Math.cos(angle), Math.sin(angle))\n\t\t\t.multiplyScalar(Math.pow(radius, 0.75))\n\t\t\t.multiply(texelSize)\n\t\t\t.multiplyScalar(r)\n\n\t\tsamples.push(v)\n\t\tradius += radiusStep\n\t\tangle += angleStep\n\t}\n\n\treturn samples\n}\n\nexport function generatePoissonDiskConstant(poissonDisk) {\n\tconst samples = poissonDisk.length\n\n\tlet glslCode = \"const vec2 poissonDisk[samples] = vec2[samples](\\n\"\n\n\tfor (let i = 0; i < samples; i++) {\n\t\tconst sample = poissonDisk[i]\n\t\tglslCode += ` vec2(${sample.x}, ${sample.y})`\n\n\t\tif (i < samples - 1) {\n\t\t\tglslCode += \",\"\n\t\t}\n\n\t\tglslCode += \"\\n\"\n\t}\n\n\tglslCode += \");\"\n\n\treturn glslCode\n}\n","import { Vector3 } from \"three\"\n\nexport function getPointsOnSphere(n) {\n\tconst points = []\n\tconst inc = Math.PI * (3 - Math.sqrt(5))\n\tconst off = 2 / n\n\n\tfor (let k = 0; k < n; k++) {\n\t\tconst y = k * off - 1 + off / 2\n\t\tconst r = Math.sqrt(1 - y * y)\n\t\tconst phi = k * inc\n\t\tpoints.push(new Vector3(Math.cos(phi) * r, y, Math.sin(phi) * r))\n\t}\n\n\treturn points\n}\n"],"names":["mergeAttributes","attributes","TypedArray","itemSize","normalized","gpuType","arrayLength","i","length","attribute","isInterleavedBufferAttribute","console","error","undefined","array","constructor","offset","set","result","BufferAttribute","toTrianglesDrawMode","geometry","drawMode","TrianglesDrawMode","warn","TriangleFanDrawMode","TriangleStripDrawMode","index","getIndex","indices","position","getAttribute","count","push","setIndex","numberOfTriangles","newIndices","getX","newGeometry","clone","clearGroups","GLTFLoader","Loader","[object Object]","manager","super","this","dracoLoader","ktx2Loader","meshoptDecoder","pluginCallbacks","register","parser","GLTFMaterialsClearcoatExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFTextureAVIFExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFLightsExtension","GLTFMeshoptCompression","GLTFMeshGpuInstancing","url","onLoad","onProgress","onError","scope","resourcePath","path","LoaderUtils","extractUrlBase","itemStart","_onError","e","itemError","itemEnd","loader","FileLoader","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","load","data","parse","gltf","Error","callback","indexOf","splice","json","extensions","plugins","textDecoder","TextDecoder","JSON","ArrayBuffer","decode","Uint8Array","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","content","asset","version","GLTFParser","crossOrigin","fileLoader","plugin","name","extensionsUsed","extensionName","extensionsRequired","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","Promise","resolve","reject","GLTFRegistry","objects","get","key","add","object","remove","removeAll","KHR_LIGHTS_PUNCTUAL","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_IOR","KHR_MATERIALS_SHEEN","KHR_MATERIALS_SPECULAR","KHR_MATERIALS_TRANSMISSION","KHR_MATERIALS_IRIDESCENCE","KHR_MATERIALS_ANISOTROPY","KHR_MATERIALS_VOLUME","KHR_TEXTURE_BASISU","KHR_MATERIALS_EMISSIVE_STRENGTH","EXT_TEXTURE_WEBP","EXT_TEXTURE_AVIF","EXT_MESHOPT_COMPRESSION","EXT_MESH_GPU_INSTANCING","cache","refs","uses","nodeDefs","nodes","nodeIndex","nodeLength","nodeDef","light","_addNodeRef","lightIndex","cacheKey","dependency","lightDef","lights","lightNode","color","Color","fromArray","range","type","DirectionalLight","target","PointLight","distance","SpotLight","spot","innerConeAngle","outerConeAngle","Math","PI","angle","penumbra","decay","assignExtrasToUserData","intensity","createUniqueName","_loadLight","self","then","_getNodeRef","MeshBasicMaterial","materialParams","materialDef","pending","opacity","metallicRoughness","pbrMetallicRoughness","Array","isArray","baseColorFactor","baseColorTexture","assignTexture","SRGBColorSpace","all","materialIndex","materials","emissiveStrength","emissiveIntensity","MeshPhysicalMaterial","extension","clearcoatFactor","clearcoat","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughness","clearcoatRoughnessTexture","clearcoatNormalTexture","scale","clearcoatNormalScale","Vector2","iridescenceFactor","iridescence","iridescenceTexture","iridescenceIor","iridescenceIOR","iridescenceThicknessRange","iridescenceThicknessMinimum","iridescenceThicknessMaximum","iridescenceThicknessTexture","sheenColor","sheenRoughness","sheen","sheenColorFactor","sheenRoughnessFactor","sheenColorTexture","sheenRoughnessTexture","transmissionFactor","transmission","transmissionTexture","thickness","thicknessFactor","thicknessTexture","attenuationDistance","Infinity","colorArray","attenuationColor","ior","specularIntensity","specularFactor","specularTexture","specularColorFactor","specularColor","specularColorTexture","anisotropyStrength","anisotropy","anisotropyRotation","anisotropyTexture","textureIndex","textureDef","textures","options","loadTextureImage","source","isSupported","images","textureLoader","uri","handler","getHandler","detectSupport","loadTexture","image","Image","src","onload","onerror","height","bufferView","bufferViews","extensionDef","buffer","getDependency","decoder","supported","res","byteOffset","byteLength","stride","byteStride","decodeGltfBufferAsync","mode","filter","ready","decodeGltfBuffer","mesh","meshDef","meshes","primitive","primitives","WEBGL_CONSTANTS","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","attributesDef","accessor","createNodeMesh","results","nodeObject","pop","isGroup","children","instancedMeshes","m","Matrix4","p","Vector3","q","Quaternion","s","instancedMesh","InstancedMesh","material","TRANSLATION","fromBufferAttribute","ROTATION","SCALE","setMatrixAt","compose","attributeName","setAttribute","Object3D","prototype","copy","call","assignFinalMaterial","clear","body","headerView","DataView","header","magic","slice","getUint32","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","preload","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","toLowerCase","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","decodeDracoFile","texture","transform","texCoord","channel","rotation","repeat","needsUpdate","GLTFCubicSplineInterpolant","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","values","valueSize","i1","t0","t","t1","stride2","stride3","td","pp","ppp","offset1","offset0","s2","s3","s0","s1","p0","m0","p1","m1","_q","GLTFCubicSplineQuaternionInterpolant","interpolate_","normalize","toArray","FLOAT","FLOAT_MAT3","FLOAT_MAT4","FLOAT_VEC2","FLOAT_VEC3","FLOAT_VEC4","LINEAR","REPEAT","SAMPLER_2D","POINTS","LINES","LINE_LOOP","LINE_STRIP","UNSIGNED_BYTE","UNSIGNED_SHORT","5120","Int8Array","5121","5122","Int16Array","5123","Uint16Array","5125","Uint32Array","5126","Float32Array","WEBGL_FILTERS","9728","NearestFilter","9729","LinearFilter","9984","NearestMipmapNearestFilter","9985","LinearMipmapNearestFilter","9986","NearestMipmapLinearFilter","9987","LinearMipmapLinearFilter","WEBGL_WRAPPINGS","33071","ClampToEdgeWrapping","33648","MirroredRepeatWrapping","10497","RepeatWrapping","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","TEXCOORD_2","TEXCOORD_3","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","weights","INTERPOLATION","CUBICSPLINE","InterpolateLinear","STEP","InterpolateDiscrete","addUnknownExtensionsToUserData","knownExtensions","objectDef","userData","gltfExtensions","gltfDef","extras","Object","assign","updateMorphTargets","il","morphTargetInfluences","targetNames","morphTargetDictionary","createPrimitiveKey","primitiveDef","geometryKey","dracoExtension","createAttributesKey","targets","attributesKey","keys","sort","getNormalizedComponentScale","_identityMatrix","associations","Map","primitiveCache","nodeCache","meshCache","cameraCache","lightCache","sourceCache","textureCache","nodeNamesUsed","isSafari","isFirefox","firefoxVersion","navigator","test","userAgent","match","createImageBitmap","TextureLoader","ImageBitmapLoader","setCrossOrigin","_invokeAll","ext","_markDefs","beforeRoot","getDependencies","dependencies","scene","scenes","animations","cameras","afterRoot","catch","skinDefs","skins","meshDefs","skinIndex","skinLength","joints","isBone","skin","isSkinnedMesh","camera","ref","updateMappings","original","mappings","child","entries","func","unshift","loadScene","_invokeOne","loadNode","loadMesh","loadAccessor","loadBufferView","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","map","def","bufferIndex","bufferDef","buffers","resolveURL","bufferViewDef","accessorIndex","sparse","pendingBufferViews","elementBytes","BYTES_PER_ELEMENT","itemBytes","bufferAttribute","ibSlice","floor","ibCacheKey","ib","InterleavedBuffer","InterleavedBufferAttribute","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","setX","setY","setZ","setW","sourceIndex","sourceDef","sampler","promise","loadImageSource","flipY","startsWith","samplers","magFilter","minFilter","wrapS","wrapT","URL","webkitURL","sourceURI","isObjectURL","blob","Blob","mimeType","createObjectURL","isImageBitmapLoader","imageBitmap","Texture","revokeObjectURL","search","mapName","mapDef","colorSpace","gltfReference","extendTexture","useDerivativeTangents","tangent","useVertexColors","useFlatShading","normal","isPoints","uuid","pointsMaterial","PointsMaterial","Material","sizeAttenuation","isLine","lineMaterial","LineBasicMaterial","cachedMaterial","vertexColors","flatShading","normalScale","y","MeshStandardMaterial","materialType","kmuExtension","getMaterialType","extendParams","metalness","metallicFactor","roughness","roughnessFactor","metallicRoughnessTexture","extendMaterialParams","doubleSided","side","DoubleSide","alphaMode","transparent","depthWrite","alphaTest","alphaCutoff","normalTexture","occlusionTexture","strength","aoMapIntensity","emissiveFactor","emissive","emissiveTexture","originalName","sanitizedName","PropertyBinding","sanitizeNodeName","createDracoPrimitive","decodePrimitive","addPrimitiveAttributes","cached","geometryPromise","BufferGeometry","meshIndex","depthTest","FrontSide","loadGeometries","geometries","SkinnedMesh","Mesh","normalizeSkinWeights","LineSegments","Line","LineLoop","Points","morphAttributes","group","Group","cameraIndex","cameraDef","params","PerspectiveCamera","MathUtils","radToDeg","yfov","aspectRatio","znear","zfar","OrthographicCamera","xmag","ymag","skinDef","_loadNodeShallow","inverseBindMatrices","jointNodes","bones","boneInverses","jointNode","mat","Skeleton","animationIndex","animationDef","animationName","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","node","input","parameters","output","inputAccessors","outputAccessors","tracks","inputAccessor","outputAccessor","updateMatrix","createdTracks","_createAnimationTracks","k","AnimationClip","traverse","o","isMesh","nodePending","childPending","childrenDef","skeletonPending","skeleton","bind","nodeName","meshPromise","createNodeAttachment","forEach","Bone","matrix","applyMatrix4","quaternion","has","sceneIndex","sceneDef","nodeIds","reducedAssociations","value","reduceAssociations","targetName","TypedKeyframeTrack","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","interpolation","outputArray","_getArrayFromAccessor","j","jl","track","_createCubicSplineTrackInterpolant","scaled","createInterpolant","times","getValueSize","isInterpolantFactoryMethodGLTFCubicSpline","assignAttributeAccessor","gltfAttributeName","box","Box3","min","max","boxScale","multiplyScalar","maxDisplacement","vector","abs","expandByVector","boundingBox","sphere","Sphere","getCenter","center","radius","distanceTo","boundingSphere","computeBounds","hasMorphPosition","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","morphPositions","morphNormals","morphColors","morphTargetsRelative","addMorphTargets","_taskCache","WeakMap","DRACOLoader","decoderPath","decoderConfig","decoderBinary","decoderPending","workerLimit","workerPool","workerNextTaskID","workerSourceURL","defaultAttributeIDs","uv","defaultAttributeTypes","config","attributeIDs","attributeTypes","vertexColorSpace","LinearSRGBColorSpace","taskConfig","useUniqueIDs","decodeGeometry","taskKey","stringify","cachedTask","worker","taskID","taskCost","geometryPending","_getWorker","_worker","_callbacks","postMessage","id","message","_createGeometry","_releaseTask","geometryData","_assignVertexColorSpace","inputColorSpace","_color","convertSRGBToLinear","setXYZ","r","g","b","responseType","_initDecoder","useJS","WebAssembly","librariesPending","_loadLibrary","libraries","jsContent","wasmBinary","fn","DRACOWorker","toString","substring","lastIndexOf","join","Worker","_taskCosts","_taskLoad","onmessage","a","terminate","decodeAttribute","draco","dracoGeometry","attributeType","numComponents","num_components","numValues","num_points","dataType","DT_FLOAT32","DT_INT8","DT_INT16","Int32Array","DT_INT32","DT_UINT8","DT_UINT16","DT_UINT32","getDracoDataType","ptr","_malloc","GetAttributeDataArrayForAllPoints","HEAPF32","_free","onModuleLoaded","DracoDecoderModule","module","Decoder","decodingStatus","geometryType","GetEncodedGeometryType","TRIANGULAR_MESH","DecodeArrayToMesh","POINT_CLOUD","PointCloud","DecodeArrayToPointCloud","ok","error_msg","attributeID","GetAttributeByUniqueId","GetAttributeId","GetAttribute","attributeResult","numIndices","num_faces","GetTrianglesUInt32Array","decodeIndex","destroy","attr","colorToString","forceCSSHex","colorFormat","__state","conversionName","round","h","toFixed","v","str","hex","ARR_EACH","ARR_SLICE","Common","BREAK","extend","each","arguments","obj","isObject","isUndefined","defaults","toCall","args","apply","itr","l","_key","defer","fnc","setTimeout","debounce","threshold","callImmediately","timeout","delayed","callNow","clearTimeout","isNull","isNaN","_isNaN","_x","isNumber","isString","isBoolean","isFunction","Function","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","space","parseInt","write","SIX_CHAR_HEX","CSS_RGB","parseFloat","CSS_RGBA","HEX","RGB_ARRAY","RGBA_ARRAY","RGBA_OBJ","RGB_OBJ","HSVA_OBJ","HSV_OBJ","toReturn","interpret","family","conversion","tmpComponent","ColorMath","hsv_to_rgb","hi","f","c","rgb_to_hsv","delta","NaN","rgb_to_hex","hex_with_component","component_from_hex","componentIndex","_typeof","Symbol","iterator","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","property","receiver","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","inherits","subClass","superClass","create","setPrototypeOf","__proto__","possibleConstructorReturn","ReferenceError","defineRGBComponent","component","componentHexIndex","recalculateRGB","defineHSVComponent","recalculateHSV","COMPONENTS","Controller","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP_INV","HTMLEvents","MouseEvents","KeyboardEvents","CSS_VALUE_PIXELS","cssValueToPixels","val","dom","makeSelectable","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","left","right","top","bottom","fakeEvent","eventType","pars","aux","className","evt","createEvent","clientX","x","clientY","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","bool","addEventListener","attachEvent","unbind","removeEventListener","detachEvent","addClass","classes","split","replace","removeClass","removeAttribute","hasClass","RegExp","getWidth","getComputedStyle","width","getHeight","getOffset","el","offsetParent","offsetLeft","offsetTop","isActive","activeElement","href","BooleanController","_Controller","_this2","_this","__prev","__checkbox","setValue","appendChild","checked","OptionController","opts","__select","element","opt","innerHTML","desiredValue","selectedIndex","StringController","onChange","__input","blur","numDecimals","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","_NumberController","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","decimals","tenTo","i2","o1","o2","NumberControllerSlider","preventDefault","bgRect","__background","getBoundingClientRect","onTouchMove","touches","onTouchEnd","__foreground","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","onBlur","valueField","fieldDown","setSV","fieldUpSV","fieldDownH","setH","fieldUpH","toOriginal","fieldRect","_ref","padding","backgroundColor","boxShadow","border","borderRadius","zIndex","borderRight","marginRight","display","cursor","background","linearGradient","cssText","outline","textAlign","fontWeight","textShadow","mismatch","flip","_flip","marginLeft","marginTop","toHexString","vendors","vendor","saveDialogContents","ControllerFactory","requestAnimationFrame$1","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","WebkitTransition","transition","hide","webkitTransform","layout","innerWidth","innerHeight","cssContent","indoc","doc","injected","head","getElementsByTagName","css","___$insertStyle","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","closeOnTop","autoPlace","DEFAULT_WIDTH","resizable","hideable","preset","scrollable","root","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","getRoot","gui","__preset_select","setPresetSelectIndex","revert","setWidth","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","addResizeHandle","getSaveObject","saveToLocalStorageIfPossible","newDom","liBefore","li","removeListeners","markPresetModified","modified","recallSavedValue","controller","matchedIndex","controllerMap","remembered","presetMap","_add","factoryArgs","concat","before","__li","container","CLASS_CONTROLLER_ROW","__gui","_options","nextSibling","nextElementSibling","_nextSibling","_name","firstElementChild","listen","method","pc","pb","returned","oldName","wasListening","newController","stopPropagation","borderLeftColor","isModified","augmentController","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","__save_row","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","newConstructorTextArea","which","show","focus","save","presetName","prompt","saveAs","pmouseX","drag","dragStop","CLASS_DRAG","dragStart","__resize_handle","w","getCurrentPreset","useInitialValues","savedValues","toggleHide","CLASS_TOO_TALL","_keydownHandler","addColor","removeChild","subfolder","removeFolder","addFolder","newGuiParams","folders","folder","parentElement","open","close","offsetHeight","remember","updateDisplays","controllerArray","GUI$1","ENV_HDR_256_FILE_NAME","exports","FontLoader","font","Font","isFont","size","shapes","paths","chars","from","resolution","line_height","yMax","yMin","underlineThickness","offsetX","offsetY","char","ret","createPath","createPaths","pl","toShapes","glyph","glyphs","familyName","ShapePath","cpx","cpy","cpx1","cpy1","cpx2","cpy2","_cachedOutline","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","ha","useGroups","isIndexed","attributesUsed","Set","morphAttributesUsed","mergedGeometry","attributesCount","addGroup","indexOffset","mergedIndex","mergedAttribute","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","durl","encodeURI","u8","u16","u32","fleb","fdeb","clim","freb","eb","start","_a","fl","revfl","fd","rev","hMap","cd","mb","co","le","rvb","sv","r_1","flt","fdt","flrm","fdrm","bits","d","bits16","et","unzlibSync","out","dat","buf","st","sl","noBuf","noSt","cbuf","bl","nbuf","final","pos","bt","lm","dm","lbt","dbt","n","tbts","subarray","hLit","hcLen","tl","ldt","clt","clb","clbmsk","clm","lt","dt","lms","dms","lpos","sym","dsym","end","slc","inflt","zlv","stream","EXRLoader","DataTextureLoader","HalfFloatType","logBase","getBitsReturn","lc","getBits","nBits","uInt8Array","inOffset","parseUint8Array","hufTableBuffer","hufLength","code","hufCode","getCharReturn","getChar","getCodeReturn","getCode","po","rlc","outBuffer","outBufferOffset","outBufferEndOffset","cs","UInt16","Int16","wdec14Return","wdec14","ls","hs","ai","as","bs","wdec16","bb","aa","wav2Decode","nx","ox","ny","oy","mx","w14","p2","py","ey","oy1","oy2","ox1","ox2","i00","i01","i10","i11","px","ex","p01","p10","p11","hufUncompress","inDataView","nCompressed","nRaw","initialInOffset","im","parseUint32","iM","freq","hdec","len","lit","hufClearDecTable","ni","hcode","zerun","nc","hufCanonicalCodeTable","hufUnpackEncTable","hdecod","plOffset","hufBuildDecTable","encodingTable","decodingTable","no","outOffset","inOffsetEnd","trunc","HUF_DECSIZE","hufDecode","predictor","interleaveScalar","t2","stop","decodeRunLength","reader","getInt8","getUint8","unRleAC","currAcComp","acBuffer","halfZigBlock","acValue","dctComp","dctInverse","cos","alpha","beta","theta","gamma","row","rowPtr","column","csc709Inverse","cb","cr","convertToHalf","dst","idx","DataUtils","toHalfFloat","float","sign","uncompressRAW","info","uncompressRLE","compressed","viewer","rawBuffer","tmpBuffer","uncompressZIP","fflate.unzlibSync","uncompressPIZ","scanlineBlockSize","bitmap","outBufferEnd","pizChannelData","lines","minNonZero","parseUint16","maxNonZero","parseUint8","lut","reverseLutFromBitmap","nData","applyLut","tmpOffset","cp","uncompressPXR","sz","tmpBufferEnd","writePtr","pixel","uncompressDWA","dwaHeader","parseInt64","unknownUncompressedSize","unknownCompressedSize","acCompressedSize","dcCompressedSize","rleCompressedSize","rleUncompressedSize","rleRawSize","totalAcUncompressedCount","totalDcUncompressedCount","acCompression","EXRHeader","compression","channelRules","ruleSize","parseNullTerminatedString","channelData","decoded","pixelType","pLinear","cscSet","rule","dcBuffer","rleBuffer","zlibInfo","rowOffsets","chan","rowPtrs","dataView","numFullBlocksX","numBlocksX","ceil","numBlocksY","leftoverX","leftoverY","currDcComp","dctData","rowBlock","comp","blocky","maxY","maxX","blockx","fill","decodeFloat16","setUint16","halfRow","getUint16","setFloat32","lossyDctDecode","rleOffset","rowOffsetBytes","byte","uintBuffer","endOffset","stringValue","parseInt32","Int32","getInt32","Uint32","Uint8","int","Number","getBigInt64","parseFloat32","getFloat32","decodeFloat32","binary","exponent","fraction","Uint16","parseFloat16","parseValue","parseFixedLengthString","startOffset","xSampling","ySampling","parseChlist","redX","redY","greenX","greenY","blueX","blueY","whiteX","whiteY","parseChromaticities","parseCompression","xMin","xMax","parseBox2i","parseLineOrder","parseV2f","parseV3f","parseRational","parseTimecode","bufferDataView","spec","singleTile","longName","deepFormat","multiPart","keepReading","attributeValue","parseHeader","EXRDecoder","outputType","dataWindow","bytesPerLine","inputSize","uncompress","format","FloatType","blockCount","outputChannels","byteArray","RGBAFormat","RedFormat","NoColorSpace","setupDecoder","channelOffsets","R","G","B","A","Y","scanlineBlockIdx","line","line_y","true_y","channelID","cOff","outIndex","texData","generateMipmaps","RGBELoader","rgbe_error","rgbe_error_code","msg","fgets","lineLimit","consume","chunk","String","fromCharCode","RGBEByteToRGBFloat","sourceArray","sourceOffset","destArray","destOffset","RGBEByteToRGBHalf","rgbe_header_info","gamma_re","exposure_re","format_re","dimensions_re","valid","string","comments","programtype","exposure","charAt","RGBE_ReadHeader","image_rgba_data","scanline_width","data_rgba","ptr_end","rgbeStart","scanline_buffer","num_scanlines","isEncodedRun","byteValue","off","RGBE_ReadPixels_RLE","numElements","floatArray","halfArray","_camera","_geometry","Float32BufferAttribute","FullScreenQuad","_mesh","dispose","renderer","render","CopyShader","uniforms","tDiffuse","vertexShader","fragmentShader","FXAAShader","isPass","enabled","needsSwap","renderToScreen","RectAreaLightHelper","computeBoundingSphere","fog","geometry2","BackSide","matrixWorld","extractRotation","copyPosition","dummyCamera","Camera","Pass","_Pass","Scene","screen","rtt","needsDepthTexture","fullscreenMaterial","mainScene","mainCamera","vertices","uvs","addAttribute","getFullscreenTriangle","frustumCulled","depthTexture","depthPacking","BasicDepthPacking8","inputBuffer","outputBuffer","deltaTime","stencilTest","frameBufferType","WebGLRenderTarget","AOPass","_scene","renderTarget","depthBuffer","finalFragmentShader","sampleBlueNoise","ShaderMaterial","cameraNear","cameraFar","viewMatrix","matrixWorldInverse","projectionViewMatrix","projectionMatrixInverse","cameraMatrixWorld","texSize","blueNoiseTexture","blueNoiseRepeat","aoDistance","distancePower","bias","power","frame","blending","NoBlending","toneMapped","blueNoiseImage","setSize","spp","defines","near","far","multiplyMatrices","projectionMatrix","noiseTexture","setRenderTarget","SSAOPass","HBAOPass","defaultPoissonBlurOptions","iterations","rings","lumaPhi","depthPhi","normalPhi","samples","PoissionDenoisePass","inputTexture","renderTargetOptions","renderTargetA","renderTargetB","NORMAL_IN_RGB","prop","poissonDisk","numSamples","numRings","texelSize","angleStep","invNumSamples","radiusStep","sin","multiply","generateDenoiseSamples","sampleDefine","poissonDiskConstant","glslCode","sample","generatePoissonDiskConstant","inputRenderTarget","DefaultOptions","points","inc","sqrt","phi"],"mappings":"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"}
|